-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay24_Part2.py
444 lines (427 loc) · 13.1 KB
/
Day24_Part2.py
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
import re, math
# txt = """sesenwnenenewseeswwswswwnenewsewsw
# neeenesenwnwwswnenewnwwsewnenwseswesw
# seswneswswsenwwnwse
# nwnwneseeswswnenewneswwnewseswneseene
# swweswneswnenwsewnwneneseenw
# eesenwseswswnenwswnwnwsewwnwsene
# sewnenenenesenwsewnenwwwse
# wenwwweseeeweswwwnwwe
# wsweesenenewnwwnwsenewsenwwsesesenwne
# neeswseenwwswnwswswnw
# nenwswwsewswnenenewsenwsenwnesesenew
# enewnwewneswsewnwswenweswnenwsenwsw
# sweneswneswneneenwnewenewwneswswnese
# swwesenesewenwneswnwwneseswwne
# enesenwswwswneneswsenwnewswseenwsese
# wnwnesenesenenwwnenwsewesewsesesew
# nenewswnwewswnenesenwnesewesw
# eneswnwswnwsenenwnwnwwseeswneewsenese
# neswnwewnwnwseenwseesewsenwsweewe
# wseweeenwnesenwwwswnew"""
txt = """nenwneswnwnwneswnenwnwsewenwsesw
swsesenwswswseseswseswneswseswsweswnese
neeswsesweneseeenwnenwnewneseewee
wseeeneseneneeeneneenweneewese
wwwwsewewsewnwwswwenewwwnww
seseneeseeswsenwswsewsewseseseneee
enesenesweseeswswswnwwnwne
swwwsenwwnwnwnwenwnenwnwsewsewwne
wnewwseeeswneneneneenweeesw
swwwswnwnwewwseswwesww
nwneswswswnweswweneeeneewwswswswne
senwseswsewseseseesesenwesesenweseesw
senesewneenwnwwesewnwesesesenewne
swwnwnwwwnwnwwewwnenwnwswsenwwnenw
swnwneseewnwnwnenwenewnwnw
swesesweswseswswnwnwsewnwseswseeswsw
nwnwnwsenwnwnwnwnwsenwwenwnwsewnwwneswnw
wwwewnwnwswwwneseeeswnwnww
swswswswseswneswseseneneswneseswswnewsw
swneseswswseseseswswswseswswse
wnewwwswnwnwwwwnwwsenww
senwsenewseneswwnene
nwseeswsesenesenwseseseseswsesenwseseswsw
wwswwswsewnewewwwwwwwwwnenesw
wwnwewenewweswnewswse
swwsenwwnwwwnwwseenwnwwnwnwnwenww
wwnenewswwewwswwwwsewwnwww
swenwnweseeseeeewe
nwewseeeesesese
nwsewesweesenwnwswseesewewswswse
wewsewwswwwnwewwwswnewwww
swswwneswwswswwwswenesene
seseseswswseswseswwseswswnesesw
newnwwwnwwwsewwnw
eswseenwseeeeeeswsenwneeeeee
swswsweswneenwneweneneneeeneesesw
swnwswesweneswswneseswswwswnw
eeeweeeesweneweneeeeeese
esesesesewnwswseswnesesesenweseseseew
nenwsenwnwnwsenenenenenwnewnenwnenesese
neenwneneneenwneneswnenwewneneeswswnenw
swseeswswswswenwswswswnwswswswsesw
nwnwswnwwenwnweneenwswnwsenwswnwsese
wenwweswseswswswswswwnwswswneenww
wswesenenwnwwenwwnwswnwnwnwnw
wnwnwnwsenwnwwnwnwnwwnwnw
ewesweeeeenenenwneswswseeeweee
nwenweeeeweeseeenwsweseeesese
senewneneneneswnenwseenwsenesewnwnenwse
senwseewewseenwseseseseswese
eeeeneswsenweeee
ewnenwnweswnwwswswnwnwnenesesewese
newnwswwnwenwwnwnwswwswnwwwwenw
nwseewwnenwnwnwnwnwnwnwsenwnwnwwenwnw
ewnenenwnenenenenwesewswwnwnenenee
seseswsesesenesewsesesenwseseewnwsese
nwswseseseeseneswnwwseeeesenweswwe
enwnwnesenwnenwnwnenenwwnenwsenwnwsenw
wewnweseeswneenenwseeeeeseee
sesesesesewseswseseseesesese
neeeeeneeswneseenwnenenwneswenwe
sewswswesweswsewseseswnwneeswnwenw
wnenenewswseneeenewseeenw
neswnwnenwwewnwnwnwnwnwseweswnwese
swnwswsewswswnenwnewsewwwwneseswse
wwswsweswwswswswswswswsw
esenewneneseweeenenew
nwswewnwsenwnwenwnwwsewwnesenwnwse
wenwweeseseswewenenweeeesew
sesenwswnwnwnenenwnwnewnesenewnenenenww
sesenesweswwesenwswnw
nwsenwswnenwnwnwsenewneswsenwwsenwnwnwne
nenenwswnwnwnenenwnwnwnwnwsenwneewnesw
nwneneeseeswsenwesewseswwseswwnesene
nwnwnwseneenwnwnwnwneswswnwsweenwnwnww
swnenesewnwseneswnwswseeseswseeenese
newneneneneneeswne
nenwnenwnewnenenenenwneswsesenwnenwnene
swwnwnwewnwnenwnwnwnw
wseenwswsenenewnwswswnwnenwnwswenwsenw
enenewnewnwnwneeneneseswswnwseneew
neneeneeneneswnenewnenwe
senewnwswsenwnenwsenwsewnwwneenwnwsw
nenwneeneeeneneeese
neswswswesewwswwswswsenesewswneswnew
wwsewwnwwwwwwnwnw
neneeeeeeeneswnewneneeseneneew
swswswswwwswswwnesw
seeneneewweenese
eswnwsweswswwnwseswswswneswseeswswne
wwnwswwwnenwnwwnww
nwseeswnwneeseswseseweseneesweseee
eseseseseeseeseseseenwsese
swesenwswseswswsewsesenesese
enesewnwswswnenenenenwneneneswsenwnenw
wnwwsesewwnewswwwwnwnwwwenwe
eswswswseswwnwnwswsweseswenwsw
enwswseswwwswnwswneswswwwseswswswsw
wsenwswswswswsweeneswwwwswwsw
esenwewwwwwwwwwwewwwww
neneneseenwsenwsenwswwwseenewnenesese
nwweswwsenwnwesweweswnwwenwenww
eseswsesesesenesesesesewewsenwnww
newesenwnenenenenwneneneswnesenenenewne
ewnwswnenwnwsenwsenwsenenwnesenwneswnwne
nwwswnwsewnenesesweenwnwnwewnenwnw
swnweswswwswswswswswnwseswswswsw
eewwswnewswewenwnwseneseenwsenwe
nenwswnwenwnenesewnenwseneswseswnwnenene
neneswnwwnwewsewenwsesw
senwseseseseseseswsenwsesesesesesesenesenw
enewsewwnwnwseswnenwswnwwnwwnenwnw
wswwwwswswnweswswwswwwwwwenwe
swswneswseseseseswswsw
wwswsenewwwwwswwswneww
wseeeewneseese
nesewwseseseswseseesw
nwenwnwswnwnwswenwswnwenwnwsenwnenenwnwnw
seswswswseswseneswseswswswneneseenesenwse
wswswwswwswswsweswnwswsweswenwewsw
sewsenwsewseneeswseeswse
eewweewneeneeeseneweeswnene
weeeenwesenweeseseewnewsenwse
nenenewneswneswneneneeneneneeeseneswe
wnwneneseenwewseswswswswneswwswnene
nweeswwwseseeseweswswnwsenwswswse
eneweenenwseweesenww
swnenewnweneseewnenwnesenenwenwnenwnesw
seseswseseswesenesesewswsesw
neeseweneeesewseeeneenwweeseee
newseneswnenwnwnesenenwnwnwenwwnwnwnw
enwnwenwnwwnwnwnwnwnenwnenwswswneese
ewwwwswwwswswwswnewswnew
sesesesenwseseseseseesese
nwnwwsewnwnwnenwwenwswseseenwnwswne
wswneneswswseswseswewwsesesweseneswnwnw
wnwsewwwwnwswwwwwwwenwew
nwnwnwnwnwnenwnwnwsww
wswswswnwswwswnwsenwseneswsweswswseswsw
nesenwneseswseswwnwneseswsesesenwswesese
nwnwnenewsenwneseenwnenwnwnwneseneswnwswne
nenesesenenenwnwswneeewnenenw
swnwswseswswwnwwwwswswnenewsewswswese
swenenwnwnwnenenwswnenwnenesweenenwnw
eeswenewenwneswneneeneenenenee
swswsweswswneswswswnenwswsweswnwsenwne
eeeesesewesenwesw
wwswswseneswsesenwseseneseeswseenwnwsw
swwwwewswwesw
wswwswwnewwseswswswswewswnwwnesw
eswsenwseswneewenweeewwwneene
wwewweswswwwswwewswwnwwwnw
swwneeenwnenwnwwswnenwnwnwweenwne
eneseneneswneneeneseneenweweswwnw
nwesesesesweeseneseesesesesesenwsenw
wwwwwwwwneswwseswwnesewwswesw
wnwesenwnwsenwwwnwwnwnwwwnewswwnw
eneewneeeneneneneneeenewese
sesesenesewsesesesesesenwsesesesenw
seswsenenwwsewseneneseeseswswswsesesese
swnenwswnwnewnwswswwnweewsesesewwne
ewneswswneswnwnwwsewneneseswseswsesee
wswswwswwnewwswwswswwewswsewe
swwnwnenenesewnenwwnwneneeweeswsene
eseswseseeseeeeneeswneneneweswee
eseseseenenesesesesewneseseseseseww
enesenenenwneneneneenenene
wswwswwwnewnwwsenewnwwnewseew
nenenenwneneeenwnwwswswnenenwenwnesw
nenenwnewswneneneneseneenenenenenesene
nenenwnwnwnwsenwnwnwnw
swwnweenwneneneeswnenenenenewswsenenenw
eswnenwswswnwwewneseesweseneenww
nenenenenwwnenwneneenenenw
sesewswneswswswseswneswswsenwswseswswse
esesweeeeneneesweeeenwwnwneee
wwwwnwwnwwsenenwwwwwnwwswseew
nweseneswnenenenenenenwnenwnenwne
wnwnwsenenewnwsewsenenenwewsenwwee
wnwseswsesesweesesenwseswswse
nwnenwwnwwneneneeswseneneeswnwnesene
neswsesesesewsesesenwswseesesesesewnesese
nwwwswwwewwww
swsweseseseseneswnwnesewseseswseseswsw
esesenwseseswwseseesenwnenesesesewsew
eseswswnwswnwsesewesesweswsw
wwwnwwwenwsenwnwnwwnw
wnwnwnwnwnwnwwnwnwnwnwnenweesenwwswnwsw
swswsesweenwnwwnene
swswswwneneneswwsesenwwswnwnwwwsee
nenwsenwenwenwsenenwnwnwnwneswnenwnww
swewwnenweswnwswwnwnwwwnwnwwwww
newneneenenenenenenenenee
swewnwswswneeswseseswnesenwenwwswsesw
wnewwswenwwwwswnwwwnewnwnwsww
nesenwswsweneseswneesesewswnenwsesesese
sewswswswwwnewswswwnwwnewwwswwsee
seeeewswneseewsesenenweseesesese
nenwneswnenenwnwnwwnwenwenenenwnwnwsw
enenwsenwwnwneswseseseenewseswsenww
newswswwswwswswwswnwwwswswneesesw
nwswswnwnwswseswswwneseenwwswe
nwwwswseneneneneneenwneneneneneenenene
senwsenwwwwwsewwwwneswnenwwww
swswwswsenwswseesesewnenenenewswsweswnw
swweneenwwsenwneneeneseneeene
nwnwnenwswenwnwwnwewnwnwsenwnenwnewnwe
eenenwneswnenenese
senwnwneseseeewswsesewsewenesesese
neswwwewwnenwwswwseswnw
wseeeneswseseeseseseseneneseseswsese
senenewesenwesenwswwwswnwsesenwenw
nweneneeeseeeeeseenwweeeswne
wswswseseswswswwnwnenwsweswswswswwsw
nenwswnwenwneswseesenenenewneee
nwnwnwnwnwnwenwswnwnwnwwnw
seseseseseneswseseseswswsw
eswswnewwswsenweswwwnwswswesenww
nenenenwwnwneenenesesenenewne
neeeswneswnweeeeeneneeswneenenew
weswswenwseswswswswsenwswsw
nwnwnwnwnwwenewwneewseseswnww
nwwsenwwswswneeneswswswsesweswswnesenee
wswwneswswswweseswnewnewnenesesesenenw
sweseseswswswsewsw
eeenewseneeweseenenewneseeneenee
seseenwnwseseseeseseeeneweseseseew
wwewnwnwwwsweew
sewnwnenwnwesenwwnenwnwwnwneswwwsew
wswwwswwsenwnwwwneswewswenwswswwsw
nwnenenenenewenenenenenwnene
sewnesewsewsewnenwwwwnewnwnwww
nwsewneeswwsewneswnwweenwnenw
eseeseseneseseweesesenwsesese
eneenenewenwswnwseswsenweeeeee
sesenwweesesesesesesenesewsesesesese
eneenwneeeewseenewewnweswseswe
swwswswswswswweswnweswswswswsesweswswnw
eewseeeenweeeenweswseseesee
nwnwneeswnwnwwnwwswswneswswnwnwenwswene
eenwnwswesenwsweswsesenweseenwee
wwnwwwewwnwwnenwwwsw
swnwnwneswenwenenenewenwswseswewse
nenwnwnenwnwnwnwnwswnwnwnwnw
nweswneeeswnweswswenwsweswneeenenwne
nwnenwneesewnewnwesenwnwnenwnewnwnwnww
ewwwwswswwenwwswswswwsesw
nwesewnenwesewseswnenweswseewseseee
nwswwsweswswseswwswswswnwswnwswswwe
wenwseewseeseneeseswswseseenwsene
seswswsesesesesesesenw
enenewenenenwnenwnenenwnenwswseswne
swwwsesewwwnwsewwsewnenwnwwwwww
wsenwwnenwnwsenwseseseseswseswneenesese
sweeeenwsenwnesenenwswswewwnwesww
swseswswswswsenwswswsw
nwswnwswnwnenwnwnwenwnwnwnenwnewnwnwnwsew
weeeeseweseweneenwsweeseenew
nwswswseswswswseswswswsw
eswsenwswsesenwswneneeenwneseswwswse
seseseseeseseseeenewsesese
swnenesweweenwneeeneneseeeeee
wwwwnwwwsewwnesewwnewse
neeenenwnenwswswnwseneeeeesweee
neenenenenenenwenewnenwswneswenwnene
wseeenesesenwneesenweeseswswswswse
esenwweswwewnenwewseenwsenwsee
newneeseeseeswewseeesesenweeesee
esewnwsenenewswnwwwsenwseswnwewnww
neneneeneenwewweneswseneneneneese
neewswnwweseswneesweswnwenwenenw
wwnwwnwwwwwwwsewewww
seseseneseswsesewseswseseswnwsee
esweeswseweseseeeenwswenwneene
sesenwwseseneseswswnwswsewseseseseseene
eeesenwsweeenwneeswswneesenewne
nenwnwnenenwnenenwwewewnwesenwswnw
nwnwnwwnwseenwenwnwnenwnwnwwnwnwwne
wneseeeenenewnwnwwneneesweswnene
wwnwwwnwsenwwewwnwsenwnwwwnew
nwnwnwnwnwwnwnwwswsesenewenwnwnwnwww
eswwsewnwwsewwnwwwwewwwenwsw
nesweswnewswnwswswewwnwsenwsenwwnwse
nwnwwwnwwweweswsenwwsewwneeww
neeenwswswnwswsweneneenwneeeneeneee
nwnwnesenwsewnwnenenwsewnwnee
eeenwesenwsesenweesweseseeswesee
eewwwwswwswswwswnewwnwnwesww
sewnenesenwnwswswnenwseneswwnenwnenwesw
ewswnwnwnwenwnwnwnwnwwswnwwenwenw
nwnwnwnwsenwnwnwnwnwnwnwnwwnw
newwwswswswswseswswswswswesw
swswswwwswwesenwswwneswswswwswsw
neeeenenweeeneneesw
seesesenwenwsewseenwsewswnweneew
swnesenesenesewsweneeswnwsesenwwese
eswnwswwswsenesenew
swneswwenwnenwsenenewwswesenenenenw
wwwwwwwwnwswneeseswneesesw
sesenwnwwnwwnesenwnwnwwnwswenwnwwene
swswswwsesweseswswwswnwswswsesesenee
nwnwswwnenenwnwwnwwnweswnwsenwnwnwnwnw"""
tiles = txt.splitlines()
reg1 = re.compile(r"""
([se|sw|nw|ne|e|w])
""",re.VERBOSE)
parsed_tiles=[]
for tile in tiles:
raw_tile= re.findall(reg1,tile)
parsed_tile=[raw_tile.pop(0)]
for i in range(len(raw_tile)):
next_letter = raw_tile.pop(0)
previous_letter = parsed_tile[-1]
if previous_letter + next_letter in ('se','sw','nw','ne'):
parsed_tile[-1] = parsed_tile[-1] + next_letter
else:
parsed_tile.append(next_letter)
parsed_tiles.append(parsed_tile)
black_tiles = set()
for tile in parsed_tiles:
# print(tile)
pos=[0,0]
for step in tile:
# print(pos)
if step == 'e':
pos[0]+=2
elif step== 'se':
pos[0]+=1
pos[1]-=1.73
elif step=='sw':
pos[0]-=1
pos[1]-=1.73
elif step=='w':
pos[0]-=2
elif step=='nw':
pos[0]-=1
pos[1]+=1.73
else:
pos[0]+=1
pos[1]+=1.73
pos_tup = tuple([round(a,2) for a in pos])
# print(pos_tup)
if pos_tup in black_tiles:
black_tiles.remove(pos_tup)
else:
black_tiles.add(pos_tup)
# print(sorted(black_tiles,key=lambda x: x[0]))
# print(len(black_tiles))
x_min=-500
x_max=500
y_min=-500
y_max=500
white_tiles = set()
for x in range(x_min,x_max,2):
for y in range(y_min,y_max,2):
t = tuple([x,round(y*1.73,2)])
if t not in black_tiles:
white_tiles.add(t)
for x in range(x_min+1,x_max,2):
for y in range(y_min+1,y_max,2):
t = tuple([x,round(y*1.73,2)])
if t not in black_tiles:
white_tiles.add(t)
print(f'starting with {len(black_tiles)} black tiles')
print(f'starting with {len(white_tiles)} white tiles')
def count_black_neighbor_tiles(t):
neighbors = set()
origin = list(t)
e = tuple([origin[0]+2,origin[1]])
se = tuple([origin[0]+1,round(origin[1]-1.73,2)])
sw = tuple([origin[0]-1,round(origin[1]-1.73,2)])
w = tuple([origin[0]-2,origin[1]])
nw = tuple([origin[0]-1,round(origin[1]+1.73,2)])
ne = tuple([origin[0]+1,round(origin[1]+1.73,2)])
neighbors.add(e)
neighbors.add(se)
neighbors.add(sw)
neighbors.add(w)
neighbors.add(nw)
neighbors.add(ne)
cbnt=0
for n in neighbors:
if n in black_tiles:
cbnt+=1
return cbnt
day=1
day_max=100
while day<=day_max:
flip_white = set()
flip_black = set()
for t in black_tiles:
bnt = count_black_neighbor_tiles(t)
if bnt==0 or bnt>2:
flip_white.add(t)
for t in white_tiles:
bnt = count_black_neighbor_tiles(t)
if bnt==2:
flip_black.add(t)
for t in flip_white:
black_tiles.remove(t)
white_tiles.add(t)
for t in flip_black:
white_tiles.remove(t)
black_tiles.add(t)
print(f'Day {day}: {len(black_tiles)} black tiles and {len(white_tiles)} white tiles')
day+=1