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