| 
						
						
						
					 | 
				
				 | 
				
					@ -0,0 +1,67 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# coding: utf-8 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					import os, sys | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					from z3 import * | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# get the playground information | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					if len(sys.argv) != 2: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    print("Usage: python3 square.py <level-file>") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    sys.exit(0) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					with open(sys.argv[1]) as f: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    playground = f.read() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					rows = playground.strip().split("\n") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					playground = [[None if x == "_" else int(x) for x in r.split()] for r in rows] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# get the playground size | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					size_y = len(playground) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					assert(size_y != 0) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					size_x = len(playground[0]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					assert(size_x != 0) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					assert(size_x == size_y) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#################################### Square #################################### | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# create the solver | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					solver = Solver() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# todo: create an integer variable for each playground cell | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# hint: use something like the coordinates as part of the variable name | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					numbers = [[None for _j in range(size_x)] for _j in range(size_y)] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					for i in range(size_y): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for j in range(size_x): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        pass # ... replace this with your code ... | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# todo: assign each known number the corresponding value from playground | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					for i in range(size_y): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for j in range(size_x): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        pass # ... replace this with your code ... | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# todo: declare a variable for the sum of all columns, rows and diagonals | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# ... your code goes here ... | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# todo: enforce that each column sums up to the declared variable | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					for j in range(size_x): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    pass # ... replace this with your code ... | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# todo: enforce that each row sums up to the declared variable | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					for i in range(size_y): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    pass # ... replace this with your code ... | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# todo: enforce that both diagonals sum up to the declared variable | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# call the solver and check satisfiability | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					res = solver.check() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					if res != sat: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    print("unsat") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    sys.exit(1) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					# print the model | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					m = solver.model() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					for i in range(size_y): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    results = [] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for j in range(size_x): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        num = numbers[i][j] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        results.append("_" if num is None else m[num].as_long()) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    print(("%4s" * len(results)) % tuple(results)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					################################################################################ |