solved part 2
This commit is contained in:
parent
cf7714bcc6
commit
520aa782da
@ -1,8 +1,30 @@
|
|||||||
import re
|
with open('input.text', 'r') as file:
|
||||||
|
|
||||||
with open('test.text', 'r') as file:
|
|
||||||
data: list[str] = file.readlines()
|
data: list[str] = file.readlines()
|
||||||
|
|
||||||
|
class Operator:
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Add(Operator):
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def compute(self, x: int, y: int) -> int:
|
||||||
|
return x + y
|
||||||
|
|
||||||
|
class Multiply(Operator):
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def compute(self, x: int, y: int) -> int:
|
||||||
|
return x * y
|
||||||
|
|
||||||
|
class Concat(Operator):
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def compute(self, x: int, y: int) -> int:
|
||||||
|
return int(str(x) + str(y))
|
||||||
|
|
||||||
class Equation:
|
class Equation:
|
||||||
result: int
|
result: int
|
||||||
@ -12,77 +34,60 @@ class Equation:
|
|||||||
self.result = result
|
self.result = result
|
||||||
self.constants = constants
|
self.constants = constants
|
||||||
|
|
||||||
def is_valid_eq(self, eq: str) -> bool:
|
def is_valid_eq(self, eq: list[int | Operator]) -> bool:
|
||||||
tokens: list[str] = re.findall('\d+|\+|\*', eq)
|
|
||||||
|
|
||||||
r = None
|
r = None
|
||||||
op = lambda x,y: x + y
|
for i, token in enumerate(eq):
|
||||||
for token in tokens:
|
match token:
|
||||||
if not r and token.isnumeric():
|
case Operator():
|
||||||
r = int(token)
|
r = token.compute(r, eq[i + 1])
|
||||||
elif token == '+':
|
case int():
|
||||||
op = lambda x,y: x + y
|
if not r:
|
||||||
elif token == '*':
|
r = token
|
||||||
op = lambda x,y: x * y
|
|
||||||
else:
|
|
||||||
r = op(r, int(token))
|
|
||||||
|
|
||||||
|
|
||||||
return r == self.result
|
return r == self.result
|
||||||
|
|
||||||
def is_valid(self, s: str | None) -> bool:
|
def is_valid(self, eq: list[int | Operator]) -> bool:
|
||||||
if s == None:
|
if not eq:
|
||||||
s = ''
|
eq = []
|
||||||
for c in self.constants:
|
for c in self.constants:
|
||||||
s += (str(c) + ' ')
|
eq.append(c)
|
||||||
return self.is_valid(s[:-1])
|
eq.append(' ')
|
||||||
elif ' ' in s:
|
eq = eq[:-1]
|
||||||
s1 = s.replace(' ', '+', 1)
|
|
||||||
s2 = s.replace(' ', '*', 1)
|
for i, c in enumerate(eq):
|
||||||
return self.is_valid(s1) or self.is_valid(s2)
|
if c == ' ':
|
||||||
else:
|
new_eq1 = eq.copy()
|
||||||
return self.is_valid_eq(s)
|
new_eq2 = eq.copy()
|
||||||
|
|
||||||
def is_valid2(self, s: str | None) -> bool:
|
new_eq1[i] = Add()
|
||||||
if s == None:
|
new_eq2[i] = Multiply()
|
||||||
s = ''
|
|
||||||
|
return self.is_valid(new_eq1) or self.is_valid(new_eq2)
|
||||||
|
|
||||||
|
return self.is_valid_eq(eq)
|
||||||
|
|
||||||
|
def is_valid2(self, eq: list[int | Operator]) -> bool:
|
||||||
|
if not eq:
|
||||||
|
eq = []
|
||||||
for c in self.constants:
|
for c in self.constants:
|
||||||
s += (str(c) + ' ')
|
eq.append(c)
|
||||||
return self.is_valid2(s[:-1])
|
eq.append(' ')
|
||||||
elif ' ' in s:
|
eq = eq[:-1]
|
||||||
s1 = s.replace(' ', '+', 1)
|
|
||||||
s2 = s.replace(' ', '*', 1)
|
|
||||||
|
|
||||||
# We do the || operator right here
|
for i, c in enumerate(eq):
|
||||||
if s.count(' ') >= 1:
|
if c == ' ':
|
||||||
tokens: list[str] = re.findall('\d+|\+|\*| ', s)
|
new_eq1 = eq.copy()
|
||||||
space_i = tokens.index(' ')
|
new_eq2 = eq.copy()
|
||||||
|
new_eq3 = eq.copy()
|
||||||
|
|
||||||
new_num = tokens[space_i - 1].strip() + tokens[space_i + 1].strip()
|
new_eq1[i] = Add()
|
||||||
new_tokens = tokens[:space_i - 1]
|
new_eq2[i] = Multiply()
|
||||||
new_i = len(new_tokens)
|
new_eq3[i] = Concat()
|
||||||
new_tokens.append(new_num)
|
|
||||||
new_tokens.extend(tokens[space_i + 2:])
|
|
||||||
s3 = ''
|
|
||||||
print(new_tokens)
|
|
||||||
for i, token in enumerate(new_tokens):
|
|
||||||
if token == ' ':
|
|
||||||
continue
|
|
||||||
if i > new_i - 1:
|
|
||||||
s3 += (token + ' ')
|
|
||||||
else:
|
|
||||||
s3 += token
|
|
||||||
|
|
||||||
print(s)
|
return self.is_valid2(new_eq1) or self.is_valid2(new_eq2) or self.is_valid2(new_eq3)
|
||||||
print(s3)
|
|
||||||
# exit()
|
|
||||||
|
|
||||||
return self.is_valid2(s1) or self.is_valid2(s2) or self.is_valid2(s3[:-1])
|
|
||||||
else:
|
|
||||||
return self.is_valid2(s1) or self.is_valid2(s2)
|
|
||||||
else:
|
|
||||||
return self.is_valid_eq(s)
|
|
||||||
|
|
||||||
|
return self.is_valid_eq(eq)
|
||||||
|
|
||||||
equations: list[Equation] = []
|
equations: list[Equation] = []
|
||||||
|
|
||||||
|
|||||||
@ -1 +1,9 @@
|
|||||||
7290: 6 8 6 15
|
190: 10 19
|
||||||
|
3267: 81 40 27
|
||||||
|
83: 17 5
|
||||||
|
156: 15 6
|
||||||
|
7290: 6 8 6 15
|
||||||
|
161011: 16 10 13
|
||||||
|
192: 17 8 14
|
||||||
|
21037: 9 7 18 13
|
||||||
|
292: 11 6 16 20
|
||||||
Loading…
x
Reference in New Issue
Block a user