2025年8月13日水曜日

GPT-5(5)

GPT-5(4)からの続き

Q(koshix):
日本語のクロスワードパズルの盤面のデータを以下の見本のような形式で与えるものとします。数字はたてよこカギの番号,0は空白マス,-は黒マスを表わします。

{1,0,2,-,3,4,0}
{0,-,5,6,0,0,-}
{7,8,-,0,-,9,10}
{11,0,12,0,13,0,0}
{0,-,14,0,0,-,0}
{15,16,-,0,-,17,0}
{18,0,0,0,0,0,0}

これからタテのカギ,ヨコのカギの問題番号ごとの文字数を求めるpythonプログラムをつくってください。例では7x7の盤面になっていますが,プログラムでは一般的なnxnにして,例の回答を与えるように作ってください。

A(ChatGPT-5,思考時間1m23s):
了解。
以下の Python を使えば、任意の n×n 盤面(見本フォーマット)から ヨコ/タテの各番号の文字数を求められます。見本データを入れて実行すると、下の通りの結果が出ます。

from typing import List, Optional, Tuple

def parse_grid(text: str) -> List[List[Optional[int]]]:
    """
    入力形式:
      {1,0,2,-,3,4,0}
      {0,-,5,6,0,0,-}
      ...
    返り値: None=黒, 0=白(非番号), >0=番号 を格納した2次元配列
    """
    grid = []
    for raw in text.strip().splitlines():
        line = raw.strip()
        if line.startswith("{") and line.endswith("}"):
            line = line[1:-1]
        tokens = [t.strip() for t in line.split(",")]
        row = []
        for t in tokens:
            row.append(None if t == "-" else int(t))
        grid.append(row)
    n = len(grid)
    if any(len(r) != n for r in grid):
        raise ValueError("盤面は正方形 nxn である必要があります。")
    return grid

def compute_lengths(grid: List[List[Optional[int]]]) -> Tuple[list[tuple[int,int]], list[tuple[int,int]]]:
    """
    ヨコ/タテの各開始マス(番号>0)から、黒マス手前までを数える。
    戻り値: (across_list, down_list) いずれも (番号, 文字数) のリスト(番号昇順)
    """
    n = len(grid)
    def is_black(y, x): return grid[y][x] is None
    def is_white(y, x): return grid[y][x] is not None

    across, down = [], []
    for y in range(n):
        for x in range(n):
            cell = grid[y][x]
            if cell is None: 
                continue
            # ヨコの開始条件: 番号>0 かつ 左が境界または黒
            if cell > 0 and (x == 0 or is_black(y, x-1)):
                length, xx = 0, x
                while xx < n and is_white(y, xx):
                    length += 1; xx += 1
                across.append((cell, length))
            # タテの開始条件: 番号>0 かつ 上が境界または黒
            if cell > 0 and (y == 0 or is_black(y-1, x)):
                length, yy = 0, y
                while yy < n and is_white(yy, x):
                    length += 1; yy += 1
                down.append((cell, length))
    across.sort(key=lambda t: t[0])
    down.sort(key=lambda t: t[0])
    return across, down

# ---- 見本データ ----
grid_text = """\
{1,0,2,-,3,4,0}
{0,-,5,6,0,0,-}
{7,8,-,0,-,9,10}
{11,0,12,0,13,0,0}
{0,-,14,0,0,-,0}
{15,16,-,0,-,17,0}
{18,0,0,0,0,0,0}
"""

# 実行例
grid = parse_grid(grid_text)
across, down = compute_lengths(grid)
print("ヨコ:", across)
print("タテ:", down)

見本データでの出力(番号:文字数):
ヨコ: [(1,3), (3,3), (5,4), (7,2), (9,2), (11,7), (14,3), (15,2), (17,2), (18,7)]
タテ: [(1,7), (2,2), (3,2), (4,4), (6,6), (8,2), (10,5), (12,2), (13,2), (16,2), (17,2)]
仕様ポイント:
「番号>0」のマスを開始点として、左(ヨコ)/上(タテ)が黒 or 盤外のときにのみ数えます。
0 は“白だが開始でない”マス、- は黒マスとして扱います。
同じ番号がヨコとタテに両方出るのは当然OK(別系統で集計)。 

0 件のコメント: