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, Tupledef 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 griddef 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 Nonedef is_white(y, x): return grid[y][x] is not Noneacross, 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, xwhile xx < n and is_white(y, xx):length += 1; xx += 1across.append((cell, length))# タテの開始条件: 番号>0 かつ 上が境界または黒if cell > 0 and (y == 0 or is_black(y-1, x)):length, yy = 0, ywhile yy < n and is_white(yy, x):length += 1; yy += 1down.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 件のコメント:
コメントを投稿