import random import time COLS = 6 ROWS = 6 def words(*lengths: int): with open('slowa.txt', 'r') as f: while True: line = f.readline().strip() if not line: return if len(line) in lengths: yield line wordsr = {} wordsc = {} print('parsing words') for word in words(ROWS): x = wordsr for i, c in enumerate(word): y = x.setdefault(c, {}) x = y if ROWS == COLS: wordsc = wordsr else: for word in words(COLS): x = wordsc for i, c in enumerate(word): y = x.setdefault(c, {}) x = y m = {(x, y): '.' for x in range(COLS) for y in range(ROWS)} for x, c in enumerate('dejkun'): m[(x, 0)] = c def printm(m): out = '' for y in range(ROWS): for x in range(COLS): out += m[x, y] out += '\n' print(out) def mcp(m, x, y, c): mm = m.copy() mm[x, y] = c return mm def matches(m, x, y): nlc = wordsc nlr = wordsr for xx in range(x): nlc = nlc.get(m[xx, y], {}) for yy in range(y): nlr = nlr.get(m[x, yy], {}) return [mcp(m, x, y, c) for c in set(nlc) & set(nlr)] print('searching') start = time.perf_counter() ms = [m] for y in range(ROWS - 1): for x in range(COLS): print(x, y) ms = sum([matches(z, x, y + 1) for z in ms], []) random.shuffle(ms) ms = ms[:3000] print(len(ms)) for q in ms: printm(q) print(len(ms)) print(f'{time.perf_counter() - start:.2f} s')