Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Nonogram Row by mortonfox
def generate_nonos(rowlen, clues):
if clues == []:
return ['X' * rowlen]
clue = clues[0]
rest_clues = clues[1:]
rest_len = len(rest_clues) + sum(rest_clues)
if clue + rest_len > rowlen:
return []
result = []
for i in range(rowlen - (clue + rest_len) + 1):
prefix = 'X' * i + 'O' * clue
if len(prefix) == rowlen:
result.append(prefix)
else:
result += [prefix + 'X' + nono for nono in generate_nonos(rowlen - len(prefix) - 1, rest_clues)]
return result
nono_match = lambda pattern, nono: all(a == '?' or a == b for a, b in zip(pattern, nono))
all_the_same = lambda l: l[0] if all(l[0] == elem for elem in l[1:]) else '?'
combine_nonos = lambda nonos: None if nonos == [] else ''.join(all_the_same(col) for col in zip(*nonos))
nonogram_row = lambda row_string, clue_numbers: combine_nonos([nono for nono in generate_nonos(len(row_string), clue_numbers) if nono_match(row_string, nono)])
if __name__ == '__main__':
assert nonogram_row('??????????', [8]) == '??OOOOOO??', 'Simple boxes_1'
assert nonogram_row('??????????', [4, 3]) == '??OO???O??', 'Simple boxes_2'
assert nonogram_row('???O????O?', [3, 1]) == 'X??O??XXOX', 'Simple spaces'
assert nonogram_row('????X?X???', [3, 2]) == '?OO?XXX?O?', 'Forcing'
assert nonogram_row('O?X?O?????', [1, 3]) == 'OXX?OO?XXX', 'Glue'
assert nonogram_row('??OO?OO???O?O??', [5, 2, 2]) == 'XXOOOOOXXOOXOOX', 'Joining and splitting'
assert nonogram_row('????OO????', [4]) == 'XX??OO??XX', 'Mercury'
assert nonogram_row('???X?', [0]) == 'XXXXX', 'Empty_1'
assert nonogram_row('?????', []) == 'XXXXX', 'Empty_2'
assert nonogram_row('??X??', [3]) is None, 'Wrong string'
print("Check done.")
April 17, 2018
Comments: