Spaces:
Running
Running
from Utils_inf import clean | |
class Crossword: | |
def __init__(self, data): | |
self.initialize_grids(grid=data["grid"]) | |
self.initialize_clues(clues=data["clues"]) | |
self.initialize_variables() | |
def initialize_grids(self, grid): | |
self.letter_grid = [[grid[j][i][1] if type(grid[j][i]) == list else "" for i in | |
range(len(grid[0]))] for j in range(len(grid))] | |
self.number_grid = [[grid[j][i][0] if type(grid[j][i]) == list else "" for i in | |
range(len(grid[0]))] for j in range(len(grid))] | |
self.grid_cells = {} | |
def initialize_clues(self, clues): | |
self.across = clues["across"] | |
self.down = clues["down"] | |
def initialize_variable(self, position, clues, across=True): | |
row, col = position | |
cell_number = self.number_grid[row][col] | |
assert cell_number in clues, print("Missing clue") | |
word_id = cell_number + "A" if across else cell_number + "D" | |
clue = clean(clues[cell_number][0]) | |
answer = clean(clues[cell_number][1]) | |
for idx in range(len(answer)): | |
cell = (row, col + idx) if across else (row + idx, col) | |
if cell in self.grid_cells: | |
self.grid_cells[cell].append(word_id) | |
else: | |
self.grid_cells[cell] = [word_id] | |
if word_id in self.variables: | |
self.variables[word_id]["cells"].append(cell) | |
else: | |
self.variables[word_id] = {"clue": clue, "gold": answer, "cells": [cell], "crossing": []} | |
def initialize_crossing(self): | |
for word_id in self.variables: | |
cells = self.variables[word_id]["cells"] | |
crossing_ids = [] | |
for cell in cells: | |
crossing_ids += list(filter(lambda x: x!= word_id, self.grid_cells[cell])) | |
self.variables[word_id]["crossing"] = crossing_ids | |
def initialize_variables(self): | |
self.variables = {} | |
for row in range(len(self.number_grid)): | |
for col in range(len(self.number_grid[0])): | |
cell_number = self.number_grid[row][col] | |
if self.number_grid[row][col] != "": | |
if cell_number in self.across: | |
self.initialize_variable((row, col), self.across, across=True) | |
if cell_number in self.down: | |
self.initialize_variable((row, col), self.down, across=False) | |
self.initialize_crossing() |