Solving the board...
This commit is contained in:
parent
70ac0f773f
commit
354e05db14
1 changed files with 105 additions and 27 deletions
106
main.py
106
main.py
|
@ -1,6 +1,9 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
"This module does something"
|
||||
|
||||
from itertools import combinations_with_replacement
|
||||
import sys
|
||||
|
||||
|
||||
def solve1(width, pattern):
|
||||
|
@ -79,12 +82,79 @@ def solve2(width, pattern, constraints=None):
|
|||
for s in solve2(subwidth, subpattern, subconstraints):
|
||||
yield (gap, s[0]+1) + s[1:]
|
||||
|
||||
def invariants(width, pattern, constraints=None):
|
||||
"compute invariants"
|
||||
invs = []
|
||||
for sol in solve2(width, pattern, constraints):
|
||||
exp = list(expand_solution(sol, width, pattern))
|
||||
count += 1
|
||||
if len(invs) == 0:
|
||||
invs = exp
|
||||
else:
|
||||
for i, e in enumerate(exp):
|
||||
if invs[i] != e:
|
||||
invs[i] = -1
|
||||
return count, invs
|
||||
|
||||
def visual(constraints):
|
||||
"returns a visual representation of constraints"
|
||||
return "".join({1:'\N{LEFT SEVEN EIGHTHS BLOCK}', 0:'.', -1:'?'}[x] for x in constraints)
|
||||
|
||||
class Board:
|
||||
"""Board
|
||||
|
||||
A board is actually a list of constraints.
|
||||
A cell with 1 or 0 is fixed. A cell with -1
|
||||
doesn't have a known value yet.
|
||||
"""
|
||||
|
||||
def __init__(self, patterns):
|
||||
self.col_patterns = patterns[0]
|
||||
self.row_patterns = patterns[1]
|
||||
self.width = len(patterns[0])
|
||||
self.height = len(patterns[1])
|
||||
self.rows = [None] * self.height
|
||||
for i in range(self.height):
|
||||
self.rows[i] = [-1] * self.width
|
||||
|
||||
print("rows:")
|
||||
for y in range(self.height):
|
||||
n, c = invariants(self.width, self.row_patterns[y])
|
||||
print(n, self.row_patterns[y], visual(c))
|
||||
|
||||
print("cols:")
|
||||
for x in range(self.height):
|
||||
n, c = invariants(self.width, self.col_patterns[x])
|
||||
print(n, self.col_patterns[x], visual(c))
|
||||
|
||||
print(self.row(0))
|
||||
|
||||
def col(self, i):
|
||||
"""a column"""
|
||||
return [self.rows[x][i] for x in range(self.height)]
|
||||
|
||||
def row(self, i):
|
||||
"""a row"""
|
||||
return self.rows[i]
|
||||
|
||||
def solve(self):
|
||||
min_row_index = 0
|
||||
min_row_count = 0
|
||||
for y in range(self.height):
|
||||
count = 0
|
||||
for sol in solve2(self.width, self.row_patterns[y], self.row(y)):
|
||||
count += 1
|
||||
if count < min_row_count:
|
||||
min_row_count = count
|
||||
min_row_index = y
|
||||
|
||||
|
||||
pass
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
import sys
|
||||
|
||||
def draw(solution, width, pattern):
|
||||
"draws a solution"
|
||||
for s, p in zip(solution, pattern):
|
||||
print('.' * s, end="")
|
||||
print('\N{LEFT SEVEN EIGHTHS BLOCK}' * p, end="")
|
||||
|
@ -104,16 +174,24 @@ if __name__ == "__main__":
|
|||
# if matches(e, constraints):
|
||||
# draw(solution, width, pattern)
|
||||
|
||||
fixed = []
|
||||
for sol in solve2(width, pattern, constraints):
|
||||
exp = list(expand_solution(sol, width, pattern))
|
||||
if len(fixed) == 0:
|
||||
fixed = exp
|
||||
else:
|
||||
for i,e in enumerate(exp):
|
||||
if fixed[i] != e:
|
||||
fixed[i] = -1
|
||||
draw(sol, width, pattern)
|
||||
def parse(rows):
|
||||
"parses '1 1, 1 2 3' into [[1, 1], [1, 2, 3]]"
|
||||
rows = rows.split(",")
|
||||
rows = [[int(y) for y in x.strip().split()] for x in rows]
|
||||
return rows
|
||||
|
||||
|
||||
b = Board((
|
||||
parse("""1 1 1 1 1, 1 1 1, 1 1 1 1, 1 2, 1 1 1 1, 1 1 1, 1 1 1,
|
||||
3 1, 1 1, 1 2 6 1, 2 1, 2 3 1, 1 1, 1 1 3 1, 2 1 1"""),
|
||||
parse("""1 2, 1 1 2, 2 1 1 1 1, 3 1, 1 1 1 1, 1 2 1, 1, 1 1 1 2,
|
||||
2 2 1 1, 1 1 1 1 1, 1 2 2, 2 2, 1 1 1 1 1, 1 1 1 1, 1 1""")
|
||||
))
|
||||
|
||||
# c = Board((
|
||||
# parse("""1 5 2, 1 1 2, 1 1 2 1 2, 2 2, 2 1 1 1, 1 1 1, 1 1, 1 1 1, 2 3 1 1,
|
||||
# 1 2 3 1 1, 1 3 1 1, 2 1 1 1, 1 1 1 2 1, 1 1 1 2 1, 2 1"""),
|
||||
# parse("""1 2 1 1, 1 1 4, 2 1, 1 1 1 1 2, 1 3 1 1, 1 2, 1 1 1 1 1 1,
|
||||
# 1 1 1 1 1 2, 1 1 2, 1 2 1 1, 3 1 4, 1 4 1, 3, 3 1 1, 1 2 1""")
|
||||
# ))
|
||||
|
||||
print("invariants:")
|
||||
print("".join({1:'\N{LEFT SEVEN EIGHTHS BLOCK}',0:'.',-1:'?'}[x] for x in fixed))
|
||||
|
|
Loading…
Reference in a new issue