solved part 2

This commit is contained in:
0x01fe 2024-12-07 15:20:38 -06:00
parent cf7714bcc6
commit 520aa782da
2 changed files with 78 additions and 65 deletions

View File

@ -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] = []

View File

@ -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