-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcage.py
More file actions
73 lines (52 loc) · 2.17 KB
/
cage.py
File metadata and controls
73 lines (52 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from typing import List, Tuple
from functools import reduce
class Cage:
def __init__(self, operator: str, goal: int, squares: List[Tuple[int,int]]) -> None:
self.operator = operator
self.goal = goal
self.squares = squares #squares are stored as row_i, col_i
def getValue(self, data: List[List[int]], coords: Tuple[int, int]) -> int: #coords is row_i, col_i
return data[coords[0]][coords[1]]
def isFull(self, data: List[List[int]]) -> bool:
for square in self.squares:
if self.getValue(data, square) == 0:
return False
return True
def isValid(self, data) -> bool:
if self.isFull(data):
return self.verify(data)
return True
def verify(self, data) -> bool:
if self.operator == "g":
if len(self.squares) > 1:
return False
else:
return self.getValue(data, self.squares[0]) == self.goal
if self.operator == "+":
return self.sum(data) == self.goal
if self.operator == "*":
return self.product(data) == self.goal
if self.operator == "-":
if len(self.squares) != 2:
return False
else:
diff = abs(self.getValue(data, self.squares[0]) - self.getValue(data, self.squares[1]))
return diff == self.goal
if self.operator == "/":
if len(self.squares) != 2:
return False
else:
v0 = self.getValue(data, self.squares[0])
v1 = self.getValue(data, self.squares[1])
if v0 == 0 or v1 == 0:
return 0
q = max(v0 / v1, v1/v0)
return q == self.goal
def sum(self, data) -> int:
return reduce((lambda x, y: x + y),
[self.getValue(data, s) for s in self.squares])
def product(self, data) -> int:
return reduce((lambda x, y: x * y),
[self.getValue(data, s) for s in self.squares])
def display(self) -> None:
print(f"Cage with op {self.operator} and goal {self.goal} containing {self.squares}")