Skip to content

Commit fe1c0bb

Browse files
committed
Day 24
oof
1 parent a52049b commit fe1c0bb

File tree

6 files changed

+468
-0
lines changed

6 files changed

+468
-0
lines changed

day_24/__init__.py

Whitespace-only changes.

day_24/day_24.py

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
import sys
2+
from typing import TextIO
3+
from sly import Lexer, Parser
4+
from collections import defaultdict
5+
import functools
6+
import itertools
7+
import copy
8+
9+
class CalcLexer(Lexer):
10+
tokens = { NAME, NUMBER, INPUT, ADD, MULTIPLY, DIVIDE, MODULO, EQUAL }
11+
ignore = ' \t;'
12+
# literals = { ';' }
13+
14+
# Tokens
15+
NAME = r'[wxyz]'
16+
NUMBER = r'-?\d+'
17+
INPUT = r'inp'
18+
ADD = r'add'
19+
MULTIPLY = r'mul'
20+
DIVIDE = r'div'
21+
MODULO = r'mod'
22+
EQUAL = r'eql'
23+
24+
# Ignored pattern
25+
ignore_newline = r'\n+'
26+
27+
# Extra action for newlines
28+
def ignore_newline(self, t):
29+
self.lineno += t.value.count('\n')
30+
31+
def error(self, t):
32+
print("Illegal character '%s'" % t.value[0])
33+
self.index += 1
34+
35+
class InputUnavailable(Exception):
36+
pass
37+
38+
class CalcParser(Parser):
39+
tokens = CalcLexer.tokens
40+
41+
def __init__(self):
42+
self.names = defaultdict(lambda: 0)
43+
self.input = []
44+
self.read_values = []
45+
46+
def add_input(self, value):
47+
self.input.append(value)
48+
49+
@_('INPUT NAME')
50+
def statement(self, p):
51+
try:
52+
read_value = int(self.input.pop(0))
53+
except IndexError as e:
54+
raise InputUnavailable from e
55+
56+
self.read_values.append(read_value)
57+
self.names[p.NAME] = read_value
58+
59+
@_('MULTIPLY NAME expr')
60+
def statement(self, p):
61+
self.names[p.NAME] *= p.expr
62+
63+
@_('DIVIDE NAME expr')
64+
def statement(self, p):
65+
self.names[p.NAME] //= p.expr
66+
67+
@_('MODULO NAME expr')
68+
def statement(self, p):
69+
self.names[p.NAME] %= p.expr
70+
71+
@_('EQUAL NAME expr')
72+
def statement(self, p):
73+
if self.names[p.NAME] == p.expr:
74+
self.names[p.NAME] = 1
75+
else:
76+
self.names[p.NAME] = 0
77+
78+
@_('expr')
79+
def statement(self, p):
80+
pass
81+
82+
@_('ADD NAME expr')
83+
def statement(self, p):
84+
self.names[p.NAME] += p.expr
85+
86+
@_('NUMBER')
87+
def expr(self, p):
88+
return int(p.NUMBER)
89+
90+
@_('NAME')
91+
def expr(self, p):
92+
return self.names[p.NAME]
93+
94+
def lex(textio: TextIO):
95+
lexed_lines = []
96+
lexer = CalcLexer()
97+
98+
for line in textio.readlines():
99+
# line = line.strip()
100+
if line.strip():
101+
lexed_lines.append(list(lexer.tokenize(line)))
102+
# parser.parse(lexer.tokenize(line))
103+
104+
return lexed_lines
105+
106+
def parse(lexed, inp):
107+
parser = CalcParser(iter(inp))
108+
for line in lexed:
109+
parser.parse(iter(line))
110+
return parser.names
111+
112+
monad = lex(open(sys.argv[1]))
113+
# parser = CalcParser()
114+
# parser.input = list('41299994879959')
115+
# for line in monad:
116+
# parser.parse(iter(line))
117+
# print(parser.names['z'])
118+
119+
for i in range(1,2):
120+
for j in range(1,2):
121+
for k in range(1,2):
122+
for l in range(7,9):
123+
for m in range(8,10):
124+
for n in range(4,7):
125+
for o in range(5,8):
126+
for p in range(1,3):
127+
for q in range(1,3):
128+
for r in range(1,3):
129+
for s in range(2,5):
130+
for t in range(1,4):
131+
for u in range(1, 3):
132+
for v in range(5,8):
133+
parser = CalcParser()
134+
parser.add_input(str(i))
135+
parser.add_input(str(j))
136+
parser.add_input(str(k))
137+
parser.add_input(str(l))
138+
parser.add_input(str(m))
139+
parser.add_input(str(n))
140+
parser.add_input(str(o))
141+
parser.add_input(str(p))
142+
parser.add_input(str(q))
143+
parser.add_input(str(r))
144+
parser.add_input(str(s))
145+
parser.add_input(str(t))
146+
parser.add_input(str(u))
147+
parser.add_input(str(v))
148+
149+
try:
150+
for line in monad:
151+
parser.parse(iter(line))
152+
except InputUnavailable:
153+
pass
154+
# if parser.names['z'] ==0:
155+
# print(i, j, k, l, m, n, o, p, q, r, s, t, u, v, parser.names['z'])
156+
if parser.names['z'] ==0:
157+
print(f'{i}{j}{k}{l}{m}{n}{o}{p}{q}{r}{s}{t}{u}{v} {parser.names["z"]}')
158+
raise Exception()
159+
160+
161+
# # for model_number in itertools.product([str(i) for i in range(9,0,-1)], repeat=14):
162+
# # model_number = list(reversed(model_number))
163+
# # if all(model_number[i]=='9' for i in range(-4,0)):
164+
# # model_number = ''.join(model_number)
165+
# # # print(model_number)
166+
# # else:
167+
# # model_number = ''.join(model_number)
168+
# # try:
169+
# # parser, _ = woot(model_number)
170+
# # except:
171+
# # print(model_number)
172+
# # if parser.names['z'] == 0:
173+
# # print(model_number)
174+
# # break
175+
176+
# if __name__ == '__main__':
177+
# digits = range(9, 0, -1)
178+
179+
# parsers = defaultdict(lambda: CalcParser())
180+
181+
# model_numbers = [[1]*14]
182+
# # for model_number in model_numbers:
183+
184+
185+
# # for line in monad:
186+
# # parser.parse(iter(line))
187+
188+
# # valid = test_model_number([1]*14)
189+
# # print(valid)
190+
# # # with Pool(processes=4) as pool:
191+
# # model_numbers = itertools.combinations_with_replacement(range(9, 0, -1), 14)
192+
# # oot = pool.map(test_model_number, model_numbers)
193+
194+
# # # print(''.join(str(digit) for digit in model_number))
195+
# # # variables = parse(monad, model_number)
196+
# # # if variables['z'] == 0:
197+
# # # print(''.join(str(digit) for digit in model_number))
198+
# # # break

0 commit comments

Comments
 (0)