Pella86

Relictum solver

Jan 18th, 2018
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.49 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Thu Jan 18 00:56:57 2018
  4.  
  5. @author: Mauro
  6. """
  7.  
  8. class Mat:
  9.    
  10.     def __init__(self):
  11.         self.size = 5
  12.         self.values = []
  13.        
  14.         for x in range(self.size):
  15.             for y in range(self.size):
  16.                 self.values.append(0)
  17.    
  18.         self.setxy(0, 0, 1)
  19.         self.setxy(2, 0, 2)
  20.         self.setxy(4, 0, 3)
  21.         self.setxy(1, 4, 3)
  22.         self.setxy(3, 4, 4)
  23.        
  24.         shape0 = [(0, 0), (1, 0), (2, 0), (0, 1), (1, 1)]
  25.         shape1 = [(3, 0), (4, 0), (3, 1), (4, 1), (4, 2)]
  26.         shape2 = [(3, 3), (4, 3), (2, 4), (3, 4), (4, 4)]
  27.         shape3 = [(0, 2), (0, 3), (1, 3), (0, 4), (1, 4)]
  28.         shape4 = [(2, 1), (1, 2), (2, 2), (3, 2), (2, 3)]        
  29.        
  30.         self.shapes = []
  31.         self.shapes.append(shape0)
  32.         self.shapes.append(shape1)
  33.         self.shapes.append(shape2)
  34.         self.shapes.append(shape3)
  35.         self.shapes.append(shape4)
  36.    
  37.     def get_shape_values(self, shapen):
  38.         res = []
  39.         for e in self.shapes[shapen]:
  40.             res.append(self.getxy(e[0], e[1]))
  41.         return res
  42.    
  43.     def get_shape_values_xy(self, x, y):
  44.         for i, shape in enumerate(self.shapes):
  45.             if (x, y) in shape:
  46.                 return self.get_shape_values(i)
  47.            
  48.     def get_line_values_xy(self, ix, y):
  49.         ret = []
  50.         for x in range(self.size):
  51.             ret.append(self.getxy(x, y))
  52.         return ret
  53.    
  54.     def get_column_values_xy(self, x, iy):
  55.         ret = []
  56.         for y in range(self.size):
  57.             ret.append(self.getxy(x, y))
  58.         return ret        
  59.        
  60.     def getxy(self, x, y):
  61.         return self.values[x * self.size + y]
  62.    
  63.     def setxy(self, x, y, v):
  64.         self.values[x * self.size + y] = v
  65.        
  66.    
  67.     def __str__(self):
  68.         s = ''
  69.         for x in range(self.size):
  70.             for y in range(self.size):
  71.                 s+= str(self.getxy(y, x)) + ' '
  72.             s += '\n'
  73.         return s
  74.            
  75.  
  76. m = Mat()
  77.  
  78. print(m)
  79.  
  80. m.setxy(3, 1, 2)
  81. m.setxy(4, 1, 1)
  82. #m.setxy(1, 1, 1)
  83. m.setxy(1, 0, 4)
  84. m.setxy(1, 1, 5)
  85. m.setxy(0, 1, 3)
  86. m.setxy(2, 1, 4)
  87. m.setxy(4, 4, 5)
  88. m.setxy(0, 4, 2)
  89. m.setxy(1, 3, 1)
  90. m.setxy(1, 2, 2)
  91. m.setxy(2, 4, 1)
  92. m.setxy(3, 0, 5)
  93. m.setxy(3, 3, 3)
  94. m.setxy(2, 3, 5)
  95. m.setxy(0, 3, 4)
  96. m.setxy(0, 2, 5)
  97. m.setxy(2, 2, 3)
  98. m.setxy(3, 2, 1)
  99. m.setxy(4, 2, 4)
  100.  
  101.  
  102.  
  103.  
  104.  
  105. def solve_step(mat):
  106.     candidates = []
  107.     for x in range(mat.size):
  108.         for y in range(mat.size):
  109.             # skip if is already full
  110.             if mat.getxy(x,y) != 0:
  111.                 pass
  112.                 #print('position:', x, y, 'already occupied:', mat.getxy(x,y))
  113.             else:
  114.                 #print('position free')
  115.                 n = []
  116.                 n += [v for v in mat.get_shape_values_xy(x,y) if v != 0 and v not in n]
  117.                 n += [v for v in mat.get_line_values_xy(x,y) if v != 0 and v not in n]
  118.                 n += [v for v in mat.get_column_values_xy(x,y) if v != 0 and v not in n]
  119.                
  120.                 if len(n) == 4:
  121.                     #print("we have a candidate")
  122.                     candidates.append((x, y, list(set([1, 2, 3, 4, 5]) -  set(n))[0]))
  123.                    
  124.     return candidates
  125.    
  126. candidates = [0]
  127. while len(candidates) == 1:
  128.     candidates = solve_step(m)
  129.     print(candidates)
  130.     c = candidates[0]
  131.     m.setxy(c[0], c[1], c[2])
  132.     print(m)
Advertisement
Add Comment
Please, Sign In to add comment