# Solve the puzzle | |
if s.check() == sat: | |
m = s.model() | |
rows = [] | |
header = ["House"] + [cat_name for cat_name, _ in categories] | |
for position in range(1, NUM_POSITIONS + 1): | |
row = [str(position)] | |
for cat_idx, (cat_name, item_list) in enumerate(categories): | |
for item_idx, item_str in enumerate(item_list): | |
if m.evaluate(Vars[cat_idx][item_idx]).as_long() == position: | |
row.append(item_str) | |
break | |
rows.append(row) | |
result_dict = {"header": header, "rows": rows} | |
cnt = 1 | |
block = [] | |
for cat_idx, (cat_name, item_list) in enumerate(categories): | |
for i in range(NUM_POSITIONS): | |
block.append(Vars[cat_idx][i] != m[Vars[cat_idx][i]]) | |
s.add(Or(block)) | |
while s.check() == sat: | |
m = s.model() | |
cnt += 1 | |
block = [] | |
for cat_idx, (cat_name, item_list) in enumerate(categories): | |
for i in range(NUM_POSITIONS): | |
block.append(Vars[cat_idx][i] != m[Vars[cat_idx][i]]) | |
s.add(Or(block)) | |
print(f"sat:{cnt}") | |
else: | |
print(f"error") |