Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in 3rd party category for Cipher Crossword by rodka81
import numpy as np
from itertools import product
from collections import defaultdict
def find_words(crossword):
words = []
for row in crossword:
if 0 not in row:
words.append(row.tolist())
for column in crossword.T:
if 0 not in column:
words.append(column.tolist())
return words
def codes(words):
all_words = [code for w in words for code in w]
all_codes = set(all_words)
frequencies = {code: all_words.count(code) for code in all_codes}
return frequencies
def code_with_freq(dic, f):
return [key for key, value in dic.items() if value == f]
def checkio(crossword, words):
w = find_words(np.asarray(crossword))
if len(w) != len(words):
raise RuntimeError('Matrix and words have different cardinality')
fcode = codes(w)
fletter = codes(words)
if len(fcode) != len(fletter):
raise RuntimeError('Codes and letters have different cardinality')
fs = set(fcode.values())
combs = []
for f in fs:
combs.extend(list(product(code_with_freq(fletter, f), code_with_freq(fcode, f))))
possible_combs = defaultdict(list)
for letter, code in combs:
possible_combs[code].append(letter)
final_map = {}
for coded_word in list(w):
iterables = [possible_combs[code] for code in coded_word]
possible_words = [''.join(tup) for tup in product(*iterables)]
found = None
for word in words:
if word in possible_words:
found = word
if not found:
raise RuntimeError('Could not find coding')
for c, l in zip(coded_word, found):
final_map[c] = l
final_map[0] = ' '
result = []
for row in crossword:
result.append([final_map[c] for c in row])
return result
if __name__ == '__main__':
assert checkio(
[
[21, 6, 25, 25, 17],
[14, 0, 6, 0, 2],
[1, 11, 16, 1, 17],
[11, 0, 16, 0, 5],
[26, 3, 14, 20, 6]
],
['hello', 'habit', 'lemma', 'ozone', 'bimbo', 'trace']) == [['h', 'e', 'l', 'l', 'o'],
['a', ' ', 'e', ' ', 'z'],
['b', 'i', 'm', 'b', 'o'],
['i', ' ', 'm', ' ', 'n'],
['t', 'r', 'a', 'c', 'e']]
Jan. 3, 2017
Comments: