Initial commit
This commit is contained in:
commit
4f44c1442a
1 changed files with 72 additions and 0 deletions
72
main.py
Executable file
72
main.py
Executable file
|
@ -0,0 +1,72 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from itertools import combinations_with_replacement
|
||||||
|
|
||||||
|
|
||||||
|
def row_solutions(width, pattern):
|
||||||
|
"""
|
||||||
|
This yields a tuple for each possible layout of
|
||||||
|
pattern inside the row. The tuple elements are the
|
||||||
|
amount of cells that must be inserted before each
|
||||||
|
block in pattern. The tuple doesn't include the
|
||||||
|
number of cells at the end of the row since that's
|
||||||
|
just: width - sum(sol) - sum(pattern)
|
||||||
|
"""
|
||||||
|
spaces = width - (sum(pattern) + len(pattern) - 1)
|
||||||
|
for sol in combinations_with_replacement(range(spaces + 1), len(pattern)):
|
||||||
|
sol = sol[0:1] + tuple((sol[i] - sol[i-1] + 1) for i in range(1,len(sol)))
|
||||||
|
yield sol
|
||||||
|
|
||||||
|
def expand_solution(solution, width, pattern):
|
||||||
|
"""
|
||||||
|
expands a solution to a tuple of 1 (ON) and 0 (OFF)
|
||||||
|
"""
|
||||||
|
r = []
|
||||||
|
for s,p in zip(solution, pattern):
|
||||||
|
r.extend([0] * s)
|
||||||
|
r.extend([1] * p)
|
||||||
|
r.extend([0] * (width - sum(solution) - sum(pattern)))
|
||||||
|
return tuple(r)
|
||||||
|
|
||||||
|
|
||||||
|
def matches(expanded_solution, constraints):
|
||||||
|
"""
|
||||||
|
solution is a tuple of spaces, the output of row_solutions
|
||||||
|
constraints is a tuple of values from 1, 0 and -1, that
|
||||||
|
mean:
|
||||||
|
0 -> OFF
|
||||||
|
1 -> ON
|
||||||
|
-1 -> not constrained
|
||||||
|
"""
|
||||||
|
for s,c in zip(expanded_solution, constraints):
|
||||||
|
if c == -1:
|
||||||
|
continue
|
||||||
|
if c != s:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def draw(solution, width, pattern):
|
||||||
|
for s,p in zip(solution, pattern):
|
||||||
|
print('.' * s, end="")
|
||||||
|
print('\N{FULL BLOCK}' * p, end="")
|
||||||
|
print('.' * (width - sum(solution) - sum(pattern)))
|
||||||
|
|
||||||
|
width = int(sys.argv[1])
|
||||||
|
pattern = tuple(int(x) for x in sys.argv[2].split())
|
||||||
|
constraints = [-1] * width
|
||||||
|
try:
|
||||||
|
for i,c in enumerate(sys.argv[3]):
|
||||||
|
constraints[i]= {'1':1, '0':0, '?':-1}[c]
|
||||||
|
except:
|
||||||
|
print(sys.exc_info())
|
||||||
|
constraints = [-1] * width
|
||||||
|
|
||||||
|
for solution in row_solutions(width, pattern):
|
||||||
|
e = expand_solution(solution, width, pattern)
|
||||||
|
if matches(e, constraints):
|
||||||
|
draw(solution, width, pattern)
|
Loading…
Reference in a new issue