Add latest solutions

master
Alfred Melch 3 years ago
parent 696dbfc739
commit 3850dba4ec

File diff suppressed because one or more lines are too long

@ -0,0 +1,12 @@
with open("input") as f:
puzzle_input = f.read()
solution = 0
for char in puzzle_input:
if char == "(":
solution += 1
else:
solution -= 1
print(solution)

@ -0,0 +1,18 @@
with open("input") as f:
puzzle_input = f.read()
floor = 0
position = 1
for char in puzzle_input:
if char == "(":
floor += 1
else:
floor -= 1
if floor == -1:
break
position += 1
print(position)

File diff suppressed because it is too large Load Diff

@ -0,0 +1,15 @@
with open("input") as f:
puzzle_input = [n.strip() for n in f.readlines()]
paper = 0
for present_dim in puzzle_input:
parsed_dim = [int(x) for x in present_dim.split("x")]
parsed_dim.sort()
print(parsed_dim)
[l, w, h] = parsed_dim
paper += 3 * l * w + 2 * w * h + 2 * h * l
print(paper)

@ -0,0 +1,14 @@
with open("input") as f:
puzzle_input = [n.strip() for n in f.readlines()]
ribbon = 0
for present_dim in puzzle_input:
parsed_dim = [int(x) for x in present_dim.split("x")]
parsed_dim.sort()
[l, w, h] = parsed_dim
ribbon += 2 * l + 2 * w + l * w * h
print(ribbon)

File diff suppressed because one or more lines are too long

@ -0,0 +1,19 @@
with open("input") as f:
puzzle_input = f.read()
# puzzle_input = "^v^v^v^v^v"
coords = (0, 0)
delivered_houses = set()
delivered_houses.add(coords)
MOVEMENTS = {">": (1, 0), "^": (0, 1), "<": (-1, 0), "v": (0, -1)}
for char in puzzle_input:
[d_x, d_y] = MOVEMENTS[char]
coords = (coords[0] + d_x, coords[1] + d_y)
delivered_houses.add(coords)
print(delivered_houses)
print(len(delivered_houses))

@ -0,0 +1,27 @@
with open("input") as f:
puzzle_input = f.read()
# puzzle_input = "^v^v^v^v^v"
coords = (0, 0)
delivered_houses = set()
delivered_houses.add(coords)
MOVEMENTS = {">": (1, 0), "^": (0, 1), "<": (-1, 0), "v": (0, -1)}
SANTA_MOVES = puzzle_input[::2]
ROBO_MOVES = puzzle_input[1::2]
for char in SANTA_MOVES:
[d_x, d_y] = MOVEMENTS[char]
coords = (coords[0] + d_x, coords[1] + d_y)
delivered_houses.add(coords)
coords = (0, 0)
for char in ROBO_MOVES:
[d_x, d_y] = MOVEMENTS[char]
coords = (coords[0] + d_x, coords[1] + d_y)
delivered_houses.add(coords)
print(len(delivered_houses))

@ -0,0 +1 @@
ckczppom

@ -0,0 +1,20 @@
from hashlib import md5
with open("input") as f:
puzzle_input = f.read().strip()
# puzzle_input = "abcdef"
# puzzle_input = "pqrstuv"
solution = 0
cur_hash = ""
while cur_hash[:5] != "00000":
solution += 1
md5_input = puzzle_input + str(solution)
cur_hash = md5(md5_input.encode("utf-8")).hexdigest()
print(cur_hash)
print(puzzle_input)
print(solution)

@ -0,0 +1,20 @@
from hashlib import md5
with open("input") as f:
puzzle_input = f.read().strip()
# puzzle_input = "abcdef"
# puzzle_input = "pqrstuv"
solution = 0
cur_hash = ""
while cur_hash[:6] != "000000":
solution += 1
md5_input = puzzle_input + str(solution)
cur_hash = md5(md5_input.encode("utf-8")).hexdigest()
print(cur_hash)
print(puzzle_input)
print(solution)

File diff suppressed because it is too large Load Diff

@ -0,0 +1,46 @@
with open("input") as f:
puzzle_input = [n.strip() for n in f.readlines()]
nice_words = 0
def has_three_or_more_vowels(word):
vowels = 0
for char in word:
if char in "aeiou":
vowels += 1
if vowels >= 3:
return True
return False
def has_letter_twice_in_a_row(word):
last = word[0]
for char in word[1:]:
if last == char:
return True
last = char
return False
def contains_bad_string(word):
BAD_STRINGS = ["ab", "cd", "pq", "xy"]
for bad_string in BAD_STRINGS:
if bad_string in word:
return True
return False
def is_nice_word(word):
return (
has_three_or_more_vowels(word)
and has_letter_twice_in_a_row(word)
and not contains_bad_string(word)
)
for word in puzzle_input:
if is_nice_word(word):
nice_words += 1
print(nice_words)

@ -0,0 +1,36 @@
with open("input") as f:
puzzle_input = [n.strip() for n in f.readlines()]
# puzzle_input = ["qjhvhtzxzqqjkmpb", "xxyxx", "uurcxstgmygtbstg", "ieodomkazucvgmuy"]
nice_words = 0
def has_duplicate_pair(word):
for idx_a in range(len(word) - 3):
for idx_b in range(idx_a + 2, len(word) - 1):
pair_1 = word[idx_a] + word[idx_a + 1]
pair_2 = word[idx_b] + word[idx_b + 1]
if pair_1 == pair_2:
return True
return False
def has_repeated_letter_with_one_between(word):
for idx, a in enumerate(word[:-2]):
b = word[idx + 2]
if a == b:
return True
return False
def is_nice_word(word):
return has_duplicate_pair(word) and has_repeated_letter_with_one_between(word)
for word in puzzle_input:
if is_nice_word(word):
nice_words += 1
print(nice_words)

@ -0,0 +1,300 @@
turn off 660,55 through 986,197
turn off 341,304 through 638,850
turn off 199,133 through 461,193
toggle 322,558 through 977,958
toggle 537,781 through 687,941
turn on 226,196 through 599,390
turn on 240,129 through 703,297
turn on 317,329 through 451,798
turn on 957,736 through 977,890
turn on 263,530 through 559,664
turn on 158,270 through 243,802
toggle 223,39 through 454,511
toggle 544,218 through 979,872
turn on 313,306 through 363,621
toggle 173,401 through 496,407
toggle 333,60 through 748,159
turn off 87,577 through 484,608
turn on 809,648 through 826,999
toggle 352,432 through 628,550
turn off 197,408 through 579,569
turn off 1,629 through 802,633
turn off 61,44 through 567,111
toggle 880,25 through 903,973
turn on 347,123 through 864,746
toggle 728,877 through 996,975
turn on 121,895 through 349,906
turn on 888,547 through 931,628
toggle 398,782 through 834,882
turn on 966,850 through 989,953
turn off 891,543 through 914,991
toggle 908,77 through 916,117
turn on 576,900 through 943,934
turn off 580,170 through 963,206
turn on 184,638 through 192,944
toggle 940,147 through 978,730
turn off 854,56 through 965,591
toggle 717,172 through 947,995
toggle 426,987 through 705,998
turn on 987,157 through 992,278
toggle 995,774 through 997,784
turn off 796,96 through 845,182
turn off 451,87 through 711,655
turn off 380,93 through 968,676
turn on 263,468 through 343,534
turn on 917,936 through 928,959
toggle 478,7 through 573,148
turn off 428,339 through 603,624
turn off 400,880 through 914,953
toggle 679,428 through 752,779
turn off 697,981 through 709,986
toggle 482,566 through 505,725
turn off 956,368 through 993,516
toggle 735,823 through 783,883
turn off 48,487 through 892,496
turn off 116,680 through 564,819
turn on 633,865 through 729,930
turn off 314,618 through 571,922
toggle 138,166 through 936,266
turn on 444,732 through 664,960
turn off 109,337 through 972,497
turn off 51,432 through 77,996
turn off 259,297 through 366,744
toggle 801,130 through 917,544
toggle 767,982 through 847,996
turn on 216,507 through 863,885
turn off 61,441 through 465,731
turn on 849,970 through 944,987
toggle 845,76 through 852,951
toggle 732,615 through 851,936
toggle 251,128 through 454,778
turn on 324,429 through 352,539
toggle 52,450 through 932,863
turn off 449,379 through 789,490
turn on 317,319 through 936,449
toggle 887,670 through 957,838
toggle 671,613 through 856,664
turn off 186,648 through 985,991
turn off 471,689 through 731,717
toggle 91,331 through 750,758
toggle 201,73 through 956,524
toggle 82,614 through 520,686
toggle 84,287 through 467,734
turn off 132,367 through 208,838
toggle 558,684 through 663,920
turn on 237,952 through 265,997
turn on 694,713 through 714,754
turn on 632,523 through 862,827
turn on 918,780 through 948,916
turn on 349,586 through 663,976
toggle 231,29 through 257,589
toggle 886,428 through 902,993
turn on 106,353 through 236,374
turn on 734,577 through 759,684
turn off 347,843 through 696,912
turn on 286,699 through 964,883
turn on 605,875 through 960,987
turn off 328,286 through 869,461
turn off 472,569 through 980,848
toggle 673,573 through 702,884
turn off 398,284 through 738,332
turn on 158,50 through 284,411
turn off 390,284 through 585,663
turn on 156,579 through 646,581
turn on 875,493 through 989,980
toggle 486,391 through 924,539
turn on 236,722 through 272,964
toggle 228,282 through 470,581
toggle 584,389 through 750,761
turn off 899,516 through 900,925
turn on 105,229 through 822,846
turn off 253,77 through 371,877
turn on 826,987 through 906,992
turn off 13,152 through 615,931
turn on 835,320 through 942,399
turn on 463,504 through 536,720
toggle 746,942 through 786,998
turn off 867,333 through 965,403
turn on 591,477 through 743,692
turn off 403,437 through 508,908
turn on 26,723 through 368,814
turn on 409,485 through 799,809
turn on 115,630 through 704,705
turn off 228,183 through 317,220
toggle 300,649 through 382,842
turn off 495,365 through 745,562
turn on 698,346 through 744,873
turn on 822,932 through 951,934
toggle 805,30 through 925,421
toggle 441,152 through 653,274
toggle 160,81 through 257,587
turn off 350,781 through 532,917
toggle 40,583 through 348,636
turn on 280,306 through 483,395
toggle 392,936 through 880,955
toggle 496,591 through 851,934
turn off 780,887 through 946,994
turn off 205,735 through 281,863
toggle 100,876 through 937,915
turn on 392,393 through 702,878
turn on 956,374 through 976,636
toggle 478,262 through 894,775
turn off 279,65 through 451,677
turn on 397,541 through 809,847
turn on 444,291 through 451,586
toggle 721,408 through 861,598
turn on 275,365 through 609,382
turn on 736,24 through 839,72
turn off 86,492 through 582,712
turn on 676,676 through 709,703
turn off 105,710 through 374,817
toggle 328,748 through 845,757
toggle 335,79 through 394,326
toggle 193,157 through 633,885
turn on 227,48 through 769,743
toggle 148,333 through 614,568
toggle 22,30 through 436,263
toggle 547,447 through 688,969
toggle 576,621 through 987,740
turn on 711,334 through 799,515
turn on 541,448 through 654,951
toggle 792,199 through 798,990
turn on 89,956 through 609,960
toggle 724,433 through 929,630
toggle 144,895 through 201,916
toggle 226,730 through 632,871
turn off 760,819 through 828,974
toggle 887,180 through 940,310
toggle 222,327 through 805,590
turn off 630,824 through 885,963
turn on 940,740 through 954,946
turn on 193,373 through 779,515
toggle 304,955 through 469,975
turn off 405,480 through 546,960
turn on 662,123 through 690,669
turn off 615,238 through 750,714
turn on 423,220 through 930,353
turn on 329,769 through 358,970
toggle 590,151 through 704,722
turn off 884,539 through 894,671
toggle 449,241 through 984,549
toggle 449,260 through 496,464
turn off 306,448 through 602,924
turn on 286,805 through 555,901
toggle 722,177 through 922,298
toggle 491,554 through 723,753
turn on 80,849 through 174,996
turn off 296,561 through 530,856
toggle 653,10 through 972,284
toggle 529,236 through 672,614
toggle 791,598 through 989,695
turn on 19,45 through 575,757
toggle 111,55 through 880,871
turn off 197,897 through 943,982
turn on 912,336 through 977,605
toggle 101,221 through 537,450
turn on 101,104 through 969,447
toggle 71,527 through 587,717
toggle 336,445 through 593,889
toggle 214,179 through 575,699
turn on 86,313 through 96,674
toggle 566,427 through 906,888
turn off 641,597 through 850,845
turn on 606,524 through 883,704
turn on 835,775 through 867,887
toggle 547,301 through 897,515
toggle 289,930 through 413,979
turn on 361,122 through 457,226
turn on 162,187 through 374,746
turn on 348,461 through 454,675
turn off 966,532 through 985,537
turn on 172,354 through 630,606
turn off 501,880 through 680,993
turn off 8,70 through 566,592
toggle 433,73 through 690,651
toggle 840,798 through 902,971
toggle 822,204 through 893,760
turn off 453,496 through 649,795
turn off 969,549 through 990,942
turn off 789,28 through 930,267
toggle 880,98 through 932,434
toggle 568,674 through 669,753
turn on 686,228 through 903,271
turn on 263,995 through 478,999
toggle 534,675 through 687,955
turn off 342,434 through 592,986
toggle 404,768 through 677,867
toggle 126,723 through 978,987
toggle 749,675 through 978,959
turn off 445,330 through 446,885
turn off 463,205 through 924,815
turn off 417,430 through 915,472
turn on 544,990 through 912,999
turn off 201,255 through 834,789
turn off 261,142 through 537,862
turn off 562,934 through 832,984
turn off 459,978 through 691,980
turn off 73,911 through 971,972
turn on 560,448 through 723,810
turn on 204,630 through 217,854
turn off 91,259 through 611,607
turn on 877,32 through 978,815
turn off 950,438 through 974,746
toggle 426,30 through 609,917
toggle 696,37 through 859,201
toggle 242,417 through 682,572
turn off 388,401 through 979,528
turn off 79,345 through 848,685
turn off 98,91 through 800,434
toggle 650,700 through 972,843
turn off 530,450 through 538,926
turn on 428,559 through 962,909
turn on 78,138 through 92,940
toggle 194,117 through 867,157
toggle 785,355 through 860,617
turn off 379,441 through 935,708
turn off 605,133 through 644,911
toggle 10,963 through 484,975
turn off 359,988 through 525,991
turn off 509,138 through 787,411
toggle 556,467 through 562,773
turn on 119,486 through 246,900
turn on 445,561 through 794,673
turn off 598,681 through 978,921
turn off 974,230 through 995,641
turn off 760,75 through 800,275
toggle 441,215 through 528,680
turn off 701,636 through 928,877
turn on 165,753 through 202,780
toggle 501,412 through 998,516
toggle 161,105 through 657,395
turn on 113,340 through 472,972
toggle 384,994 through 663,999
turn on 969,994 through 983,997
turn on 519,600 through 750,615
turn off 363,899 through 948,935
turn on 271,845 through 454,882
turn off 376,528 through 779,640
toggle 767,98 through 854,853
toggle 107,322 through 378,688
turn off 235,899 through 818,932
turn on 445,611 through 532,705
toggle 629,387 through 814,577
toggle 112,414 through 387,421
toggle 319,184 through 382,203
turn on 627,796 through 973,940
toggle 602,45 through 763,151
turn off 441,375 through 974,545
toggle 871,952 through 989,998
turn on 717,272 through 850,817
toggle 475,711 through 921,882
toggle 66,191 through 757,481
turn off 50,197 through 733,656
toggle 83,575 through 915,728
turn on 777,812 through 837,912
turn on 20,984 through 571,994
turn off 446,432 through 458,648
turn on 715,871 through 722,890
toggle 424,675 through 740,862
toggle 580,592 through 671,900
toggle 296,687 through 906,775

@ -0,0 +1,37 @@
from collections import defaultdict
with open("input") as f:
puzzle_input = [n.strip() for n in f.readlines()]
lights = [[False for _ in range(1000)] for _ in range(1000)]
for instruction in puzzle_input:
from_coords = instruction.split(" ")[-1::-1][2]
to_coords = instruction.split(" ")[-1::-1][0]
from_coords = [int(x) for x in from_coords.split(",")]
to_coords = [int(x) for x in to_coords.split(",")]
[x_1, y_1] = from_coords
[x_2, y_2] = to_coords
toggle_mode = instruction.startswith("toggle")
set_to = instruction.startswith("turn on")
for x in range(x_1, x_2 + 1):
for y in range(y_1, y_2 + 1):
if toggle_mode:
lights[x][y] = not lights[x][y]
else:
lights[x][y] = set_to
print(instruction, from_coords, to_coords)
lights_on = 0
for row in lights:
for light in row:
if light:
lights_on += 1
print(lights_on)

@ -0,0 +1,40 @@
from collections import defaultdict
with open("input") as f:
puzzle_input = [n.strip() for n in f.readlines()]
lights = [[0 for _ in range(1000)] for _ in range(1000)]
for instruction in puzzle_input:
from_coords = instruction.split(" ")[-1::-1][2]
to_coords = instruction.split(" ")[-1::-1][0]
from_coords = [int(x) for x in from_coords.split(",")]
to_coords = [int(x) for x in to_coords.split(",")]
[x_1, y_1] = from_coords
[x_2, y_2] = to_coords
diff = 0
if instruction.startswith("turn on"):
diff = 1
elif instruction.startswith("turn off"):
diff = -1
else:
diff = 2
for x in range(x_1, x_2 + 1):
for y in range(y_1, y_2 + 1):
lights[x][y] = lights[x][y] + diff
if lights[x][y] < 0:
lights[x][y] = 0
print(instruction, from_coords, to_coords)
brightness = 0
for row in lights:
for light in row:
brightness += light
print(brightness)

@ -0,0 +1,8 @@
123 -> x
456 -> y
x AND y -> d
x OR y -> e
x LSHIFT 2 -> f
y RSHIFT 2 -> g
NOT x -> h
NOT y -> i

@ -0,0 +1,339 @@
bn RSHIFT 2 -> bo
lf RSHIFT 1 -> ly
fo RSHIFT 3 -> fq
cj OR cp -> cq
fo OR fz -> ga
t OR s -> u
lx -> a
NOT ax -> ay
he RSHIFT 2 -> hf
lf OR lq -> lr
lr AND lt -> lu
dy OR ej -> ek
1 AND cx -> cy
hb LSHIFT 1 -> hv
1 AND bh -> bi
ih AND ij -> ik
c LSHIFT 1 -> t
ea AND eb -> ed
km OR kn -> ko
NOT bw -> bx
ci OR ct -> cu
NOT p -> q
lw OR lv -> lx
NOT lo -> lp
fp OR fv -> fw
o AND q -> r
dh AND dj -> dk
ap LSHIFT 1 -> bj
bk LSHIFT 1 -> ce
NOT ii -> ij
gh OR gi -> gj
kk RSHIFT 1 -> ld
lc LSHIFT 1 -> lw
lb OR la -> lc
1 AND am -> an
gn AND gp -> gq
lf RSHIFT 3 -> lh
e OR f -> g
lg AND lm -> lo
ci RSHIFT 1 -> db
cf LSHIFT 1 -> cz
bn RSHIFT 1 -> cg
et AND fe -> fg
is OR it -> iu
kw AND ky -> kz
ck AND cl -> cn
bj OR bi -> bk
gj RSHIFT 1 -> hc
iu AND jf -> jh
NOT bs -> bt
kk OR kv -> kw
ks AND ku -> kv
hz OR ik -> il
b RSHIFT 1 -> v
iu RSHIFT 1 -> jn
fo RSHIFT 5 -> fr
be AND bg -> bh
ga AND gc -> gd
hf OR hl -> hm
ld OR le -> lf
as RSHIFT 5 -> av
fm OR fn -> fo
hm AND ho -> hp
lg OR lm -> ln
NOT kx -> ky
kk RSHIFT 3 -> km
ek AND em -> en
NOT ft -> fu
NOT jh -> ji
jn OR jo -> jp
gj AND gu -> gw
d AND j -> l
et RSHIFT 1 -> fm
jq OR jw -> jx
ep OR eo -> eq
lv LSHIFT 15 -> lz
NOT ey -> ez
jp RSHIFT 2 -> jq
eg AND ei -> ej
NOT dm -> dn
jp AND ka -> kc
as AND bd -> bf
fk OR fj -> fl
dw OR dx -> dy
lj AND ll -> lm
ec AND ee -> ef
fq AND fr -> ft
NOT kp -> kq
ki OR kj -> kk
cz OR cy -> da
as RSHIFT 3 -> au
an LSHIFT 15 -> ar
fj LSHIFT 15 -> fn
1 AND fi -> fj
he RSHIFT 1 -> hx
lf RSHIFT 2 -> lg
kf LSHIFT 15 -> kj
dz AND ef -> eh
ib OR ic -> id
lf RSHIFT 5 -> li
bp OR bq -> br
NOT gs -> gt
fo RSHIFT 1 -> gh
bz AND cb -> cc
ea OR eb -> ec
lf AND lq -> ls
NOT l -> m
hz RSHIFT 3 -> ib
NOT di -> dj
NOT lk -> ll
jp RSHIFT 3 -> jr
jp RSHIFT 5 -> js
NOT bf -> bg
s LSHIFT 15 -> w
eq LSHIFT 1 -> fk
jl OR jk -> jm
hz AND ik -> im
dz OR ef -> eg
1 AND gy -> gz
la LSHIFT 15 -> le
br AND bt -> bu
NOT cn -> co
v OR w -> x
d OR j -> k
1 AND gd -> ge
ia OR ig -> ih
NOT go -> gp
NOT ed -> ee
jq AND jw -> jy
et OR fe -> ff
aw AND ay -> az
ff AND fh -> fi
ir LSHIFT 1 -> jl
gg LSHIFT 1 -> ha
x RSHIFT 2 -> y
db OR dc -> dd
bl OR bm -> bn
ib AND ic -> ie
x RSHIFT 3 -> z
lh AND li -> lk
ce OR cd -> cf
NOT bb -> bc
hi AND hk -> hl
NOT gb -> gc
1 AND r -> s
fw AND fy -> fz
fb AND fd -> fe
1 AND en -> eo
z OR aa -> ab
bi LSHIFT 15 -> bm
hg OR hh -> hi
kh LSHIFT 1 -> lb
cg OR ch -> ci
1 AND kz -> la
gf OR ge -> gg
gj RSHIFT 2 -> gk
dd RSHIFT 2 -> de
NOT ls -> lt
lh OR li -> lj
jr OR js -> jt
au AND av -> ax
0 -> c
he AND hp -> hr
id AND if -> ig
et RSHIFT 5 -> ew
bp AND bq -> bs
e AND f -> h
ly OR lz -> ma
1 AND lu -> lv
NOT jd -> je
ha OR gz -> hb
dy RSHIFT 1 -> er
iu RSHIFT 2 -> iv
NOT hr -> hs
as RSHIFT 1 -> bl
kk RSHIFT 2 -> kl
b AND n -> p
ln AND lp -> lq
cj AND cp -> cr
dl AND dn -> do
ci RSHIFT 2 -> cj
as OR bd -> be
ge LSHIFT 15 -> gi
hz RSHIFT 5 -> ic
dv LSHIFT 1 -> ep
kl OR kr -> ks
gj OR gu -> gv
he RSHIFT 5 -> hh
NOT fg -> fh
hg AND hh -> hj
b OR n -> o
jk LSHIFT 15 -> jo
gz LSHIFT 15 -> hd
cy LSHIFT 15 -> dc
kk RSHIFT 5 -> kn
ci RSHIFT 3 -> ck
at OR az -> ba
iu RSHIFT 3 -> iw
ko AND kq -> kr
NOT eh -> ei
aq OR ar -> as
iy AND ja -> jb
dd RSHIFT 3 -> df
bn RSHIFT 3 -> bp
1 AND cc -> cd
at AND az -> bb
x OR ai -> aj
kk AND kv -> kx
ao OR an -> ap
dy RSHIFT 3 -> ea
x RSHIFT 1 -> aq
eu AND fa -> fc
kl AND kr -> kt
ia AND ig -> ii
df AND dg -> di
NOT fx -> fy
k AND m -> n
bn RSHIFT 5 -> bq
km AND kn -> kp
dt LSHIFT 15 -> dx
hz RSHIFT 2 -> ia
aj AND al -> am
cd LSHIFT 15 -> ch
hc OR hd -> he
he RSHIFT 3 -> hg
bn OR by -> bz
NOT kt -> ku
z AND aa -> ac
NOT ak -> al
cu AND cw -> cx
NOT ie -> if
dy RSHIFT 2 -> dz
ip LSHIFT 15 -> it
de OR dk -> dl
au OR av -> aw
jg AND ji -> jj
ci AND ct -> cv
dy RSHIFT 5 -> eb
hx OR hy -> hz
eu OR fa -> fb
gj RSHIFT 3 -> gl
fo AND fz -> gb
1 AND jj -> jk
jp OR ka -> kb
de AND dk -> dm
ex AND ez -> fa
df OR dg -> dh
iv OR jb -> jc
x RSHIFT 5 -> aa
NOT hj -> hk
NOT im -> in
fl LSHIFT 1 -> gf
hu LSHIFT 15 -> hy
iq OR ip -> ir
iu RSHIFT 5 -> ix
NOT fc -> fd
NOT el -> em
ck OR cl -> cm
et RSHIFT 3 -> ev
hw LSHIFT 1 -> iq
ci RSHIFT 5 -> cl
iv AND jb -> jd
dd RSHIFT 5 -> dg
as RSHIFT 2 -> at
NOT jy -> jz
af AND ah -> ai
1 AND ds -> dt
jx AND jz -> ka
da LSHIFT 1 -> du
fs AND fu -> fv
jp RSHIFT 1 -> ki
iw AND ix -> iz
iw OR ix -> iy
eo LSHIFT 15 -> es
ev AND ew -> ey
ba AND bc -> bd
fp AND fv -> fx
jc AND je -> jf
et RSHIFT 2 -> eu
kg OR kf -> kh
iu OR jf -> jg
er OR es -> et
fo RSHIFT 2 -> fp
NOT ca -> cb
bv AND bx -> by
u LSHIFT 1 -> ao
cm AND co -> cp
y OR ae -> af
bn AND by -> ca
1 AND ke -> kf
jt AND jv -> jw
fq OR fr -> fs
dy AND ej -> el
NOT kc -> kd
ev OR ew -> ex
dd OR do -> dp
NOT cv -> cw
gr AND gt -> gu
dd RSHIFT 1 -> dw
NOT gw -> gx
NOT iz -> ja
1 AND io -> ip
NOT ag -> ah
b RSHIFT 5 -> f
NOT cr -> cs
kb AND kd -> ke
jr AND js -> ju
cq AND cs -> ct
il AND in -> io
NOT ju -> jv
du OR dt -> dv
dd AND do -> dq
b RSHIFT 2 -> d
jm LSHIFT 1 -> kg
NOT dq -> dr
bo OR bu -> bv
gk OR gq -> gr
he OR hp -> hq
NOT h -> i
hf AND hl -> hn
gv AND gx -> gy
x AND ai -> ak
bo AND bu -> bw
hq AND hs -> ht
hz RSHIFT 1 -> is
gj RSHIFT 5 -> gm
g AND i -> j
gk AND gq -> gs
dp AND dr -> ds
b RSHIFT 3 -> e
gl AND gm -> go
gl OR gm -> gn
y AND ae -> ag
hv OR hu -> hw
1674 -> b
ab AND ad -> ae
NOT ac -> ad
1 AND ht -> hu
NOT hn -> ho

@ -0,0 +1,55 @@
with open("input") as f:
instructions = [n.strip() for n in f.readlines()]
SOURCES = dict()
for instruction in instructions:
print(instruction)
[operation, wire] = instruction.split(" -> ")
SOURCES[wire] = operation
print(SOURCES)
def evaluate_wire(wire):
try:
return int(wire)
except ValueError:
pass
operation = SOURCES[wire]
print("evaluating wire", wire, "; operation:", operation)
parameters = operation.split(" ")
result = None
if "NOT" in operation:
[_, a] = parameters
result = evaluate_wire(a) ^ 0b1111111111111111
elif "OR" in operation:
[a, _, b] = parameters
result = evaluate_wire(a) | evaluate_wire(b)
elif "AND" in operation:
[a, _, b] = parameters
result = evaluate_wire(a) & evaluate_wire(b)
elif "LSHIFT" in operation:
[a, _, b] = parameters
result = evaluate_wire(a) << evaluate_wire(b)
elif "RSHIFT" in operation:
[a, _, b] = parameters
result = evaluate_wire(a) >> evaluate_wire(b)
else:
result = evaluate_wire(operation)
SOURCES[wire] = str(result)
return result
print(evaluate_wire("a"))
# for wire in ["d", "e", "f", "g", "h", "i"]:
# print("==", wire, "==")
# print(evaluate_wire(wire))
# print(SOURCES)
print("finish")

@ -0,0 +1,56 @@
with open("input") as f:
instructions = [n.strip() for n in f.readlines()]
solution_part_1 = 46065
SOURCES = dict()
for instruction in instructions:
print(instruction)
[operation, wire] = instruction.split(" -> ")
SOURCES[wire] = operation
SOURCES["b"] = solution_part_1
def evaluate_wire(wire):
try:
return int(wire)
except ValueError:
pass
operation = SOURCES[wire]
print("evaluating wire", wire, "; operation:", operation)
if type(operation) == int:
return operation
parameters = operation.split(" ")
result = None
if "NOT" in operation:
[_, a] = parameters
result = evaluate_wire(a) ^ 0b1111111111111111
elif "OR" in operation:
[a, _, b] = parameters
result = evaluate_wire(a) | evaluate_wire(b)
elif "AND" in operation:
[a, _, b] = parameters
result = evaluate_wire(a) & evaluate_wire(b)
elif "LSHIFT" in operation:
[a, _, b] = parameters
result = evaluate_wire(a) << evaluate_wire(b)
elif "RSHIFT" in operation:
[a, _, b] = parameters
result = evaluate_wire(a) >> evaluate_wire(b)
else:
result = evaluate_wire(operation)
SOURCES[wire] = str(result)
return result
print(evaluate_wire("a"))
print("finish")

@ -0,0 +1,300 @@
"sjdivfriyaaqa\xd2v\"k\"mpcu\"yyu\"en"
"vcqc"
"zbcwgmbpijcxu\"yins\"sfxn"
"yumngprx"
"bbdj"
"czbggabkzo\"wsnw\"voklp\"s"
"acwt"
"aqttwnsohbzian\"evtllfxwkog\"cunzw"
"ugvsgfv"
"xlnillibxg"
"kexh\"pmi"
"syvugow"
"m\"ktqnw"
"yrbajyndte\\rm"
"f\"kak\x70sn\xc4kjri"
"yxthr"
"alvumfsjni\"kohg"
"trajs\x5brom\xf1yoijaumkem\"\"tahlzs"
"\"oedr\"pwdbnnrc"
"qsmzhnx\""
"\"msoytqimx\\tbklqz"
"mjdfcgwdshrehgs"
"\"rivyxahf\""
"ciagc\x04bp"
"xkfc"
"xrgcripdu\x4c\xc4gszjhrvumvz\"mngbirb"
"gvmae\"yiiujoqvr\"mkxmgbbut\"u"
"ih"
"ncrqlejehs"
"mkno\x43pcfdukmemycp"
"uanzoqxkpsksbvdnkji\"feamp"
"axoufpnbx\\ao\x61pfj\"b"
"dz\\ztawzdjy"
"ihne\"enumvswypgf"
"\"dgazthrphbshdo\\vuqoiy\""
"dlnmptzt\\zahwpylc\\b\"gmslrqysk"
"mhxznyzcp"
"rebr\"amvxw\x5fmbnfpkkeghlntavj"
"lades\x47ncgdof\"\"jmbbk"
"dwxuis\xa5wdkx\\z\"admgnoddpgkt\\zs"
"g\\k\x27qsl\x34hwfglcdxqbeclt\xca\\"
"lhyjky\\m\"pvnm\\xmynpxnlhndmahjl"
"c\"uxabbgorrpprw\"xas\\vefkxioqpt"
"rfrvjxpevcmma\x71gtfipo"
"fgh\"kcwoqwfnjgdlzfclprg\"q"
"onxnwykrba"
"hkkg\x60f\"tjzsanpvarzgkfipl"
"\"aintes\"ofq\"juiaqlqxmvpe\\a"
"wiyczzs\"ciwk"
"mfqeu"
"v\xe1z\x7ftzalmvdmncfivrax\\rjwq"
"k\"vtg"
"exhrtdugeml\xf0"
"behnchkpld"
"mhgxy\"mfcrg\xc5gnp\"\"osqhj"
"rlvjy"
"awe"
"ctwy"
"vt"
"\x54t"
"zugfmmfomz"
"cv\"cvcvfaada\x04fsuqjinbfh\xa9cq\xd2c\"d"
"oj"
"xazanf\"wbmcrn"
"\\\\zkisyjpbzandqikqjqvee"
"dpsnbzdwnxk\\v"
"sj\"tuupr\\oyoh"
"myvkgnw\x81q\xaaokt\\emgejbsyvxcl\\\xee"
"ejeuqvunjcirdkkpt\"nlns"
"twmlvwxyvfyqqzu"
"\"xwtzdp\x98qkcis\"dm\\\"ep\"xyykq"
"vvcq\\expok"
"wgukjfanjgpdjb"
"\"mjcjajnxy\\dcpc"
"wdvgnecw\\ab\x44klceduzgsvu"
"dqtqkukr\"iacngufbqkdpxlwjjt"
"\"xj\"\x66qofsqzkoah"
"nptiwwsqdep"
"gsnlxql\x30mjl"
"yeezwokjwrhelny\""
"bjauamn\\izpmzqqasid"
"tvjdbkn\"tiziw\x82r"
"w"
"xwoakbbnjnypnaa\xa9wft\"slrmoqkl"
"vwxtnlvaaasyruykgygrvpiopzygf\"vq"
"qdancvnvmhlmpj\\isdxs"
"xzc\\elw"
"b\"wxeqvy\"qf\"g\xcaoklsucwicyw\"dovr"
"yomlvvjdbngz\"rly\"afr"
"bfb\"x\"aweuwbwmoa\x13\"t\"zhr"
"\"dmfoxb\"qvpjzzhykt\xd2\"\"ryhxi"
"psqef\"yu\\qiflie\"\x79w"
"arzewkej\"lqmh\\sayyusxxo\\"
"vuvvp"
"hc\"lg\x6bcpupsewzklai\"l"
"cjdfygc\"auorqybnuqghsh\x10"
"j"
"wqjexk\"eyq\\lbroqhk\\dqzsqk"
"dws\"ru\"dvxfiwapif\"oqwzmle"
"agcykg\\jt\\vzklqjvknoe"
"kksd\"jmslja\\z\"y\\b\xaagpyojct"
"nnpipxufvbfpoz\"jno"
"dtw"
"xlolvtahvgqkx\\dgnhj\\spsclpcxv\\"
"mxea\\mbjpi"
"lgbotkk\"zmxh\\\\qji\"jszulnjsxkqf"
"lwckmhwhx\"gmftlb\x91am"
"xxdxqyxth"
"\"lmqhwkjxmvayxy"
"tf"
"qy"
"wdqmwxdztax\"m\"\x09\x11xdxmfwxmtqgwvf"
"\xcbnazlf\"ghziknszmsrahaf"
"e\x6aupmzhxlvwympgjjpdvo\"kylfa"
"\x81vhtlillb\xactgoatva"
"dvnlgr"
"f"
"xg\xfacwizsadgeclm"
"vnnrzbtw\"\\prod\\djbyppngwayy\""
"lrt\xf4jahwvfz"
"aqpnjtom\"ymkak\\dadfybqrso\\fwv"
"gz\"aac\"mrbk\"ktommrojraqh"
"wycamwoecsftepfnlcdkm"
"nrhddblbuzlqsl\x9cben"
"vckxhyqkmqmdseazcykrbysm"
"sil\xbbtevmt\"gvrvybui\"faw\"j"
"cjex\\tp\x45pzf"
"asjobvtxszfodgf\"ibftg"
"gkyjyjdrxdcllnh\"sjcibenrdnxv"
"oswsdpjyxpbwnqbcpl\"yrdvs\\zq"
"\"\"tyowzc\\fycbp\"jbwrbvgui"
"cbpcabqkdgzmpgcwjtrchxp"
"iyrzfh\x45gw\"fdlfpiaap\x31xqq"
"evgksznidz"
"b\\w\\"
"loufizbiy\x57aim\"bgk"
"qjfyk"
"g\"anmloghvgr\x07zwqougqhdz"
"usbbmwcxd\\bdgg"
"htitqcpczml"
"eke\\cqvpexqqk\"to\"tqmljrpn\xe6lji\""
"g\xd2ifdsej"
"h\"sk\"haajajpagtcqnzrfqn\xe6btzo"
"wfkuffdxlvm\\cvlyzlbyunclhmpp"
"myaavh\"spue"
"hqvez\x68d\"eo\"eaioh"
"s\"qd\"oyxxcglcdnuhk"
"ilqvar"
"srh"
"puuifxrfmpc\"bvalwi\x2blu\\"
"yywlbutufzysbncw\\nqsfbhpz\"mngjq"
"zbl\\jfcuop"
"hjdouiragzvxsqkreup\\"
"qi"
"ckx\\funlj\xa7ahi"
"k"
"ufrcnh\"ajteit"
"cqv\"bgjozjj\x60x\xa8yhvmdvutchjotyuz"
"hkuiet\"oku\x8cfhumfpasl"
"\"\\sbe\x4d"
"vhknazqt"
"eyyizvzcahgflvmoowvs\\jhvygci"
"kki\x3ewcefkgtjap\"xtpxh\"lzepoqj"
"wvtk"
"\"ynet"
"zh\\obk\"otagx\x59txfzf"
"ocowhxlx\xe6zqg\x63wx\\tclkhq\\vmaze"
"w\"cf"
"qpniprnrzrnvykghqnalr"
"jctcqra\"\x05dhlydpqamorqjsijt\\xjdgt"
"sig"
"qhlbidbflwxe\"xljbwls\x20vht"
"irmrebfla\xefsg\"j"
"nep"
"hjuvsqlizeqobepf"
"guzbcdp\"obyh"
"\"mjagins\xf9tqykaxy\""
"knvsdnmtr\"zervsb"
"hzuy"
"zza\"k\"buapb\\elm\xfeya"
"lrqar\"dfqwkaaqifig\"uixjsz"
"\"azuo\x40rmnlhhluwsbbdb\x32pk\\yu\"pbcf"
"dplkdyty"
"rfoyciebwlwphcycmguc"
"ivnmmiemhgytmlprq\\eh"
"lhkyzaaothfdhmbpsqd\\yyw"
"tnlzifupcjcaj"
"\\qiyirsdrfpmu\\\x15xusifaag"
"\\lcomf\\s"
"uramjivcirjhqcqcg"
"kkbaklbxfxikffnuhtu\xc6t\"d"
"n\xefai"
"\"toy\"bnbpevuzoc\"muywq\"gz\"grbm"
"\"muu\\wt"
"\\srby\"ee"
"erf\"gvw\"swfppf"
"pbqcgtn\"iuianhcdazfvmidn\\nslhxdf"
"uxbp"
"up\\mgrcyaegiwmjufn"
"nulscgcewj\\dvoyvhetdegzhs\""
"masv\"k\\rzrb"
"qtx\x79d\"xdxmbxrvhj"
"fid\\otpkgjlh\"qgsvexrckqtn\xf4"
"tagzu"
"bvl\\\"noseec"
"\\xgicuuh"
"w\"a\"npemf"
"sxp"
"nsmpktic\x8awxftscdcvijjobnq\"gjd"
"uks\"\"jxvyvfezz\"aynxoev\"cuoav"
"m"
"lkvokj"
"vkfam\"yllr\"q\x92o\x4ebecnvhshhqe\\"
"efdxcjkjverw"
"lmqzadwhfdgmep\x02tzfcbgrbfekhat"
"cpbk\x9azqegbpluczssouop\x36ztpuoxsw"
"cqwoczxdd\"erdjka"
"cwvqnjgbw\\fxdlby"
"mvtm"
"lt\"bbqzpumplkg"
"ntd\xeeuwweucnuuslqfzfq"
"y\xabl\"dbebxjrlbmuoo\\\x1au"
"qjoqx\\a"
"pu\"ekdnfpmly\xbago\""
"fjhhdy"
"arl"
"xcywisim\"bwuwf\"\"raepeawwjub"
"pbe"
"dbnqfpzyaumxtqnd\xc5dcqrkwyop"
"ojv\x40vtkwgkqepm\x8bzft\\vedrry"
"wggqkfbwqumsgajqwphjec\"mstxpwz"
"zjkbem"
"icpfqxbelxazlls"
"pvpqs\\abcmtyielugfgcv\"tjxapxqxnx"
"oqddwlvmtv\"\x39lyybylfb\"jmngnpjrdw"
"gisgbve"
"\"aglg"
"y\"\"ss\xafvhxlrjv"
"qbgqjsra"
"ihshbjgqpdcljpmdwdprwloy"
"djja\\wcdn\"svkrgpqn\"uz\"hc\x43hj"
"cbjm"
"pnn"
"pqvh\"noh"
"\"\\fdktlp"
"ncea"
"pqgzphiyy"
"\xbedovhxuipaohlcvkwtxwmpz\"ckaif\"r"
"arjuzbjowqciunfwgxtph\"vlhy\"n"
"c"
"nrpdxunulgudqzlhtae"
"iefheu\"uru\""
"aqijysxuijud\"np\\opbichhudil\xbesum"
"pfpevmtstl\"lde\"bzr\"vspdxs"
"vparfbdjwvzsocpnzhp"
"g\x4ffxaarafrsjthq\\\xc1rw"
"ng\\rqx\\gwpzucbh\xafl"
"rw\"nf\\dna"
"jkkeahxurxla\\g\xb3czrlsyimmwcwthr"
"twaailoypu\"oas\"kpuuyedlaw\\\xb0vzt"
"hznex\\gdiqvtugi"
"imdibsunjeswhk"
"ta\\icileuzpxro\"cfmv\"mzp"
"coykr\x57luiysucfaflmilhlehmvzeiepo"
"u\x3dfh\xd4yt"
"piw\x1bz\"eowy\"vfk\"wqiekw"
"gan\"y"
"p\"bevidoazcznr\"hddxuuq\""
"bwzucczznutbxe"
"z\"viqgyqjisior\\iecosmjbknol"
"dmlpcglcfkfsctxydjvayhymv\x3c\\gp"
"bfvkqrintbbvgfv"
"xlzntrgdck\"cprc\xadczyarbznqmuhxyuh"
"uqdxnuwioc\"kdytxq\\ig"
"xrafmucpmfi"
"vr\"hltmfrge"
"eonf\"nt\\wtcnsocs"
"j\xb7xoslyjeyjksplkqixncgkylkw"
"njw\"pefgfbez\x9axshdmplxzquqe"
"di\x58bvptfsafirpc"
"l\x1fkco"
"x"
"mprndo\"n"
"psegit"
"svbdnkkuuqs\"sqxu\"oqcyz\"aizashk"
"cwkljukxer\\\"\\nff\"esjwiyaoy"
"ilxrkgbjjxpvhdtq\"cpiuoofdnkpp"
"hlngi\"ulxep\\qohtmqnqjb\"rkgerho"
"gxws\"bcgm\"p"
"bv\"mds\\zhfusiepgrz\\b\x32fscdzz"
"l\xfampwtme\x69qvxnx\"\"\xc4jruuymjxrpsv"
"qqmxhrn"
"xziq\\\x18ybyv\x9am\"neacoqjzytertisysza"
"aqcbvlvcrzceeyx\\j\"\"x"
"yjuhhb"
"\x5em\"squulpy"
"dpbntplgmwb"
"utsgfkm\\vbftjknlktpthoeo"
"ccxjgiocmuhf\"ycnh"
"lltj\"kbbxi"

@ -0,0 +1,25 @@
with open("input") as f:
lines = [n.strip() for n in f.readlines()]
solution = 0
for line in lines:
char_count = 0
i = 1
while i < len(line) - 1:
char = line[i]
if char == "\\":
next_char = line[i + 1]
if next_char in ["\\", '"']:
i += 1
elif next_char in ["x"]:
i += 3
char_count += 1
i += 1
literal_count = len(line)
print(f"{line}: {literal_count=}, {char_count=}")
solution += literal_count - char_count
print(solution)

@ -0,0 +1,21 @@
with open("input") as f:
lines = [n.strip() for n in f.readlines()]
solution = 0
for line in lines:
literal_count = len(line)
char_count = 2 # surrounding double quotes: '"'
i = 0
while i < len(line):
char = line[i]
if char in ['"', "\\", ""]:
char_count += 1
char_count += 1
i += 1
print(f"{line}: {literal_count=}, {char_count=}")
solution += char_count - literal_count
print(solution)

@ -0,0 +1,28 @@
Faerun to Tristram = 65
Faerun to Tambi = 129
Faerun to Norrath = 144
Faerun to Snowdin = 71
Faerun to Straylight = 137
Faerun to AlphaCentauri = 3
Faerun to Arbre = 149
Tristram to Tambi = 63
Tristram to Norrath = 4
Tristram to Snowdin = 105
Tristram to Straylight = 125
Tristram to AlphaCentauri = 55
Tristram to Arbre = 14
Tambi to Norrath = 68
Tambi to Snowdin = 52
Tambi to Straylight = 65
Tambi to AlphaCentauri = 22
Tambi to Arbre = 143
Norrath to Snowdin = 8
Norrath to Straylight = 23
Norrath to AlphaCentauri = 136
Norrath to Arbre = 115
Snowdin to Straylight = 101
Snowdin to AlphaCentauri = 84
Snowdin to Arbre = 96
Straylight to AlphaCentauri = 107
Straylight to Arbre = 14
AlphaCentauri to Arbre = 46

@ -0,0 +1,43 @@
import itertools
with open("input") as f:
connections = [n.strip() for n in f.readlines()]
GRAPH = dict()
LOCATIONS = set()
for connection in connections:
[location_a, _, location_b, _, distance] = connection.split(" ")
distance = int(distance)
LOCATIONS.add(location_a)
LOCATIONS.add(location_b)
GRAPH[(location_a, location_b)] = distance
GRAPH[(location_b, location_a)] = distance
def calculate_distance(route):
dist = 0
for i in range(len(route) - 1):
location_a = route[i]
location_b = route[i + 1]
if (location_a, location_b) not in GRAPH:
return None
dist += GRAPH[(location_a, location_b)]
return dist
SHORTEST_ROUTE = None
SHORTEST_DISTANCE = None
for route in itertools.permutations(LOCATIONS, len(LOCATIONS)):
dist = calculate_distance(route)
if dist is None:
continue
if SHORTEST_DISTANCE is None or dist < SHORTEST_DISTANCE:
SHORTEST_DISTANCE = dist
SHORTEST_ROUTE = route
print(SHORTEST_ROUTE)
print(SHORTEST_DISTANCE)

@ -0,0 +1,43 @@
import itertools
with open("input") as f:
connections = [n.strip() for n in f.readlines()]
GRAPH = dict()
LOCATIONS = set()
for connection in connections:
[location_a, _, location_b, _, distance] = connection.split(" ")
distance = int(distance)
LOCATIONS.add(location_a)
LOCATIONS.add(location_b)
GRAPH[(location_a, location_b)] = distance
GRAPH[(location_b, location_a)] = distance
def calculate_distance(route):
dist = 0
for i in range(len(route) - 1):
location_a = route[i]
location_b = route[i + 1]
if (location_a, location_b) not in GRAPH:
return None
dist += GRAPH[(location_a, location_b)]
return dist
LONGEST_ROUTE = None
LONGEST_DISTANCE = None
for route in itertools.permutations(LOCATIONS, len(LOCATIONS)):
dist = calculate_distance(route)
if dist is None:
continue
if LONGEST_DISTANCE is None or dist > LONGEST_DISTANCE:
LONGEST_DISTANCE = dist
LONGEST_ROUTE = route
print(LONGEST_ROUTE)
print(LONGEST_DISTANCE)

@ -0,0 +1,94 @@
94 Pu 31221132221222112112322211 Np
93 Np 1311222113321132211221121332211 Hf Pa H Ca Pu
92 U 3 Pa
91 Pa 13 Th
90 Th 1113 Ac
89 Ac 3113 Ra
88 Ra 132113 Fr
87 Fr 1113122113 Rn
86 Rn 311311222113 Ho At
85 At 1322113 Po
84 Po 1113222113 Bi
83 Bi 3113322113 Pm Pb
82 Pb 123222113 Tl
81 Tl 111213322113 Hg
80 Hg 31121123222113 Au
79 Au 132112211213322113 Pt
78 Pt 111312212221121123222113 Ir
77 Ir 3113112211322112211213322113 Os
76 Os 1321132122211322212221121123222113 Re
75 Re 111312211312113221133211322112211213322113 Ge Ca W
74 W 312211322212221121123222113 Ta
73 Ta 13112221133211322112211213322113 Hf Pa H Ca W
72 Hf 11132 Lu
71 Lu 311312 Yb
70 Yb 1321131112 Tm
69 Tm 11131221133112 Er Ca Co
68 Er 311311222 Ho Pm
67 Ho 1321132 Dy
66 Dy 111312211312 Tb
65 Tb 3113112221131112 Ho Gd
64 Gd 13221133112 Eu Ca Co
63 Eu 1113222 Sm
62 Sm 311332 Pm Ca Zn
61 Pm 132 Nd
60 Nd 111312 Pr
59 Pr 31131112 Ce
58 Ce 1321133112 La H Ca Co
57 La 11131 Ba
56 Ba 311311 Cs
55 Cs 13211321 Xe
54 Xe 11131221131211 I
53 I 311311222113111221 Ho Te
52 Te 1322113312211 Eu Ca Sb
51 Sb 3112221 Pm Sn
50 Sn 13211 In
49 In 11131221 Cd
48 Cd 3113112211 Ag
47 Ag 132113212221 Pd
46 Pd 111312211312113211 Rh
45 Rh 311311222113111221131221 Ho Ru
44 Ru 132211331222113112211 Eu Ca Tc
43 Tc 311322113212221 Mo
42 Mo 13211322211312113211 Nb
41 Nb 1113122113322113111221131221 Er Zr
40 Zr 12322211331222113112211 Y H Ca Tc
39 Y 1112133 Sr U
38 Sr 3112112 Rb
37 Rb 1321122112 Kr
36 Kr 11131221222112 Br
35 Br 3113112211322112 Se
34 Se 13211321222113222112 As
33 As 11131221131211322113322112 Ge Na
32 Ge 31131122211311122113222 Ho Ga
31 Ga 13221133122211332 Eu Ca Ac H Ca Zn
30 Zn 312 Cu
29 Cu 131112 Ni
28 Ni 11133112 Zn Co
27 Co 32112 Fe
26 Fe 13122112 Mn
25 Mn 111311222112 Cr Si
24 Cr 31132 V
23 V 13211312 Ti
22 Ti 11131221131112 Sc
21 Sc 3113112221133112 Ho Pa H Ca Co
20 Ca 12 K
19 K 1112 Ar
18 Ar 3112 Cl
17 Cl 132112 S
16 S 1113122112 P
15 P 311311222112 Ho Si
14 Si 1322112 Al
13 Al 1113222112 Mg
12 Mg 3113322112 Pm Na
11 Na 123222112 Ne
10 Ne 111213322112 F
9 F 31121123222112 O
8 O 132112211213322112 N
7 N 111312212221121123222112 C
6 C 3113112211322112211213322112 B
5 B 1321132122211322212221121123222112 Be
4 Be 111312211312113221133211322112211213322112 Ge Ca Li
3 Li 312211322212221121123222112 He
2 He 13112221133211322112211213322112 Hf Pa H Ca Li
1 H 22 H

@ -0,0 +1 @@
1321131112

@ -0,0 +1,42 @@
with open("input") as f:
start_number = f.readline().strip()
# start_number = "211"
print("Start:", start_number)
def generate_next_number(number):
next_number = ""
last_char = ""
char_count = 0
for char in number:
# initialize
if not last_char:
last_char = char
char_count = 1
continue
# same as last char: increase count
if char == last_char:
char_count += 1
continue
# different than last char: append to next_number and initialize
next_number = next_number + str(char_count) + last_char
char_count = 1
last_char = char
next_number = next_number + str(char_count) + last_char
return next_number
for i in range(40):
print("Iteration:", i + 1)
prev_number = start_number
start_number = generate_next_number(start_number)
# print(f"{prev_number} -> {start_number}")
print("Solution:")
print(len(start_number))

@ -0,0 +1,41 @@
from collections import defaultdict
with open("input") as f:
start_number = f.readline().strip()
print("Start:", start_number, "length:", len(start_number))
ATOM_TO_NUMBER = dict()
NUMBER_TO_ATOM = dict()
DECAY = dict()
# From https://web.archive.org/web/20061224154744/http://www.uam.es/personal_pdi/ciencias/omartin/Biochem.PDF
with open("atoms") as f:
for line in f.readlines():
columns = line.strip().split(" ")
[_, atom, number] = columns[:3]
NUMBER_TO_ATOM[number] = atom
ATOM_TO_NUMBER[atom] = number
DECAY[atom] = columns[3:]
start_atom = NUMBER_TO_ATOM[start_number]
print("Starting with atom:", start_atom)
ATOM_COUNT = defaultdict(int)
ATOM_COUNT[start_atom] = 1
for i in range(50):
NEXT_ATOM_COUNT = defaultdict(int)
for atom, count in ATOM_COUNT.items():
for new_atom in DECAY[atom]:
NEXT_ATOM_COUNT[new_atom] += count
ATOM_COUNT = NEXT_ATOM_COUNT
length = 0
for atom, count in ATOM_COUNT.items():
length += len(ATOM_TO_NUMBER[atom]) * count
print("Round", i + 1, "len:", length)
print(length)

@ -0,0 +1 @@
vzbxkghb

@ -0,0 +1,85 @@
start_password = "vzbxkghb"
# start_password = "abcdefgh"
print("Start password:", start_password)
def b26_to_int(input_string):
result = 0
exp = 1
for char in input_string[::-1]:
char_value = ord(char) - 97 # from 0 to 25
result += char_value * exp
exp *= 26
return result
def int_to_b26(input_number):
result = ""
while input_number:
quot, remainder = divmod(input_number, 26)
result += chr(remainder + 97)
input_number = quot
return result[::-1]
def increment_password(password):
return int_to_b26(b26_to_int(password) + 1).rjust(8, "a")
STRAIGHTS = [chr(x + 97) + chr(x + 98) + chr(x + 99) for x in range(24)]
def has_increasing_straight(password):
for straight in STRAIGHTS:
if straight in password:
return True
return False
def has_forbidden_letter(password):
for char in ["i", "o", "l"]:
if char in password:
return True
return False
PAIRS = [chr(x + 97) + chr(x + 97) for x in range(26)]
def contains_two_pairs(password):
count_pairs = 0
for pair in PAIRS:
if pair in password:
count_pairs += 1
if count_pairs >= 2:
return True
return False
def validate_password(password):
return (
has_increasing_straight(password)
and not has_forbidden_letter(password)
and contains_two_pairs(password)
)
# to_int = b26_to_int(start_password)
# print(start_password, to_int, int_to_b26(to_int))
# print(start_password, increment_password(start_password))
# for pwd in ["hijklmmn", "abbceffg", "abbcegjk", "abcdffaa", "ghjaabcc"]:
# print(pwd)
# print(validate_password(pwd))
# print()
# print(STRAIGHTS)
# print(PAIRS)
while not validate_password(start_password):
start_password = increment_password(start_password)
print(start_password)
# false guess: vzcaabcc

@ -0,0 +1,90 @@
start_password = "vzbxkghb"
# start_password = "abcdefgh"
print("Start password:", start_password)
def b26_to_int(input_string):
result = 0
exp = 1
for char in input_string[::-1]:
char_value = ord(char) - 97 # from 0 to 25
result += char_value * exp
exp *= 26
return result
def int_to_b26(input_number):
result = ""
while input_number:
quot, remainder = divmod(input_number, 26)
result += chr(remainder + 97)
input_number = quot
return result[::-1]
def increment_password(password):
return int_to_b26(b26_to_int(password) + 1).rjust(8, "a")
STRAIGHTS = [chr(x + 97) + chr(x + 98) + chr(x + 99) for x in range(24)]
def has_increasing_straight(password):
for straight in STRAIGHTS:
if straight in password:
return True
return False
def has_forbidden_letter(password):
for char in ["i", "o", "l"]:
if char in password:
return True
return False
PAIRS = [chr(x + 97) + chr(x + 97) for x in range(26)]
def contains_two_pairs(password):
count_pairs = 0
for pair in PAIRS:
if pair in password:
count_pairs += 1
if count_pairs >= 2:
return True
return False
def validate_password(password):
return (
has_increasing_straight(password)
and not has_forbidden_letter(password)
and contains_two_pairs(password)
)
# to_int = b26_to_int(start_password)
# print(start_password, to_int, int_to_b26(to_int))
# print(start_password, increment_password(start_password))
# for pwd in ["hijklmmn", "abbceffg", "abbcegjk", "abcdffaa", "ghjaabcc"]:
# print(pwd)
# print(validate_password(pwd))
# print()
# print(STRAIGHTS)
# print(PAIRS)
while not validate_password(start_password):
start_password = increment_password(start_password)
start_password = increment_password(start_password)
while not validate_password(start_password):
start_password = increment_password(start_password)
print(start_password)
# false guess: vzcaabcc

File diff suppressed because one or more lines are too long

@ -0,0 +1,6 @@
import re
with open("input") as f:
document = f.readline().strip()
print(sum([int(x) for x in re.findall(r"[0-9-]+", document)]))

@ -0,0 +1,31 @@
import json
with open("input") as f:
document = f.readline().strip()
document = json.loads(document)
def iterate_object(json_object):
object_sum = 0
object_type = type(json_object)
if object_type == list:
for item in json_object:
object_sum += iterate_object(item)
elif object_type == int:
return json_object
elif object_type == str:
pass
elif object_type == dict:
for item in json_object.values():
if item == "red":
return 0
object_sum += iterate_object(item)
else:
raise TypeError(f"No case for type {object_type}!")
return object_sum
print(iterate_object(document))

@ -0,0 +1,56 @@
Alice would gain 54 happiness units by sitting next to Bob.
Alice would lose 81 happiness units by sitting next to Carol.
Alice would lose 42 happiness units by sitting next to David.
Alice would gain 89 happiness units by sitting next to Eric.
Alice would lose 89 happiness units by sitting next to Frank.
Alice would gain 97 happiness units by sitting next to George.
Alice would lose 94 happiness units by sitting next to Mallory.
Bob would gain 3 happiness units by sitting next to Alice.
Bob would lose 70 happiness units by sitting next to Carol.
Bob would lose 31 happiness units by sitting next to David.
Bob would gain 72 happiness units by sitting next to Eric.
Bob would lose 25 happiness units by sitting next to Frank.
Bob would lose 95 happiness units by sitting next to George.
Bob would gain 11 happiness units by sitting next to Mallory.
Carol would lose 83 happiness units by sitting next to Alice.
Carol would gain 8 happiness units by sitting next to Bob.
Carol would gain 35 happiness units by sitting next to David.
Carol would gain 10 happiness units by sitting next to Eric.
Carol would gain 61 happiness units by sitting next to Frank.
Carol would gain 10 happiness units by sitting next to George.
Carol would gain 29 happiness units by sitting next to Mallory.
David would gain 67 happiness units by sitting next to Alice.
David would gain 25 happiness units by sitting next to Bob.
David would gain 48 happiness units by sitting next to Carol.
David would lose 65 happiness units by sitting next to Eric.
David would gain 8 happiness units by sitting next to Frank.
David would gain 84 happiness units by sitting next to George.
David would gain 9 happiness units by sitting next to Mallory.
Eric would lose 51 happiness units by sitting next to Alice.
Eric would lose 39 happiness units by sitting next to Bob.
Eric would gain 84 happiness units by sitting next to Carol.
Eric would lose 98 happiness units by sitting next to David.
Eric would lose 20 happiness units by sitting next to Frank.
Eric would lose 6 happiness units by sitting next to George.
Eric would gain 60 happiness units by sitting next to Mallory.
Frank would gain 51 happiness units by sitting next to Alice.
Frank would gain 79 happiness units by sitting next to Bob.
Frank would gain 88 happiness units by sitting next to Carol.
Frank would gain 33 happiness units by sitting next to David.
Frank would gain 43 happiness units by sitting next to Eric.
Frank would gain 77 happiness units by sitting next to George.
Frank would lose 3 happiness units by sitting next to Mallory.
George would lose 14 happiness units by sitting next to Alice.
George would lose 12 happiness units by sitting next to Bob.
George would lose 52 happiness units by sitting next to Carol.
George would gain 14 happiness units by sitting next to David.
George would lose 62 happiness units by sitting next to Eric.
George would lose 18 happiness units by sitting next to Frank.
George would lose 17 happiness units by sitting next to Mallory.
Mallory would lose 36 happiness units by sitting next to Alice.
Mallory would gain 76 happiness units by sitting next to Bob.
Mallory would lose 34 happiness units by sitting next to Carol.
Mallory would gain 37 happiness units by sitting next to David.
Mallory would gain 40 happiness units by sitting next to Eric.
Mallory would gain 18 happiness units by sitting next to Frank.
Mallory would gain 7 happiness units by sitting next to George.

@ -0,0 +1,40 @@
from itertools import permutations
from collections import defaultdict
with open("input") as f:
instructions = [n.strip() for n in f.readlines()]
POINTS = defaultdict(int)
PERSONS = set()
for instruction in instructions:
person_a, _, sign, points, _, _, _, _, _, _, person_b = instruction.split(" ")
person_b = person_b.strip(".")
multiplicator = 1 if sign == "gain" else -1
points = int(points) * multiplicator
person_a, person_b = sorted([person_a, person_b])
POINTS[(person_a, person_b)] += points
PERSONS.add(person_a)
PERSONS.add(person_b)
print("POINTS", POINTS)
print("PERSONS", PERSONS)
HIGHEST_POINTS = None
SEATING_ORDER = None
for seating_plan in permutations(PERSONS, len(PERSONS)):
points = 0
seating_plan = list(seating_plan)
for person_a, person_b in zip(seating_plan, seating_plan[1:] + seating_plan[:1]):
person_a, person_b = sorted([person_a, person_b])
points += POINTS[(person_a, person_b)]
if HIGHEST_POINTS is None or HIGHEST_POINTS < points:
HIGHEST_POINTS = points
SEATING_ORDER = seating_plan
print("Best order:", SEATING_ORDER)
print(HIGHEST_POINTS)

@ -0,0 +1,42 @@
from itertools import permutations
from collections import defaultdict
with open("input") as f:
instructions = [n.strip() for n in f.readlines()]
POINTS = defaultdict(int)
PERSONS = set()
PERSONS.add("Me!")
for instruction in instructions:
person_a, _, sign, points, _, _, _, _, _, _, person_b = instruction.split(" ")
person_b = person_b.strip(".")
multiplicator = 1 if sign == "gain" else -1
points = int(points) * multiplicator
person_a, person_b = sorted([person_a, person_b])
POINTS[(person_a, person_b)] += points
PERSONS.add(person_a)
PERSONS.add(person_b)
print("POINTS", POINTS)
print("PERSONS", PERSONS)
print()
HIGHEST_POINTS = None
SEATING_ORDER = None
for seating_plan in permutations(PERSONS, len(PERSONS)):
points = 0
seating_plan = list(seating_plan)
for person_a, person_b in zip(seating_plan, seating_plan[1:] + seating_plan[:1]):
person_a, person_b = sorted([person_a, person_b])
points += POINTS[(person_a, person_b)]
if HIGHEST_POINTS is None or HIGHEST_POINTS < points:
HIGHEST_POINTS = points
SEATING_ORDER = seating_plan
print("Best order:", SEATING_ORDER)
print(HIGHEST_POINTS)

@ -0,0 +1,9 @@
Vixen can fly 19 km/s for 7 seconds, but then must rest for 124 seconds.
Rudolph can fly 3 km/s for 15 seconds, but then must rest for 28 seconds.
Donner can fly 19 km/s for 9 seconds, but then must rest for 164 seconds.
Blitzen can fly 19 km/s for 9 seconds, but then must rest for 158 seconds.
Comet can fly 13 km/s for 7 seconds, but then must rest for 82 seconds.
Cupid can fly 25 km/s for 6 seconds, but then must rest for 145 seconds.
Dasher can fly 14 km/s for 3 seconds, but then must rest for 38 seconds.
Dancer can fly 3 km/s for 16 seconds, but then must rest for 37 seconds.
Prancer can fly 25 km/s for 6 seconds, but then must rest for 143 seconds.

@ -0,0 +1,28 @@
import re
with open("input") as f:
reindeers = [n.strip() for n in f.readlines()]
TIME_ELAPSED = 2503
max_distance = 0
for reindeer in reindeers:
name = reindeer.split(" ")[0]
[speed, fly_time, rest_time] = [int(x) for x in re.findall("[0-9]+", reindeer)]
cycle = fly_time + rest_time
count_cycles, rest = divmod(TIME_ELAPSED, cycle)
rest = min(rest, fly_time)
distance = count_cycles * fly_time * speed + rest * speed
print(
f"{name.ljust(8)}: {speed}km/s for {fly_time}s, rest {rest_time}s -> {distance}km"
)
if distance > max_distance:
max_distance = distance
print()
print(max_distance)

@ -0,0 +1,54 @@
import re
from collections import defaultdict
with open("input") as f:
lines = [n.strip() for n in f.readlines()]
MAX_TIME = 2503
# MAX_TIME = 1000
def get_distance(speed, fly_time, rest_time, time_elapsed):
cycle = fly_time + rest_time
count_cycles, rest = divmod(time_elapsed, cycle)
rest = min(rest, fly_time)
distance = count_cycles * fly_time * speed + rest * speed
return distance
reindeers = list()
for line in lines:
name = line.split(" ")[0]
[speed, fly_time, rest_time] = [int(x) for x in re.findall("[0-9]+", line)]
reindeers.append((name, speed, fly_time, rest_time))
# example:
# reindeers = [("Comet", 14, 10, 127), ("Dancer", 16, 11, 162)]
POINTS = defaultdict(int)
for second in range(1, MAX_TIME + 1):
max_distance = None
leaders = []
for reindeer in reindeers:
name, speed, fly_time, rest_time = reindeer
distance = get_distance(speed, fly_time, rest_time, second)
if max_distance is None or distance > max_distance:
max_distance = distance
leaders = [name]
elif distance == max_distance:
leaders.append(name)
for leader in leaders:
POINTS[leader] += 1
print("Standings:")
for name, points in POINTS.items():
print(f" {name.ljust(8)}: {points}")
print()
print("Winner points:")
print(max(POINTS.values()))
# 472: too low

@ -0,0 +1,2 @@
Butterscotch: capacity -1, durability -2, flavor 6, texture 3, calories 8
Cinnamon: capacity 2, durability 3, flavor -2, texture -1, calories 3

@ -0,0 +1,4 @@
Sprinkles: capacity 5, durability -1, flavor 0, texture 0, calories 5
PeanutButter: capacity -1, durability 3, flavor 0, texture 0, calories 1
Frosting: capacity 0, durability -1, flavor 4, texture 0, calories 6
Sugar: capacity -1, durability 0, flavor 0, texture 2, calories 8

@ -0,0 +1,68 @@
import re
import numpy as np
# list of ingredients
# each line is an ingredient
# each col is the property
INGREDIENTS = []
with open("input") as f:
lines = [n.strip() for n in f.readlines()]
for line in lines:
values = re.findall("-?[0-9]+", line)
values = [int(x) for x in values]
INGREDIENTS.append(values)
NUM_INGREDIENTS = len(INGREDIENTS)
NUM_PROPERTIES = len(INGREDIENTS[0])
# list of properties
# each line is a property
# ech col is theingredient
PROPERTIES = np.zeros((NUM_PROPERTIES, NUM_INGREDIENTS))
for idx_a, values in enumerate(INGREDIENTS):
for idx_b, value in enumerate(values):
PROPERTIES[idx_b][idx_a] = value
print(INGREDIENTS)
print(PROPERTIES)
max_score = 0
amounts = None
for a in range(0, 101):
print(a)
for b in range(0, 101 - a):
for c in range(0, 101 - (a + b)):
for d in range(0, 101 - (a + b + c)):
score = 1
multipliers = [a, b, c, d]
for prop in PROPERTIES[:-1]:
prop_sum = sum([a * b for a, b in zip(prop, multipliers)])
if prop_sum < 0:
prop_sum = 0
score *= prop_sum
if score > max_score:
max_score = score
amounts = [a, b, c, d]
# print("New leader:", score, amounts)
print("finish")
print(int(max_score))
print(amounts)
multipliers = amounts
score = 1
for prop in PROPERTIES:
prop_sum = sum([a * b for a, b in zip(prop, multipliers)])
if prop_sum < 0:
prop_sum = 0
score *= prop_sum
print("score", prop_sum)
# 35087450112 too high [0, 0, ?, ?]
# 6211814400 too high [28, 32, 18, 22]

@ -0,0 +1,71 @@
import re
import numpy as np
# list of ingredients
# each line is an ingredient
# each col is the property
INGREDIENTS = []
with open("input") as f:
lines = [n.strip() for n in f.readlines()]
for line in lines:
values = re.findall("-?[0-9]+", line)
values = [int(x) for x in values]
INGREDIENTS.append(values)
NUM_INGREDIENTS = len(INGREDIENTS)
NUM_PROPERTIES = len(INGREDIENTS[0])
# list of properties
# each line is a property
# ech col is theingredient
PROPERTIES = np.zeros((NUM_PROPERTIES, NUM_INGREDIENTS))
for idx_a, values in enumerate(INGREDIENTS):
for idx_b, value in enumerate(values):
PROPERTIES[idx_b][idx_a] = value
print(INGREDIENTS)
print(PROPERTIES)
max_score = 0
amounts = None
for a in range(0, 101):
print(a)
for b in range(0, 101 - a):
for c in range(0, 101 - (a + b)):
for d in range(0, 101 - (a + b + c)):
score = 1
multipliers = [a, b, c, d]
calorie_sum = sum([a * b for a, b in zip(PROPERTIES[-1], multipliers)])
if calorie_sum != 500:
continue
for prop in PROPERTIES[:-1]:
prop_sum = sum([a * b for a, b in zip(prop, multipliers)])
if prop_sum < 0:
prop_sum = 0
score *= prop_sum
if score > max_score:
max_score = score
amounts = [a, b, c, d]
# print("New leader:", score, amounts)
print("finish")
print(int(max_score))
print(amounts)
multipliers = amounts
score = 1
for prop in PROPERTIES:
prop_sum = sum([a * b for a, b in zip(prop, multipliers)])
if prop_sum < 0:
prop_sum = 0
score *= prop_sum
print("score", prop_sum)
# 35087450112 too high [0, 0, ?, ?]
# 6211814400 too high [28, 32, 18, 22]

@ -0,0 +1,10 @@
children: 3
cats: 7
samoyeds: 2
pomeranians: 3
akitas: 0
vizslas: 0
goldfish: 5
trees: 3
cars: 2
perfumes: 1

@ -0,0 +1,500 @@
Sue 1: goldfish: 6, trees: 9, akitas: 0
Sue 2: goldfish: 7, trees: 1, akitas: 0
Sue 3: cars: 10, akitas: 6, perfumes: 7
Sue 4: perfumes: 2, vizslas: 0, cars: 6
Sue 5: goldfish: 1, trees: 3, perfumes: 10
Sue 6: children: 9, vizslas: 7, cars: 9
Sue 7: cars: 6, vizslas: 5, cats: 3
Sue 8: akitas: 10, vizslas: 9, children: 3
Sue 9: vizslas: 8, cats: 2, trees: 1
Sue 10: perfumes: 10, trees: 6, cars: 4
Sue 11: cars: 9, children: 1, cats: 1
Sue 12: pomeranians: 4, akitas: 6, goldfish: 8
Sue 13: cats: 10, children: 5, trees: 9
Sue 14: perfumes: 8, vizslas: 3, samoyeds: 1
Sue 15: vizslas: 2, perfumes: 8, trees: 3
Sue 16: pomeranians: 10, trees: 9, samoyeds: 4
Sue 17: akitas: 7, vizslas: 0, goldfish: 6
Sue 18: trees: 5, vizslas: 9, cars: 0
Sue 19: akitas: 3, goldfish: 9, trees: 10
Sue 20: perfumes: 7, samoyeds: 3, vizslas: 10
Sue 21: perfumes: 7, pomeranians: 10, akitas: 8
Sue 22: vizslas: 6, trees: 8, akitas: 10
Sue 23: goldfish: 0, trees: 4, children: 9
Sue 24: goldfish: 7, pomeranians: 9, akitas: 4
Sue 25: cars: 7, trees: 4, pomeranians: 4
Sue 26: trees: 9, akitas: 9, pomeranians: 7
Sue 27: samoyeds: 0, perfumes: 9, goldfish: 10
Sue 28: cars: 5, trees: 7, vizslas: 1
Sue 29: perfumes: 9, trees: 1, children: 6
Sue 30: goldfish: 10, trees: 0, cars: 4
Sue 31: akitas: 2, perfumes: 5, goldfish: 5
Sue 32: goldfish: 0, akitas: 5, trees: 0
Sue 33: vizslas: 2, akitas: 2, samoyeds: 3
Sue 34: goldfish: 8, perfumes: 5, cars: 3
Sue 35: akitas: 1, cats: 4, trees: 9
Sue 36: cars: 4, vizslas: 4, goldfish: 7
Sue 37: akitas: 5, perfumes: 7, trees: 3
Sue 38: goldfish: 10, trees: 2, vizslas: 9
Sue 39: goldfish: 4, pomeranians: 5, vizslas: 5
Sue 40: perfumes: 5, samoyeds: 4, akitas: 6
Sue 41: goldfish: 9, cars: 4, perfumes: 5
Sue 42: trees: 6, pomeranians: 9, goldfish: 8
Sue 43: perfumes: 7, pomeranians: 1, akitas: 2
Sue 44: vizslas: 9, cars: 5, cats: 0
Sue 45: akitas: 1, goldfish: 6, trees: 0
Sue 46: akitas: 5, vizslas: 8, trees: 2
Sue 47: trees: 9, akitas: 2, vizslas: 9
Sue 48: goldfish: 10, trees: 5, akitas: 2
Sue 49: cars: 7, vizslas: 2, perfumes: 6
Sue 50: akitas: 5, goldfish: 6, perfumes: 0
Sue 51: cars: 9, cats: 7, trees: 5
Sue 52: akitas: 7, goldfish: 10, cars: 0
Sue 53: cars: 10, cats: 4, perfumes: 2
Sue 54: goldfish: 2, pomeranians: 5, perfumes: 10
Sue 55: vizslas: 5, akitas: 4, cars: 8
Sue 56: goldfish: 9, vizslas: 4, akitas: 5
Sue 57: perfumes: 8, samoyeds: 7, cars: 9
Sue 58: cars: 5, akitas: 7, perfumes: 8
Sue 59: samoyeds: 8, cars: 10, vizslas: 10
Sue 60: akitas: 6, samoyeds: 0, goldfish: 3
Sue 61: trees: 8, pomeranians: 0, akitas: 2
Sue 62: trees: 1, perfumes: 3, vizslas: 4
Sue 63: vizslas: 6, samoyeds: 9, goldfish: 8
Sue 64: goldfish: 7, trees: 6, vizslas: 3
Sue 65: cars: 1, vizslas: 0, akitas: 6
Sue 66: cats: 6, pomeranians: 4, cars: 9
Sue 67: trees: 10, pomeranians: 7, samoyeds: 3
Sue 68: pomeranians: 5, goldfish: 9, akitas: 1
Sue 69: akitas: 1, vizslas: 0, trees: 9
Sue 70: cats: 4, goldfish: 4, vizslas: 10
Sue 71: vizslas: 7, perfumes: 7, trees: 8
Sue 72: children: 2, vizslas: 9, cats: 3
Sue 73: cars: 8, pomeranians: 0, perfumes: 6
Sue 74: akitas: 1, pomeranians: 8, vizslas: 10
Sue 75: vizslas: 5, perfumes: 5, cars: 7
Sue 76: cars: 3, vizslas: 3, goldfish: 0
Sue 77: akitas: 9, samoyeds: 1, pomeranians: 3
Sue 78: trees: 0, vizslas: 0, akitas: 6
Sue 79: pomeranians: 9, cars: 1, perfumes: 0
Sue 80: perfumes: 10, trees: 1, cats: 0
Sue 81: goldfish: 5, akitas: 9, trees: 0
Sue 82: vizslas: 1, akitas: 6, children: 4
Sue 83: samoyeds: 7, perfumes: 8, pomeranians: 4
Sue 84: perfumes: 3, children: 3, cats: 7
Sue 85: goldfish: 9, trees: 3, cars: 9
Sue 86: cars: 0, perfumes: 9, vizslas: 0
Sue 87: children: 3, trees: 4, akitas: 3
Sue 88: trees: 1, samoyeds: 1, goldfish: 0
Sue 89: akitas: 8, cars: 3, vizslas: 9
Sue 90: pomeranians: 9, trees: 9, goldfish: 8
Sue 91: goldfish: 7, trees: 10, children: 0
Sue 92: cats: 9, cars: 7, perfumes: 7
Sue 93: vizslas: 2, goldfish: 7, cats: 9
Sue 94: akitas: 5, cars: 8, vizslas: 4
Sue 95: goldfish: 7, vizslas: 1, perfumes: 2
Sue 96: goldfish: 5, trees: 6, perfumes: 10
Sue 97: trees: 0, perfumes: 7, cars: 0
Sue 98: cars: 2, perfumes: 6, trees: 8
Sue 99: trees: 10, children: 7, cats: 9
Sue 100: samoyeds: 5, goldfish: 6, vizslas: 6
Sue 101: cars: 10, perfumes: 9, vizslas: 3
Sue 102: pomeranians: 6, trees: 1, samoyeds: 4
Sue 103: cars: 2, perfumes: 1, goldfish: 5
Sue 104: goldfish: 2, cars: 8, pomeranians: 2
Sue 105: goldfish: 6, vizslas: 0, trees: 10
Sue 106: trees: 10, akitas: 10, pomeranians: 0
Sue 107: vizslas: 2, pomeranians: 10, trees: 3
Sue 108: children: 3, vizslas: 8, akitas: 7
Sue 109: perfumes: 2, akitas: 2, samoyeds: 3
Sue 110: goldfish: 7, trees: 1, perfumes: 1
Sue 111: akitas: 2, cars: 9, perfumes: 2
Sue 112: children: 10, cars: 0, akitas: 3
Sue 113: akitas: 9, vizslas: 4, children: 3
Sue 114: pomeranians: 3, trees: 2, goldfish: 5
Sue 115: perfumes: 8, cars: 6, trees: 0
Sue 116: samoyeds: 6, children: 3, pomeranians: 1
Sue 117: goldfish: 1, trees: 2, akitas: 1
Sue 118: goldfish: 10, akitas: 10, samoyeds: 0
Sue 119: vizslas: 10, perfumes: 6, cars: 0
Sue 120: cars: 2, perfumes: 9, goldfish: 5
Sue 121: vizslas: 2, trees: 2, cars: 6
Sue 122: vizslas: 3, trees: 0, akitas: 2
Sue 123: akitas: 5, samoyeds: 7, goldfish: 1
Sue 124: goldfish: 8, samoyeds: 7, trees: 8
Sue 125: trees: 3, goldfish: 8, perfumes: 5
Sue 126: cats: 3, vizslas: 9, goldfish: 0
Sue 127: pomeranians: 9, goldfish: 3, perfumes: 6
Sue 128: vizslas: 4, cars: 8, goldfish: 5
Sue 129: vizslas: 8, children: 5, perfumes: 8
Sue 130: cars: 7, children: 7, cats: 3
Sue 131: perfumes: 1, akitas: 8, vizslas: 9
Sue 132: perfumes: 7, samoyeds: 10, pomeranians: 6
Sue 133: cars: 5, perfumes: 3, goldfish: 7
Sue 134: perfumes: 9, akitas: 2, cats: 3
Sue 135: perfumes: 1, trees: 9, vizslas: 9
Sue 136: akitas: 7, cars: 3, perfumes: 7
Sue 137: vizslas: 9, goldfish: 8, cars: 5
Sue 138: trees: 0, samoyeds: 1, cars: 3
Sue 139: cars: 0, perfumes: 6, trees: 0
Sue 140: pomeranians: 4, cars: 1, perfumes: 7
Sue 141: vizslas: 10, akitas: 8, cats: 3
Sue 142: trees: 1, cats: 6, vizslas: 5
Sue 143: pomeranians: 9, cars: 7, perfumes: 9
Sue 144: cars: 0, perfumes: 2, pomeranians: 1
Sue 145: trees: 1, goldfish: 9, perfumes: 8
Sue 146: cars: 8, children: 5, vizslas: 2
Sue 147: perfumes: 2, goldfish: 5, cars: 0
Sue 148: akitas: 2, perfumes: 7, pomeranians: 6
Sue 149: goldfish: 8, cars: 0, trees: 1
Sue 150: akitas: 6, perfumes: 5, trees: 0
Sue 151: vizslas: 6, samoyeds: 8, akitas: 10
Sue 152: trees: 7, akitas: 7, perfumes: 6
Sue 153: goldfish: 9, cats: 9, cars: 3
Sue 154: vizslas: 10, trees: 0, cars: 9
Sue 155: perfumes: 3, children: 2, goldfish: 1
Sue 156: goldfish: 7, perfumes: 5, akitas: 6
Sue 157: cats: 10, trees: 1, goldfish: 0
Sue 158: cats: 7, children: 7, vizslas: 6
Sue 159: perfumes: 9, akitas: 0, cars: 0
Sue 160: akitas: 3, goldfish: 10, pomeranians: 2
Sue 161: goldfish: 10, cars: 6, perfumes: 3
Sue 162: trees: 0, cars: 9, goldfish: 1
Sue 163: cars: 8, perfumes: 9, vizslas: 5
Sue 164: goldfish: 1, trees: 10, children: 6
Sue 165: goldfish: 0, vizslas: 6, cars: 0
Sue 166: akitas: 5, vizslas: 1, cars: 5
Sue 167: vizslas: 1, samoyeds: 1, children: 4
Sue 168: samoyeds: 7, vizslas: 7, akitas: 3
Sue 169: goldfish: 3, cats: 9, trees: 2
Sue 170: cars: 5, perfumes: 9, vizslas: 5
Sue 171: goldfish: 7, cars: 6, perfumes: 10
Sue 172: cats: 6, akitas: 1, children: 6
Sue 173: cats: 4, goldfish: 1, children: 3
Sue 174: cars: 2, pomeranians: 2, vizslas: 7
Sue 175: trees: 0, children: 4, goldfish: 7
Sue 176: children: 8, cars: 5, cats: 9
Sue 177: pomeranians: 4, vizslas: 7, trees: 3
Sue 178: vizslas: 6, perfumes: 10, akitas: 6
Sue 179: cars: 4, akitas: 4, trees: 4
Sue 180: akitas: 8, goldfish: 6, trees: 9
Sue 181: perfumes: 3, vizslas: 10, cars: 3
Sue 182: vizslas: 3, samoyeds: 3, goldfish: 7
Sue 183: goldfish: 10, perfumes: 2, cats: 1
Sue 184: goldfish: 5, trees: 1, perfumes: 1
Sue 185: vizslas: 10, trees: 9, perfumes: 2
Sue 186: goldfish: 6, perfumes: 9, trees: 1
Sue 187: cars: 0, trees: 9, goldfish: 6
Sue 188: cars: 0, trees: 1, vizslas: 9
Sue 189: akitas: 7, vizslas: 2, trees: 0
Sue 190: pomeranians: 5, perfumes: 8, akitas: 10
Sue 191: vizslas: 5, akitas: 3, cats: 0
Sue 192: children: 1, trees: 1, cars: 2
Sue 193: cars: 3, goldfish: 9, trees: 2
Sue 194: samoyeds: 3, akitas: 4, perfumes: 8
Sue 195: trees: 1, vizslas: 8, akitas: 10
Sue 196: akitas: 6, cars: 5, pomeranians: 0
Sue 197: akitas: 5, vizslas: 5, cats: 1
Sue 198: trees: 4, cars: 6, goldfish: 6
Sue 199: cats: 7, cars: 5, goldfish: 6
Sue 200: vizslas: 4, cats: 0, akitas: 9
Sue 201: pomeranians: 1, perfumes: 4, children: 2
Sue 202: cats: 1, perfumes: 4, vizslas: 3
Sue 203: vizslas: 1, akitas: 9, children: 5
Sue 204: perfumes: 8, cars: 7, trees: 4
Sue 205: perfumes: 7, pomeranians: 5, cats: 9
Sue 206: vizslas: 8, trees: 2, akitas: 2
Sue 207: akitas: 6, vizslas: 2, perfumes: 10
Sue 208: vizslas: 1, children: 7, akitas: 4
Sue 209: perfumes: 4, trees: 2, children: 1
Sue 210: goldfish: 0, vizslas: 2, samoyeds: 10
Sue 211: cars: 8, perfumes: 3, trees: 1
Sue 212: cars: 8, samoyeds: 5, pomeranians: 8
Sue 213: akitas: 2, goldfish: 8, pomeranians: 2
Sue 214: akitas: 6, pomeranians: 2, cars: 0
Sue 215: trees: 10, pomeranians: 4, vizslas: 0
Sue 216: perfumes: 0, cars: 8, trees: 0
Sue 217: samoyeds: 8, akitas: 7, children: 10
Sue 218: perfumes: 1, vizslas: 6, children: 0
Sue 219: children: 1, goldfish: 4, trees: 1
Sue 220: akitas: 10, goldfish: 10, trees: 5
Sue 221: cars: 7, pomeranians: 6, perfumes: 3
Sue 222: vizslas: 6, children: 0, akitas: 5
Sue 223: perfumes: 9, cars: 1, trees: 6
Sue 224: pomeranians: 1, trees: 0, vizslas: 0
Sue 225: goldfish: 8, akitas: 4, perfumes: 10
Sue 226: pomeranians: 7, cats: 7, children: 4
Sue 227: trees: 0, akitas: 2, perfumes: 1
Sue 228: vizslas: 6, cars: 10, perfumes: 9
Sue 229: cars: 0, perfumes: 6, trees: 4
Sue 230: pomeranians: 7, perfumes: 5, trees: 2
Sue 231: goldfish: 9, cars: 6, trees: 7
Sue 232: akitas: 1, vizslas: 5, cars: 3
Sue 233: akitas: 7, samoyeds: 2, vizslas: 5
Sue 234: akitas: 6, cats: 8, pomeranians: 0
Sue 235: pomeranians: 5, akitas: 5, vizslas: 3
Sue 236: goldfish: 5, trees: 6, akitas: 5
Sue 237: goldfish: 9, perfumes: 5, cats: 5
Sue 238: cats: 8, goldfish: 4, perfumes: 0
Sue 239: samoyeds: 8, children: 6, pomeranians: 6
Sue 240: akitas: 4, samoyeds: 10, trees: 8
Sue 241: trees: 2, goldfish: 8, cars: 1
Sue 242: perfumes: 2, cars: 0, akitas: 10
Sue 243: pomeranians: 1, cars: 7, trees: 2
Sue 244: trees: 9, vizslas: 2, akitas: 10
Sue 245: cars: 9, pomeranians: 4, trees: 0
Sue 246: cars: 9, pomeranians: 7, perfumes: 1
Sue 247: trees: 0, goldfish: 1, akitas: 8
Sue 248: vizslas: 1, cats: 4, akitas: 4
Sue 249: cats: 6, children: 4, goldfish: 9
Sue 250: vizslas: 1, cars: 10, samoyeds: 5
Sue 251: cars: 0, goldfish: 1, vizslas: 7
Sue 252: cars: 7, akitas: 9, vizslas: 10
Sue 253: akitas: 7, vizslas: 2, perfumes: 5
Sue 254: vizslas: 10, akitas: 5, samoyeds: 0
Sue 255: pomeranians: 8, goldfish: 0, cats: 6
Sue 256: cars: 10, goldfish: 8, vizslas: 9
Sue 257: goldfish: 3, perfumes: 9, cats: 3
Sue 258: trees: 6, goldfish: 6, cars: 6
Sue 259: trees: 0, goldfish: 2, perfumes: 8
Sue 260: trees: 5, akitas: 0, cars: 0
Sue 261: pomeranians: 9, goldfish: 7, perfumes: 8
Sue 262: perfumes: 8, vizslas: 6, goldfish: 2
Sue 263: vizslas: 6, trees: 5, goldfish: 9
Sue 264: vizslas: 4, perfumes: 7, cars: 9
Sue 265: goldfish: 10, trees: 3, perfumes: 1
Sue 266: trees: 10, akitas: 8, goldfish: 8
Sue 267: goldfish: 4, trees: 0, samoyeds: 9
Sue 268: vizslas: 1, trees: 0, goldfish: 8
Sue 269: cars: 2, perfumes: 10, goldfish: 5
Sue 270: perfumes: 7, cars: 2, vizslas: 1
Sue 271: cars: 6, perfumes: 10, goldfish: 6
Sue 272: samoyeds: 4, goldfish: 2, vizslas: 9
Sue 273: perfumes: 4, goldfish: 4, vizslas: 1
Sue 274: children: 4, cars: 4, perfumes: 3
Sue 275: children: 8, vizslas: 3, trees: 2
Sue 276: vizslas: 5, children: 7, perfumes: 3
Sue 277: perfumes: 3, cats: 4, vizslas: 5
Sue 278: cars: 1, samoyeds: 10, akitas: 2
Sue 279: trees: 9, perfumes: 9, cars: 10
Sue 280: vizslas: 5, trees: 0, perfumes: 6
Sue 281: vizslas: 3, akitas: 10, pomeranians: 7
Sue 282: trees: 1, children: 2, akitas: 8
Sue 283: akitas: 9, goldfish: 6, cats: 5
Sue 284: cars: 9, children: 10, pomeranians: 2
Sue 285: pomeranians: 0, perfumes: 4, cars: 7
Sue 286: perfumes: 0, vizslas: 10, akitas: 10
Sue 287: cats: 2, perfumes: 3, trees: 5
Sue 288: akitas: 9, vizslas: 8, samoyeds: 9
Sue 289: perfumes: 6, children: 2, cars: 7
Sue 290: akitas: 0, children: 5, cars: 5
Sue 291: cars: 4, perfumes: 0, trees: 1
Sue 292: cats: 0, cars: 8, perfumes: 6
Sue 293: akitas: 9, cats: 5, children: 5
Sue 294: akitas: 4, cars: 9, goldfish: 3
Sue 295: cars: 2, akitas: 3, perfumes: 7
Sue 296: perfumes: 4, cars: 7, goldfish: 10
Sue 297: trees: 5, akitas: 8, vizslas: 1
Sue 298: perfumes: 0, goldfish: 6, trees: 9
Sue 299: perfumes: 6, samoyeds: 8, cars: 1
Sue 300: goldfish: 10, perfumes: 4, akitas: 2
Sue 301: cars: 3, trees: 0, goldfish: 8
Sue 302: perfumes: 7, samoyeds: 2, vizslas: 7
Sue 303: children: 10, goldfish: 7, perfumes: 2
Sue 304: samoyeds: 8, vizslas: 2, cars: 1
Sue 305: trees: 1, cats: 0, goldfish: 10
Sue 306: trees: 4, perfumes: 2, cars: 7
Sue 307: cars: 6, vizslas: 2, children: 6
Sue 308: vizslas: 2, cars: 0, akitas: 7
Sue 309: cars: 3, vizslas: 8, perfumes: 6
Sue 310: goldfish: 7, perfumes: 7, vizslas: 3
Sue 311: pomeranians: 10, trees: 2, cars: 0
Sue 312: samoyeds: 2, vizslas: 9, akitas: 1
Sue 313: cars: 4, pomeranians: 7, goldfish: 7
Sue 314: akitas: 2, pomeranians: 9, samoyeds: 10
Sue 315: akitas: 3, vizslas: 2, trees: 0
Sue 316: cars: 0, perfumes: 4, pomeranians: 6
Sue 317: akitas: 10, goldfish: 3, pomeranians: 7
Sue 318: cars: 9, trees: 0, pomeranians: 9
Sue 319: akitas: 3, vizslas: 7, children: 10
Sue 320: vizslas: 0, akitas: 8, pomeranians: 4
Sue 321: cars: 10, akitas: 9, vizslas: 3
Sue 322: perfumes: 0, akitas: 8, vizslas: 6
Sue 323: vizslas: 10, perfumes: 5, cars: 3
Sue 324: akitas: 0, goldfish: 6, vizslas: 7
Sue 325: perfumes: 9, vizslas: 5, pomeranians: 2
Sue 326: vizslas: 6, goldfish: 10, pomeranians: 8
Sue 327: vizslas: 10, cars: 1, akitas: 7
Sue 328: trees: 1, perfumes: 10, cars: 10
Sue 329: pomeranians: 5, samoyeds: 3, cars: 10
Sue 330: akitas: 6, cars: 1, pomeranians: 4
Sue 331: cars: 5, children: 2, trees: 0
Sue 332: vizslas: 6, pomeranians: 1, perfumes: 0
Sue 333: akitas: 7, trees: 1, cats: 9
Sue 334: vizslas: 6, goldfish: 9, akitas: 7
Sue 335: akitas: 3, samoyeds: 3, cars: 3
Sue 336: samoyeds: 10, perfumes: 9, trees: 6
Sue 337: vizslas: 2, cars: 9, akitas: 0
Sue 338: akitas: 6, perfumes: 9, vizslas: 3
Sue 339: cars: 3, samoyeds: 8, trees: 2
Sue 340: cats: 7, perfumes: 8, cars: 9
Sue 341: goldfish: 9, perfumes: 5, cars: 10
Sue 342: trees: 0, akitas: 3, perfumes: 5
Sue 343: perfumes: 2, children: 0, cars: 6
Sue 344: goldfish: 8, trees: 8, perfumes: 0
Sue 345: perfumes: 6, cars: 6, goldfish: 5
Sue 346: vizslas: 8, trees: 1, cars: 6
Sue 347: cars: 0, cats: 3, perfumes: 7
Sue 348: children: 7, perfumes: 10, cars: 7
Sue 349: pomeranians: 8, akitas: 5, children: 2
Sue 350: perfumes: 9, pomeranians: 4, goldfish: 3
Sue 351: perfumes: 8, pomeranians: 7, trees: 4
Sue 352: samoyeds: 1, goldfish: 9, akitas: 8
Sue 353: akitas: 6, goldfish: 10, vizslas: 8
Sue 354: akitas: 7, cars: 2, goldfish: 6
Sue 355: cars: 3, goldfish: 6, akitas: 5
Sue 356: akitas: 2, goldfish: 9, pomeranians: 1
Sue 357: goldfish: 10, cars: 6, pomeranians: 9
Sue 358: trees: 0, children: 2, goldfish: 6
Sue 359: samoyeds: 3, cars: 2, akitas: 4
Sue 360: trees: 1, goldfish: 8, cars: 5
Sue 361: akitas: 5, vizslas: 7, perfumes: 1
Sue 362: cats: 5, vizslas: 9, children: 4
Sue 363: goldfish: 9, perfumes: 3, vizslas: 9
Sue 364: children: 7, samoyeds: 2, pomeranians: 10
Sue 365: perfumes: 9, akitas: 10, pomeranians: 4
Sue 366: cars: 10, trees: 3, cats: 4
Sue 367: vizslas: 6, akitas: 10, perfumes: 5
Sue 368: akitas: 9, vizslas: 9, children: 4
Sue 369: goldfish: 8, trees: 2, perfumes: 5
Sue 370: trees: 0, children: 4, cars: 8
Sue 371: cats: 6, perfumes: 0, vizslas: 2
Sue 372: akitas: 7, cars: 5, perfumes: 3
Sue 373: cars: 0, perfumes: 4, pomeranians: 10
Sue 374: akitas: 5, perfumes: 5, vizslas: 2
Sue 375: goldfish: 7, trees: 10, pomeranians: 7
Sue 376: cars: 8, trees: 1, pomeranians: 8
Sue 377: cars: 0, akitas: 9, vizslas: 1
Sue 378: akitas: 5, perfumes: 3, vizslas: 7
Sue 379: trees: 2, goldfish: 8, pomeranians: 8
Sue 380: akitas: 5, cars: 9, perfumes: 9
Sue 381: cars: 2, perfumes: 6, trees: 3
Sue 382: perfumes: 6, vizslas: 2, goldfish: 9
Sue 383: akitas: 8, vizslas: 7, cats: 1
Sue 384: akitas: 9, trees: 10, vizslas: 7
Sue 385: cars: 0, perfumes: 7, vizslas: 2
Sue 386: vizslas: 10, akitas: 4, perfumes: 9
Sue 387: perfumes: 6, pomeranians: 5, samoyeds: 8
Sue 388: vizslas: 10, trees: 9, goldfish: 9
Sue 389: goldfish: 8, akitas: 4, perfumes: 10
Sue 390: goldfish: 6, trees: 8, akitas: 1
Sue 391: vizslas: 4, akitas: 10, goldfish: 7
Sue 392: akitas: 1, vizslas: 6, samoyeds: 5
Sue 393: trees: 6, cars: 3, akitas: 5
Sue 394: goldfish: 9, trees: 3, cars: 5
Sue 395: akitas: 6, samoyeds: 4, goldfish: 4
Sue 396: akitas: 2, trees: 1, cats: 5
Sue 397: cars: 0, children: 9, trees: 10
Sue 398: pomeranians: 3, samoyeds: 9, goldfish: 10
Sue 399: cars: 7, akitas: 4, goldfish: 8
Sue 400: cars: 4, akitas: 5, vizslas: 4
Sue 401: pomeranians: 5, akitas: 8, vizslas: 5
Sue 402: cats: 7, cars: 6, goldfish: 6
Sue 403: samoyeds: 8, perfumes: 4, cars: 5
Sue 404: akitas: 10, goldfish: 4, trees: 2
Sue 405: trees: 8, perfumes: 1, cars: 2
Sue 406: trees: 0, perfumes: 9, pomeranians: 10
Sue 407: perfumes: 4, trees: 7, goldfish: 3
Sue 408: akitas: 1, perfumes: 3, cars: 5
Sue 409: trees: 6, samoyeds: 3, cars: 9
Sue 410: vizslas: 3, goldfish: 5, akitas: 7
Sue 411: goldfish: 10, trees: 1, vizslas: 9
Sue 412: cars: 0, akitas: 6, trees: 6
Sue 413: goldfish: 7, trees: 0, cars: 3
Sue 414: pomeranians: 10, samoyeds: 3, cars: 10
Sue 415: perfumes: 6, trees: 9, cars: 4
Sue 416: trees: 2, cars: 4, goldfish: 8
Sue 417: goldfish: 2, cars: 9, cats: 5
Sue 418: vizslas: 1, cars: 9, akitas: 0
Sue 419: perfumes: 6, cats: 3, children: 9
Sue 420: cats: 5, goldfish: 7, akitas: 9
Sue 421: trees: 1, samoyeds: 6, pomeranians: 1
Sue 422: trees: 10, goldfish: 6, children: 7
Sue 423: cars: 8, goldfish: 7, vizslas: 3
Sue 424: samoyeds: 9, akitas: 7, trees: 5
Sue 425: akitas: 5, children: 4, perfumes: 9
Sue 426: goldfish: 1, children: 9, cats: 2
Sue 427: vizslas: 9, akitas: 7, goldfish: 9
Sue 428: pomeranians: 7, akitas: 5, vizslas: 1
Sue 429: vizslas: 7, goldfish: 7, cars: 9
Sue 430: trees: 7, perfumes: 0, pomeranians: 5
Sue 431: children: 9, perfumes: 5, vizslas: 7
Sue 432: trees: 6, samoyeds: 7, cats: 1
Sue 433: goldfish: 5, trees: 5, children: 6
Sue 434: goldfish: 9, akitas: 7, cars: 3
Sue 435: samoyeds: 10, perfumes: 2, cars: 0
Sue 436: akitas: 5, pomeranians: 4, perfumes: 7
Sue 437: vizslas: 5, cats: 6, perfumes: 5
Sue 438: trees: 2, goldfish: 6, vizslas: 7
Sue 439: samoyeds: 8, pomeranians: 10, goldfish: 1
Sue 440: akitas: 6, children: 9, perfumes: 4
Sue 441: cars: 2, goldfish: 9, children: 0
Sue 442: goldfish: 7, cars: 2, vizslas: 8
Sue 443: goldfish: 6, samoyeds: 3, perfumes: 2
Sue 444: trees: 2, goldfish: 7, cars: 8
Sue 445: trees: 2, pomeranians: 0, children: 0
Sue 446: perfumes: 4, akitas: 4, goldfish: 6
Sue 447: vizslas: 7, akitas: 9, cars: 3
Sue 448: goldfish: 6, trees: 9, cars: 0
Sue 449: samoyeds: 7, perfumes: 4, vizslas: 10
Sue 450: akitas: 7, cars: 10, goldfish: 7
Sue 451: goldfish: 4, children: 7, pomeranians: 4
Sue 452: cats: 4, vizslas: 6, trees: 7
Sue 453: cars: 1, trees: 10, goldfish: 9
Sue 454: trees: 2, goldfish: 3, vizslas: 10
Sue 455: pomeranians: 9, vizslas: 3, akitas: 2
Sue 456: vizslas: 10, akitas: 2, goldfish: 1
Sue 457: trees: 5, cats: 5, children: 8
Sue 458: cars: 6, goldfish: 3, akitas: 9
Sue 459: goldfish: 7, akitas: 2, cats: 7
Sue 460: akitas: 1, cars: 5, children: 8
Sue 461: cars: 8, perfumes: 0, goldfish: 6
Sue 462: pomeranians: 6, cats: 2, perfumes: 6
Sue 463: vizslas: 7, perfumes: 3, goldfish: 3
Sue 464: akitas: 10, goldfish: 10, trees: 1
Sue 465: vizslas: 0, akitas: 2, trees: 2
Sue 466: perfumes: 6, akitas: 8, cars: 2
Sue 467: goldfish: 1, cars: 10, perfumes: 3
Sue 468: goldfish: 4, trees: 2, cars: 9
Sue 469: perfumes: 6, pomeranians: 0, vizslas: 10
Sue 470: samoyeds: 8, children: 0, akitas: 7
Sue 471: children: 3, goldfish: 9, cats: 9
Sue 472: samoyeds: 0, goldfish: 0, trees: 0
Sue 473: trees: 3, goldfish: 4, vizslas: 1
Sue 474: perfumes: 10, cars: 3, trees: 7
Sue 475: akitas: 5, vizslas: 4, goldfish: 5
Sue 476: children: 2, akitas: 7, vizslas: 3
Sue 477: vizslas: 6, pomeranians: 9, trees: 6
Sue 478: vizslas: 7, pomeranians: 6, akitas: 7
Sue 479: trees: 2, perfumes: 2, children: 2
Sue 480: cars: 8, cats: 5, vizslas: 0
Sue 481: trees: 5, goldfish: 0, akitas: 3
Sue 482: cars: 8, perfumes: 6, goldfish: 10
Sue 483: goldfish: 0, cars: 3, perfumes: 10
Sue 484: pomeranians: 1, samoyeds: 1, perfumes: 3
Sue 485: trees: 0, akitas: 2, vizslas: 4
Sue 486: cars: 3, vizslas: 8, goldfish: 1
Sue 487: pomeranians: 9, vizslas: 2, children: 10
Sue 488: akitas: 6, vizslas: 10, perfumes: 9
Sue 489: goldfish: 6, vizslas: 4, cars: 2
Sue 490: vizslas: 10, cats: 8, samoyeds: 1
Sue 491: cats: 9, cars: 1, perfumes: 10
Sue 492: goldfish: 6, cars: 9, pomeranians: 9
Sue 493: children: 10, goldfish: 10, vizslas: 0
Sue 494: pomeranians: 5, cars: 0, vizslas: 0
Sue 495: vizslas: 7, perfumes: 6, samoyeds: 3
Sue 496: trees: 1, cats: 4, cars: 10
Sue 497: cats: 1, perfumes: 0, cars: 7
Sue 498: perfumes: 7, vizslas: 6, cats: 9
Sue 499: vizslas: 8, perfumes: 1, akitas: 3
Sue 500: perfumes: 4, cars: 9, trees: 4

@ -0,0 +1,39 @@
with open("input") as f:
sues_raw = [n.strip() for n in f.readlines()]
with open("components") as f:
components_raw = [n.strip() for n in f.readlines()]
COMPONENTS = dict()
for component in components_raw:
key, amount = component.split(":")
amount = int(amount)
COMPONENTS[key] = amount
print(COMPONENTS)
SUES = dict()
for sue in sues_raw:
name, component_list = sue.split(":", 1)
component_list = [x.strip() for x in component_list.split(",")]
components = dict()
for component in component_list:
key, amount = component.split(":")
amount = int(amount)
components[key] = amount
SUES[name] = components
def is_match(components):
for key, val in components.items():
if COMPONENTS[key] != val:
return False
return True
print(SUES)
for name, components in SUES.items():
if is_match(components):
print("Found:", name)

@ -0,0 +1,47 @@
with open("input") as f:
sues_raw = [n.strip() for n in f.readlines()]
with open("components") as f:
components_raw = [n.strip() for n in f.readlines()]
COMPONENTS = dict()
for component in components_raw:
key, amount = component.split(":")
amount = int(amount)
COMPONENTS[key] = amount
print(COMPONENTS)
SUES = dict()
for sue in sues_raw:
name, component_list = sue.split(":", 1)
component_list = [x.strip() for x in component_list.split(",")]
components = dict()
for component in component_list:
key, amount = component.split(":")
amount = int(amount)
components[key] = amount
SUES[name] = components
def is_match(components):
for key, remembered_val in components.items():
measured_val = COMPONENTS[key]
if key in ["cats", "trees"]:
if not remembered_val > measured_val:
return False
elif key in ["pomeranians", "goldfish"]:
if not remembered_val < measured_val:
return False
elif remembered_val != measured_val:
return False
return True
for name, components in SUES.items():
if is_match(components):
print("Found:", name)
print("Finish")

@ -0,0 +1,20 @@
11
30
47
31
32
36
3
1
5
3
32
36
15
11
46
26
28
1
19
3

@ -0,0 +1,25 @@
with open("input") as f:
jars = [int(n) for n in f.readlines()]
jars.sort(reverse=True)
def count_remaining_combinations(remaining_eggnog, remaining_jars):
if remaining_eggnog == 0:
return 1
if remaining_eggnog < 0:
return 0
if len(remaining_jars) == 0:
return 0
count = 0
for idx, jar in enumerate(remaining_jars):
count += count_remaining_combinations(
remaining_eggnog - jar, remaining_jars[idx + 1 :]
)
return count
print(count_remaining_combinations(150, jars))

@ -0,0 +1,39 @@
with open("input") as f:
jars = [int(n) for n in f.readlines()]
jars.sort(reverse=True)
combinations = []
def count_remaining_combinations(remaining_eggnog, remaining_jars, used_jars):
if remaining_eggnog == 0:
combinations.append(used_jars)
return 1
if remaining_eggnog < 0:
return 0
if len(remaining_jars) == 0:
return 0
count = 0
for idx, jar in enumerate(remaining_jars):
count += count_remaining_combinations(
remaining_eggnog - jar, remaining_jars[idx + 1 :], used_jars + [jar]
)
return count
count_remaining_combinations(150, jars, [])
minimum_number_of_jars = min([len(x) for x in combinations])
print("Minimum number of jars:", minimum_number_of_jars)
minimal_comninations = [x for x in combinations if len(x) == minimum_number_of_jars]
print(minimal_comninations)
print("Count:")
print(len(minimal_comninations))

@ -0,0 +1,6 @@
.#.#.#
...##.
#....#
..#...
#.#..#
####..

@ -0,0 +1,100 @@
#...##......#......##.##..#...##......##.#.#.###.#.#..#..#......####..#......###.#.#....#..##..###..
####..#.#...#....#.#####.##.##.#..#.......#....#.##...###.###..#.#.#........#..#.#.##...##..#.####.#
...#..##...#.#.###.#.###..#.##.####.###...#...........#.###..##.#.##.#.###...#.#..###....#.###.#..#.
.#...##...####.#..#.....#..#...#.#.##...#...##..#.#.###....#..###.....##..#.###..###.....##..###...#
..##.#####....##..#.#..##.##..######...#..###.######.....#..##...#.#..##..##..#..#..#..##.#.#.#.#...
.###.###.###...##...##..###..##.###.#.....##..##.#.#########...##..##.#..##.#..##..####..#.#.#.#####
#.#####..###.###.##.##.#...#.#.#.#..#.###...#..##.###.#...####.#..#.#.....###..#..####..#.#.#...##..
....#...##.....#....####.##.#.###..#.#.##..#.#...##.###.###..#.##..#.#.##..##..#.##.###..#.#.###.###
##.##...#.##...#.#..#.#..#...###...###.#..#..#.#####..###.#......#.....###.#####.#.#..#.#.#.##..#.#.
#.#..#.....#.....##.#..##...###..##...##...###.#.###.#..#.#.###...##..##..#.###...#.#######.#...#.#.
#.#.....####.#..#.##...#.##....#####.###.#.....#####....###..#........##..####...#...#.###....#..###
##.#.##..#.#.##.#.....##.#.....###.####.#..######.....####.#.#..##.#.##...#..#.#.....#.####.#.......
#..#..#.#..#.######.##..##.####.....##.#.##.#.######..#.#....#.#...#.#..#..#.#.###.#..#.#.#..#...###
####..####.#.#.###.....#.#.#.##..#.##.##.##.#..##..##.#.##.....#.#..#.####.....###.#..#.####.#.#..##
###.##..##.#.##..#..##...#.#####.##.#....##.####.#.##....#..###.#.#.##...#.....#.#.#.#.#..##.#.#..#.
......#..####...##.##...#.##.##...##..#..##.###..#...#..##...#.#....###.####...#.##.###.#.##.####.##
..#...#####.#.#..#.##....#..#...#..####.....###...##.###....#..#.###...#........#.#.##..#..#.#.....#
#######.#.#.###.###..######.##..#####.##.###.###....####.#..##.##...###.#..############.#.##....##.#
#.#...##.###.#.###..#.#.#.#.#.#..##..####.#..##.....#.##..#.##...##.#..##..#.#.#....##....##.#..#.#.
..#.#.####.....###..#######.#.#.#.#...##.#####.....##...##...##.###..######.###..#...####.#..###.###
.#.##....#.#.##..##.#.##.##..######...#.....#..#.#.#.#.....#.#..##.#.#.......#######....#.......#...
..###.##.##..##....#.###...#.....##..##......###...##..###.##...##.###.#.#.#.###.###.#.#...###..#...
.##.#.#...#...##.#.#...#..#..#.#...##.#.##...##..#....#.#..##.#..#.#..#.#.....#..#.#...#######.#.##.
...####....#.###.#..###..##...##..#.#.#.###...#..##.##.##..##.#...#..#.##.....#.#........#..#.#.####
.....##..###...#....#.#.#.#...###.###...#.#...#.#.####....#..####...###..#..######..##.##..###.#####
#####.##..#....###.###....##.....#.#..#....#.#####.##.#.####.#.##...#..###...###..##...#.###.#####..
###.##..........########.######....####.###.#..##...#.##.####.#.....##..#####..###...#####.....#.#.#
##..#####.##.#.#####.#.##.##..#.##....########.#####.#...#.###.##...#.###.#.#..#....##.#..#...#.#.#.
.##.#....#..#...#..#####..#..##.#......#..#....########...#..#...#.....####.#...##...#.###.#.#..##.#
.##.##.#.##.#.##...#.#.#..##.##.###.#..##..#...###.##.###.#####.#.###..#..###.#...#.###.#...#..#.#.#
.#..#..#.#..#..###..#....###.####.##.#.###.#.##.###.#.##.###.###...###...###.#...####...#.##.##.#.#.
###..##...###...#..##.#..#.#...##....###.##.##..#####....###..#..#....#..###.###.#...#.##...#.#.#..#
#....#.......##.....#.##...#..#.###.#.##..##..#.##..#.###..##.##...#####.#..#####..#####..#####....#
.####.####....###..###.#.##.####.##.#...####.#.###.#.....#...####..#####.###..#.#.###.##.##...##..#.
####..##...##.########...##..###..#..###.##.#.#.#........#.#####.#...#.###.####.#..####..#.#.#....##
###.#..#...###.#..#..#.###...##..###.##.#.#...#..#...####..##....#.#..#..##.#.#...#####.###.#..#.#.#
...##....#.###.#.#..##...##.###.#..#..#......#...#.#..####.#.##..######.####.#...#..#..#..##.#.#.##.
##.####.#...#..#.#.##..##.#.#.###..##...####......#..######.#......#.##.#....##...###.#.#..#......##
#.....#...#######.##.#..#.#...###.#..#.####....#.#.##.#.##...###..#...#.###.##..#.###..#.##...#####.
#####.##...#..#.#.#.......#.##..#####..#####...###..##.#.#..###.#.#####.####..#.#..##...#.##...#.###
.##.#..#######.###.#.####.....##...#.##.#.#..#...##....####......######.#..######.....##########.##.
##...#.#..#.##.###.#.#.#.##.###.##..##.##.##...#.#..###.#######..#.....#####..#....######.#..##..###
.#.#.###.....#..##..#.#..##..#.###...###.#..##...#...#.#####.#.#####..###.#..#...##..#.#..#..####...
.#......##..#.....####.###....##.###.....###.##........#.###.##..#..#.#######.#.######..##..###.....
..##.#.#..#.##...#.###.###...######..#..#.#..#....###.#.#....#..........#...##.##.##.#..##..#.#####.
###.###.#..#.##..##.#..#..##.....##.....#..#######.#..#.#.#.####.###..###.#.#..#.##.##.####.###.####
#.#.#..#....########.#..#..#...##..#.##..#.#..##..####...##.....#.##.#.#...########..#.###.#..#.#.##
.##.....#...#.#...##.##....###...##..#.####...#..#.#..#..#.##..#.###.##.####.##..####.....##.#.....#
....####.#.##.#.##.#..##.#.######.##.####..#...####.#..###.#.#..#..##.#.#.....##.#####.#.####...#.#.
#..#####.#####.....##....######..##....#..#.#.###.#####.....##.##.####.#...##...#.##.#.#####.##.#...
##.####..###.#....#...#.#.#.#.###.#####.#.####..####...####......##..#..#..#.#.##...########....#...
.###.#.#.#.#..####.##.#..######..#.#.###.....#.#......#.#.#.#..####.##...##.#####.#.##..##..#..#.#..
.....###...#...#.####.###.#.#.#.#.....#....#.####.###.##.##.##.#######......#.####......#....##.....
##..#..#.#.##..#...#..##.##.##..###.#....##.##....####.#.##.###....#.##.#.#.##...##.###...#..#..####
...#.#..##..##.#...##.##...#.#......#.#.##..###....####.##...#.#.###.#..#..#.####..##..##..#####.###
.##.##..##########.##...#.##.####.#.#######.##.#.##.##..#...##....########.###..##.##.##.#..##.#.#.#
#####.#....#.##..#.....#......##.##..#.##.###..##.......###..##.#.###.##.###....####.#..#.###..#.#.#
.#...#..#.##....##....#...####....#...#..#...####...########.###.#..##.#.#.##..###..#.#.###.....##.#
##..##.....###......#..###.##.####.##.####.#.#....#..#...#..#.#..#.###.#...#...#..##.##...#..#######
.....##..###..##...#####.#.#.....###.#.#..####...#.#.#..#..####..##.#..###.####.#....##..###....#..#
#.#.##.#....#.#####.#....##...#...##...##....#.#.......#....#..#...###.###.#.####..####....#.##.#.#.
..##...##..###.#.#.##.#..#....#.#.....##.###.#.###.###.....#...#.#..#######.#####..#.###...##......#
#......###..#....#.#..#.###.##.#...##..###.####.#.#....#.##..#.###..##.#..#####..##.###.....#..###..
##.#.##..##.###.#..##.....#.##.....###....##.####.######.#...#..###....#.#...#.##.....###....#..#.#.
.##.#.#.#.##..#.#.#..##..#.###.####....#..###.######..####.#.....###.##..#...###.#..######.##.#.##..
...##.####.#..##.#####.##.#...##..#..#...#.#.#.#####...#....#..###...#..#....#.#.##.#.######.#..####
..#.#.#.#...#.######.#.....#..#.#..###....#.#.########...#....#.#.##..#...##...#.#..#.#.###....##...
#####..#..##..#..##..#..#.#.##.#....#####.####.##.#.###..##..##....#.....#.#####.#...#.#####.##.#.#.
#.#..#####...####.###.###.....####.###.....##...##...#..#..#######.#.##....##..####.....##...#..#..#
#.#.###.#.#..##..#....#.#...#.#.##.##..#.##.....##...#.#..##.......##.#.###..#####.#.##....#.##.....
...#.......#....#.#.####.#.###.###..#....#..##.#..####........#.##..#...#.#...###.#..#.#.#...#...#..
...##.#####.##.#.###.##.##.#.##..##.#.#.#.#.#.##.#..##...##.#.#..#..##.##.#####.#.###...#####..#..#.
#######.#..#..#....##.#.#..####.#..#..###...#..#.......###.#.#.####....#.###...#.#.###.#.#.#.#..###.
..##.##.#.##.###....###.##.#.###.#...#....#.####..###..###.#.#..#...##.#.#.#..##.###..###.#.##...###
######..######..##..##.#.#.##.##.#..##..#.#.#.##..#.#...#...#.#.#..######.#..#.#.######..#......##.#
#.#####.....#.......#########..###.##...#...##.#.#..#...#####...#...#..#.###.#..#.#...###.#.#.#...#.
#....##....###...##.##.#...##.........##.#.#..#.#.##.#.######.#####..#..###.###.#...#.#.##.######...
#.#...###.#.###.##.#.######.#######.###.##..#.#.#...######.##.####.##..#.#.#.#......##..##.........#
..###..##....#.....##...#.#.###.#.#.....##.#...###.####.#...#...##..##.#.#.####..###...######....#.#
..###.#.##.####.#..#.##....##..#####....#..##.##.#..#######...#.####...##.#.#.##.........#....#....#
.##.#...#.####..#.#...#.##..######.##..##.#.###.##..###.###....##..#.##.##..##.#...###.##.##.###....
#...###.###.#..#....#.......#..#.....###..#.###.##.##....#.####.#.####.##..##..#..#.....#....##.#.#.
.##.#..#..#.##.......#.####.#######.....#.##.##.#.....#.#..#....######.#..###.##.##.....#.####..##.#
###..#.###.#..####.....##....#..####....#.##.##..#...######.#########...#.#....##...###.#..#.##...#.
#..###..##..#.#.##.###.#.#.##...###.#...##.##..#.###....###..#.#...#.###..######.#..#.###..#..#..#.#
.#........##.#.###..###.#.#.##.....##.##.#.#...##..#.##....###..#.#.#.#.##....#.##..#.#...###...#...
####.####..#....#.#.#..#..##.......##.####...###.##..#.#.##.#..##..######.......##.#.##..#...#.....#
..#..#..###..##.##..######.#..###..###.#.##..##.#..#####.#.#.#.##..#.##..##.##......####.#..........
...##.##..###.#...###....#.#.#.#.....#.##.....##...#...#......####...##.##....##.#..#.####.#..###.#.
..#.....####.#.###.#####..#..###..#..#.#...#####...###.###....#.###..#...#..#..#.#..#.##..##.#.#....
..##.#####...###.###.........#....##.####.##..#.#..#.#...#...##.##.##..#.#.##.########......#####...
...###.#.#..#...#.###.###.......##.###.#..#.##########...#..#.#.#.##.#.###...######..#.#...###.##...
.#.#.#######.#..##.##..##...#...####...#..#####.#..##...###.#.#...#.##...#......#..##.####..#.....##
.##.##.#.#......#######..###.....##.#.##..###......#....####...#.###.#.##.#........#..#....##.....##
#...#.###.#.##...##.####....#...#.###..#.#.....#.#....#.#.#.##...#.#..#####.#.#..#..#..#....#...####
.....##...###......#####..##.##.##...##.#.#####..##...#.#.#.#.###...###.##.####..#.#..#.#..#.####.##
#..#..##.#.##.#.##.#.#.#..###....###.##.#.##.#...#.#..#...#....###.#..#.#.######.#...####..#..##.#.#
#..#.#..#...###.#..##.#...#...##.#......#...#..#..####..##.....#.###...#.#..#.#....#.#####.##.###...
###....#.#..#.#..###..#.##......#...#..#..##.#..###..##..#..#.####..#...########..##.#.##.#.#.#...#.
.#.#.##.##.###..#...#.#....#..#.##..#.#.#.#.##.##.#####...#........####..###..####.#####..#.##.#.##.

@ -0,0 +1,80 @@
from time import sleep
with open("input") as f:
lights = [n.strip() for n in f.readlines()]
STEPS = 100
# STEPS = 4
X_MAX = len(lights)
Y_MAX = len(lights[0])
def print_lights():
for row in lights:
print(row)
def neighbors_that_are_on(center_x, center_y):
count = 0
for d_x in range(-1, 2):
for d_y in range(-1, 2):
x = center_x + d_x
y = center_y + d_y
if d_x == 0 and d_y == 0:
continue
if x < 0 or x >= X_MAX:
continue
if y < 0 or y >= Y_MAX:
continue
neighbor = lights[x][y]
if neighbor == "#":
count += 1
return count
def get_next_state(prev_state, neighbors_count):
if prev_state == "#":
if neighbors_count in [2, 3]:
return "#"
else:
return "."
else: # light == '.'
if neighbors_count == 3:
return "#"
else:
return "."
print("Initial state")
print_lights()
print()
for step in range(STEPS):
new_lights = []
for x in range(X_MAX):
line = ""
for y in range(Y_MAX):
light = lights[x][y]
neighbors_count = neighbors_that_are_on(x, y)
next_state = get_next_state(light, neighbors_count)
line += next_state
new_lights.append(line)
lights = new_lights
print("Step", step + 1)
print_lights()
print()
sleep(0.03)
count = 0
for line in lights:
for light in line:
if light == "#":
count += 1
print(count)
# 353: too low

@ -0,0 +1,87 @@
from time import sleep
with open("input") as f:
lights = [n.strip() for n in f.readlines()]
STEPS = 100
# STEPS = 5
X_MAX = len(lights)
Y_MAX = len(lights[0])
def print_lights():
for row in lights:
print(row)
def neighbors_that_are_on(center_x, center_y):
count = 0
for d_x in range(-1, 2):
for d_y in range(-1, 2):
x = center_x + d_x
y = center_y + d_y
if d_x == 0 and d_y == 0:
continue
if x < 0 or x >= X_MAX:
continue
if y < 0 or y >= Y_MAX:
continue
neighbor = lights[x][y]
if neighbor == "#":
count += 1
return count
def get_next_state(prev_state, neighbors_count):
if prev_state == "#":
if neighbors_count in [2, 3]:
return "#"
else:
return "."
else: # light == '.'
if neighbors_count == 3:
return "#"
else:
return "."
def turn_corners_on():
lights[0] = "#" + lights[0][1:-1] + "#"
lights[-1] = "#" + lights[-1][1:-1] + "#"
print("Initial state")
turn_corners_on()
print_lights()
print()
for step in range(STEPS):
new_lights = []
for x in range(X_MAX):
line = ""
for y in range(Y_MAX):
light = lights[x][y]
neighbors_count = neighbors_that_are_on(x, y)
next_state = get_next_state(light, neighbors_count)
line += next_state
new_lights.append(line)
lights = new_lights
turn_corners_on()
print("Step", step + 1)
print_lights()
print()
sleep(0.03)
count = 0
for line in lights:
for light in line:
if light == "#":
count += 1
print(count)
# 353: too low

@ -0,0 +1,7 @@
e => H
e => O
H => HO
H => OH
O => HH
HOH

@ -0,0 +1,45 @@
Al => ThF
Al => ThRnFAr
B => BCa
B => TiB
B => TiRnFAr
Ca => CaCa
Ca => PB
Ca => PRnFAr
Ca => SiRnFYFAr
Ca => SiRnMgAr
Ca => SiTh
F => CaF
F => PMg
F => SiAl
H => CRnAlAr
H => CRnFYFYFAr
H => CRnFYMgAr
H => CRnMgYFAr
H => HCa
H => NRnFYFAr
H => NRnMgAr
H => NTh
H => OB
H => ORnFAr
Mg => BF
Mg => TiMg
N => CRnFAr
N => HSi
O => CRnFYFAr
O => CRnMgAr
O => HP
O => NRnFAr
O => OTi
P => CaP
P => PTi
P => SiRnFAr
Si => CaSi
Th => ThCa
Ti => BP
Ti => TiTi
e => HF
e => NAl
e => OMg
CRnCaCaCaSiRnBPTiMgArSiRnSiRnMgArSiRnCaFArTiTiBSiThFYCaFArCaCaSiThCaPBSiThSiThCaCaPTiRnPBSiThRnFArArCaCaSiThCaSiThSiRnMgArCaPTiBPRnFArSiThCaSiRnFArBCaSiRnCaPRnFArPMgYCaFArCaPTiTiTiBPBSiThCaPTiBPBSiRnFArBPBSiRnCaFArBPRnSiRnFArRnSiRnBFArCaFArCaCaCaSiThSiThCaCaPBPTiTiRnFArCaPTiBSiAlArPBCaCaCaCaCaSiRnMgArCaSiThFArThCaSiThCaSiRnCaFYCaSiRnFYFArFArCaSiRnFYFArCaSiRnBPMgArSiThPRnFArCaSiRnFArTiRnSiRnFYFArCaSiRnBFArCaSiRnTiMgArSiThCaSiThCaFArPRnFArSiRnFArTiTiTiTiBCaCaSiRnCaCaFYFArSiThCaPTiBPTiBCaSiThSiRnMgArCaF

@ -0,0 +1,35 @@
import re
from collections import defaultdict
def parse_atoms(molecule):
return re.findall(r"[A-Z][a-z]*", molecule)
decay = defaultdict(list)
with open("input") as f:
line = f.readline()
while line != "\n":
atom, decays_to = line.strip().split(" => ")
decay[atom].append(decays_to)
line = f.readline()
molecule = f.readline()
print(decay)
print()
print(molecule)
atoms = parse_atoms(molecule)
next_molecules = set()
for idx, atom in enumerate(atoms):
prefix = "".join(atoms[:idx])
suffix = "".join(atoms[idx + 1 :])
for decay_molecule in decay[atom]:
descendant = prefix + decay_molecule + suffix
next_molecules.add(descendant)
print(len(next_molecules))

@ -0,0 +1,63 @@
import re
from collections import defaultdict
INPUT_FILENAME = "example"
def parse_atoms(molecule):
"""Return a list of all Atoms in the molecule string"""
return re.findall(r"[A-Z][a-z]*", molecule)
ATOMS = set()
REPLACEMENTS = list()
with open(INPUT_FILENAME) as f:
line = f.readline()
while line != "\n":
atom, decays_to = line.strip().split(" => ")
REPLACEMENTS.append([atom, decays_to])
ATOMS.update(parse_atoms(decays_to))
ATOMS.add(atom)
line = f.readline()
MOLECULE = f.readline().strip()
ATOMS.update(parse_atoms(MOLECULE))
print("ATOMS", ATOMS)
print()
print("REPLACEMENTS", REPLACEMENTS)
print()
print("MOLECULE", MOLECULE)
print()
def shrink(molecule, from_molecule, to_atom, idx):
prefix = molecule[:idx]
suffix = molecule[idx + len(from_molecule) :]
return prefix + to_atom + suffix
def step(molecule):
next_molecules = []
for (atom, decays_to) in REPLACEMENTS:
possible = [m.start() for m in re.finditer(decays_to, molecule)]
if not possible:
continue
print(decays_to, atom)
if atom == "e" and len(decays_to) != len(molecule):
continue
for idx in possible:
next_molecule = shrink(molecule, decays_to, atom, idx)
next_molecules.append(next_molecules)
print(" ", idx, next_molecule)
return next_molecules
step(MOLECULE)

@ -0,0 +1 @@
33100000

@ -0,0 +1,79 @@
import matplotlib.pyplot as plt
INPUT = 33100000
def get_divisors(num):
divisors = set()
divisors.add(1)
divisors.add(num)
upper_limit = num
lower_limit = 2
while lower_limit < upper_limit:
quotient, rest = divmod(num, lower_limit)
if rest == 0:
divisors.add(lower_limit)
divisors.add(quotient)
lower_limit += 1
return divisors
def present_count(house_number):
divisors = get_divisors(house_number)
presents = 0
for divisor in divisors:
presents += divisor * 10
return presents
X = []
Y = []
for x in range(1, 100):
if x % 100 == 0:
print(x)
y = present_count(x)
plt.plot(x, y, "bo")
plt.annotate(f"{x}", (x, y), xytext=(2, 0), textcoords="offset points")
plt.show()
print("Estimation...")
prev_house_number = None
house_number = 1
presents = 10
while True:
prev_house_number = house_number
house_number = house_number * 2
presents += house_number * 10
print(house_number, presents)
if presents > INPUT:
break
lower_bound = prev_house_number
upper_bound = house_number
print("Estimation lower bound:", lower_bound)
print("Estimation upper bound:", upper_bound)
print()
current = int(lower_bound + (upper_bound - lower_bound) / 2)
loop_count = 0
while True:
presents = present_count(current)
print("loop", current, lower_bound, upper_bound, presents)
if presents < INPUT:
lower_bound = current
else:
upper_bound = current
current = int(lower_bound + (upper_bound - lower_bound) / 2)
print("finished")
# 2097152 too high
# 1540098 too high

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

@ -0,0 +1,3 @@
Hit Points: 103
Damage: 9
Armor: 2

@ -0,0 +1,20 @@
sesenwnenenewseeswwswswwnenewsewsw
neeenesenwnwwswnenewnwwsewnenwseswesw
seswneswswsenwwnwse
nwnwneseeswswnenewneswwnewseswneseene
swweswneswnenwsewnwneneseenw
eesenwseswswnenwswnwnwsewwnwsene
sewnenenenesenwsewnenwwwse
wenwwweseeeweswwwnwwe
wsweesenenewnwwnwsenewsenwwsesesenwne
neeswseenwwswnwswswnw
nenwswwsewswnenenewsenwsenwnesesenew
enewnwewneswsewnwswenweswnenwsenwsw
sweneswneswneneenwnewenewwneswswnese
swwesenesewenwneswnwwneseswwne
enesenwswwswneneswsenwnewswseenwsese
wnwnesenesenenwwnenwsewesewsesesew
nenewswnwewswnenesenwnesewesw
eneswnwswnwsenenwnwnwwseeswneewsenese
neswnwewnwnwseenwseesewsenwsweewe
wseweeenwnesenwwwswnew

@ -0,0 +1,471 @@
swswswswneswswwwswnewswswweswnwsww
nwwewenenwnenwnwnwnwneswnwswnwnwswswnw
seneswwwswwnenwnenwswswswswsewseeww
esenesenesesesewseseswnesesweesesesese
seseseeseenesewseenwsesewswwsesenwse
eswenewnenenewneneneneenenenenwnene
nwseeseseeseseseseewseesenwseeesese
nwnwswswswweneseswwswwneswswswswswsw
senenenwnenewneneneseswneeeenenenew
eswnwnesenwnwnenwnwnwnwwnwsenwwswswenw
wswneswswseesewswseswswswnenesenenwswswne
seswseswneswswswwnwswwswseneswswswswsee
neseseswnwesesesesewswsesenesenesesesw
wwswwwsweswwwww
seswwnwneenwswneenwewneneneseenee
eswseenweswewseneeeeseeswnwnwse
swsweswswswnweswswneswwswnwswwwswswswsw
nwwnwnwnwnwnwnwnwwswwnweneswwenwnw
sewswwwwwwwweswwwwneswwnwswnw
nwneeneeneneseneseneneneneneneswnenwnene
swnenenweeneeeseswweneenenenenene
nwnwnwsenwewsesenwenwwwswwnwnesenw
swnwswswswswswsewseswnewneseswswswneesw
wwweswwswwsewswswwwwnwwesewwne
swswsweneswswswenwswnewnwswwneswseswswe
nwnesewwnwwnwwwsew
enwwwnenwnewwwwswwseeswewe
neswseswswsenwseswnwseswse
senwseneneneneneeseneswnenenenenwnenwnw
swseneswwseenwsenwneneswnewnenewene
ewwwwwwwewwwnwswwwwwwwne
eswswenwsenwnwsenenw
nwneseewseswwsewswnwnwnwwwwnewww
nwwwwwwwwewnwwswnew
neeeseeesewseeeeeeeewe
wweswnenwwnewnwnwwwewsewnwwsew
swwswwwswwewwswswnwsweswnwwwww
eseswneenwneenweseenweeseeeenw
neneswneneneneneneneneneswnenwnwnw
nwnwwnwewwswwnwwwnwsewnwwenwnw
seswswswnwswwwwswwswneswwseswnw
nwseswenwwneneneseswneenwnenenwnenwnenw
nwnenenenesewwnenwnwnesenwnwnwnwnenwnwnw
wseeeneseeeseseesesenwseseswsesese
sweseswnwseseseswseswseseseswswswse
ewwwswswsenwewnewwwenwwwnwww
nwwsewnwnwnwneswwnwesewnwwnwnwnwnwne
nenwnwnwnenenwnenwnwswswnwneenenwnwnwne
esenwneswsesesweeeeweseseeseseswnw
swswswswwsesweseswswswsw
swsweneswwseswswswwswsenewswwswseswnene
nenenewnwnenenwenwnesenwneseswnwnwnwne
nenenenewneeseneneswneneneswsenenenwne
nenenwnenwswwnweesenwsenwnwnwseswnwnwnw
seseeenwsenwswsesenwseeseeseeseswese
swneeseseneswswnwswnwwwwswswnee
seeseseseneseseswsewseenenwwneseswse
wswseseenwwswnewenwswswwwnewwsw
nenewswnwnenwnwneeneswseeneswnenwnenesene
nwswsenweweseeneseesesesesesesesee
seneswswwesenenwswseswnwseseseseseswne
wwnwwweswnwnwwweneseewnwsesenw
swswneneneneenewnesenewweenweswne
eseneseneseenenewwswseweenweenenene
nwwnwwnwsenwnwnwnwwnwwnww
swweswsewewwwwwwwwwwnewne
swswnewseseseesenewseesesesesesenwese
swswnenwnenwnwnwnwnenenenwnwwnenwseene
wnwwwwnwnwwnwwnwnwwwnwnwsenwe
nwseswwwnenwwwwesewwwwwwwnenwnw
nwswswnwswwswwnenenwnwnwnwnewnenw
seswswswnwswswswswswswswswswswswsw
neneseeneswnwnenwnwsenwnenenewne
wwwwwnenwnwnweswwnwsewwwesese
swwswswwwwseswswenwnewswwswweswnw
swwswseswswseeswswswewswswnwswswese
nwnwewsenenwnesewwwwswnwnenwswsee
seseseenwwswseneneseswswnwnewswnwsenwse
wwswwnwwwwsewwwenewnwswnwwwe
swwwwswwswwswneseswswswwnewswwse
nenenwneeswnenesweneneneeneneswsewesw
seswswswseswswswswsweenwswswwseswwsw
swswswsewneseesenwseseswseswswswnwsesw
nwwnewnwnwswnwnwswnwsenwwnwenwnenww
wswwnwwwswwwwswe
eewneeeeneeswsee
wseneseeseewseseseswsewse
wwswnwnwwnewnwsewenenwswwewswwne
seneesesesesewswswwnwseswswseseswseswsw
ewnweeeseneseeseseeneseswwwee
wwwwswwsewwwwewwwwwswnwwne
swsewswswswseswseseeswsenwseswswswsenw
nenenenenesenenenenenenewenewneswsene
newnewewwnwnwnwsewwswnwwwwesww
neseeeneneeewnee
wsenwwnwenwnwwnwnwnwwnwnwwnw
nweswenwseseswwseeenwseenwswsesewsw
wwwswwwwsewwwwwwwwne
nenwnwnwnenwnwnwnenwwnwnwnwnwnwe
eeeeeweneeseeeesweeeeew
seneseeeeewewnweseeseseseeseese
swenenenenwesweewneeeneneeeeeee
wnenwseswnwwwsenwnwwnwnwwnwwnwnwnwnw
sewwwswnwwnwwwswwnewwewwwsw
swwwwswswwswswwwswnew
esweeneeswenwnweesweneeeeswee
eenweeseneeeeeeeeeseeenenwsw
nwneswweeneseswnwswnweeesesesenwe
neneneeswnwnwnwnenenwnenene
wseewseeseseneswsenwsenewsesweseswswse
eseswneneseneenenewswwnwnenenesenenenw
seswsesesweseswseswseswwsw
nwnenenenenwnenenwsenenwwsenewnenenene
eneneneneswnenenenenenenenwneneneswnwnw
neneeneneenwnenenesweneneewsweneene
swnwnwneswnwnwseenwnwnenwenewnwnwnwwnw
swswwnwwswnwwseswewswneseneswewneswe
neswswnewwswswwwswwsewww
nwneeenwswnwsenwnwnwnwnenwswnwnwsenwnw
neeswnwnwwnwseswesweneswnw
swnenwenwnwnwnwsesenwswnwnwnwnwnwnwnwnw
swseswswnenwwwwseswwwwsw
seswneseswseswswswsewesenwsenesewsesw
eseeneswseenwewseewneeeene
swnenenenenenenewwneneswnenenesenesenw
swnenwnenwnwenenenwnenenwnwnene
eswneenwwnwwwneewneneneswneseswee
neseneseneewneeeweewnwneeseee
nesenenenenwnwnenwswnwnenwnenenwnw
seswsesesenwseeeeseseeesesewseenw
eneswsewneeswnenweswneeswnewwswseene
eeseseseswneswseseeeeeeeeewne
wwwseswnenwwnwnwenenwnw
sesenesweeeeeweeeweeenwwe
wsewnwwsewwewwnew
esesenwnwwwneswwswsenwnwnwseswneswwew
nenwwnwnwnwswwenwwwenwwwnwnwwnw
seeeneeneeseeswnenenwsweweewee
swswswwswswswswwswswwswneswswsw
nweseneweseeswwnwwswswnw
wnwsweswseswswswswseswne
swnenenwneenenenenenenenenenenenene
swswswswswseswswwswswswwnwwenwnwseswesw
wswwswswwswswsweswewswwswnwnesw
neneeewneneeswnewneneeseseswewnw
seseswseeesenwsesweseneseeseeesese
nenenenwnesewneswneneseneenewnene
neneneneneneswwneneneneneesenenenenene
swswswnwswnwswsweeswswseswswswswswswnw
sweeseseneeeseeswnewnwnwwewsee
neswsenwnewwnwwwwwwswweseenenww
nwwwwnwwwsewnwwswnewwwnewww
nwswsweswswneswseswswswswwneseswwnesww
wsewwnwwwwswnewwwwsewswwwsw
nwwwwwsenewneewwseenewwsesw
nwnenwwnwwnwwnenenwnenwenesenwenwne
nwnenwnwsewnenwsenwnenenwnwnenenenwnene
wswswwwenwswenesewwnenwe
wseswneeswneseenwnwsenwswewwweswesw
swnwseseeeeewseswnwseneseswsenwsesene
sweneswnwnwswsweneswnwswneswneswsweswsw
eeeswnwswneeneenewswnewneneeee
senwwnenwenwnwwsenwnwnwnenw
esesenweseeeeseseeesesese
seeeeseneseseeeswseeeeseewsene
wneswwwwswswwwewwnesesenwwwse
wnwnwwwsenwnwswnwnwnenewnwnwwnwwnw
senewsesesesesesesesesesesese
eenweswneeenee
nwnenwwnwnwnwnwwwseenwnwnwwnwnwnwswnw
esweneseeneeneeneneneneneswnenewnee
nwwwwswwewnwnwww
neneeneewneeneneneswnwnesenenenenwnesene
wneswsesenewswwwwwwwnwswwwseww
wesenesewswsenwswneswswseswneesesese
sesesenwswsewnwsenwswseswesenenwseeseew
wwnwswwneswwweswwwwwwwswww
nenenwnesewwswswewsenwswnewwswew
wwwnwwwnenwwwwwnwswnwnw
nenwswneneneenenenenwnenwnwnwnenwnw
swenwswewswswswewnwwswnewswseswne
swsenweeseswenwseseswsenwsesewseswswse
eeeweswnwnenenweeswneeeseneeee
swwswneseswnwseneswnewswweseswnwww
swswswswnenwswswseswseswswswneswwseswsw
enwsewsweeseseseneweeseswesenwese
nesenweneneneneneswnwnwnenwnenwnenwnene
seswseeenwsesenweseseseseseneseeseeswse
senenwsewnwnwnenwewnwswwneswnwnwsweenw
neeewnenweseseseeswnesweneneewwse
eeenwswswseneweseneenweneneneew
swswneneswnenenenwnenwnenenenwnwnwwnwe
swsweswwswswswwnwwwweswswswwswnw
wewwewwwwnwswswwwwswwswsww
swwnwwswnweseswnwswseweenewwww
neswswswseswswseswswswseswwswswswsesenw
eneeneneneewneneneeneneenesew
nwnwnwnwnwnwnwsenwenenenwnwnwnwwnwnwswne
weneswnwsenewseseswseeseene
eseseweneenwnweseeseseneneweswswe
swswswswseswswsenwnwseswseeswswsweswnw
sweswwsweswswwswswsweswswwnwswnwenw
eeeseseeenwsewswesesewsenwsenesw
seneswseseseseneseseseweesesesw
ewnwnwwnenwwnwwnenwwnwsewwnwswww
senweeswseswneweesesesesewnwnwsee
wseseseseseseeneseese
neswneswewnwswwwwwwwswwwseewnwse
sewwsesesewnwswswswseeneeesesewse
sweswwneseneswswswswnwswnesene
eesweeenenweeneeeswenwneeeene
eseseeneweeseeeeneenwneeenwne
neneneneneswneenenwnewneneneneswnenenenee
nwnesewwswswseswnwwneswswwswwsesesw
eeneeswesenwewenwneneeeseenwesw
nenwneneneneswnenenenwnwnenw
wwseewnewwneenwwnwswsewseenwse
wsenwwnwwswwwwwswnweewnenwsee
nweseswseseseeeseeseeseeesenwsese
neneswseesewesenenenwneswwswnewswswsenw
wwneseenwwsenwnwnwneswswewnwswwnwne
eneneeneneeneesw
nwnenenwenwnwseeenwwswnwnenwnenewnw
swsweswswsewewswswnwnwwsewwe
swseneswswswswswswsesewswswseseswswnesw
eseseesenwsenwseseeeweesesweeene
neswnwsewsweseswseseswsesesenwnwneseseswse
eeneeeseeseenwneeneeeeeewne
nenwswewnwsweneswwenwswneseseneenew
weeswwwwnenwswnwsenewnwswwnwnwenw
wwnewswswswwnwseswwwswswwwnwsew
newsenwwneswwnwwnwswseeswseswsenwww
swswwsweneswwwnwnee
nwswswswswswswswswnwnwswenwseswswseeswsw
nwnwnwnewswwswnwnwnenwsenweenwnwnwnese
nwenwseseseswswswswswswenwseswnwewswswse
swneswwewsenwnwnweeenenweeseese
nwwwwwswnwesenwwnee
nwnwwwwnwwnwnwsenw
nwseseseswswneseswswnwseseswsweswsweswsw
enweswnweswnweneeeneneneeeswee
sesenwseswnwswswnenesesesesweseseesesw
swseswsewnwnwwneswswswseswswneseswwsw
nenwnenwnwnwnwnesenwnwnwnwswnene
swwenweesenesweesenweseeeeee
swnewsesenwswesweeneneesewnw
swneweswsenwnenesese
nwnweseeseseseswseewseseenenwsee
neswswneseeeeenenwwneeenenwneseneene
swswswsesesesenwsesesenwseswsesese
nwswnwenwnwnwnwnwnwnwnwnwnwsenwnw
eeneesweeeeeeseswnweeneneewe
eeenweseseeeswnwwnwnenwswnewsenenw
neswswswswseseesweswsenwsesenwnwswswsesew
eseeeseenweseeeeseese
swwwswwswwswwsewwswswnwsww
swswwsenwswwswswswswwwswew
eeeseeeseswewneeswneee
sweseswswenwnwwswswnwnenwwseewwwsee
wwnwwwwnwnwwwwewwenewnwswww
sewneswnwseeneswwwnewnwenewseswwnw
seswswswswwswswswnwsweswswswswseswswe
seswswswswswnwneswnwswswsesesenese
eenweseeeseeeeneneeeweseesw
swnwseswswnweneswenwnewenenwnwswnenese
wweenewnwsewnwwnwnenwswseweesw
wwseneeneneneneseenwwswsewwesee
wwsenewwswswwwswwwwswsw
nwwswwwnwwwnenwnwwnwnenwwswwnesw
eneseeweseesesesweewnwenwwswe
eneneeeweneeseeeenesenenenwne
neeneeeeesweseweeeeeewee
swsewnesenweenwenwnwneseseswnwnenene
sewseswseseswseseseswswesenwneswsesese
nwwwnewsewswswwnwseewwwsenewne
enwneseeeeswswneeenwnweeewwsw
wnwswswswswswsweswsw
nenenenwnesenwnenwnwswwswnene
swseseseseenwesenwsesewseesewnwseenw
eswenwsweeeenwneswseeeenwwnee
sweeswswwswswnwwnwswseseeswsesw
nweenwswsesenwneswnweeeeseseswswsenw
wnewseenwnwswneseeeeswnenwneene
nwsewnwnwnenwnwnwswenwnwnwnwwnwnwnwse
swswswswswswswnwswswswswseeswnwseswswsw
senwseswseeseneseewnwnweeseesesesesese
eeseeeenweeeneeeeneeeew
seswsenwswseesesenwswsesweswneseswsesese
nwwnenwnwwwnwwwsenwwnwnwsewnwnewsew
swneswswswswnwwswswswseswswsweswseenw
swwnenwnwneneenenenwnenwnenenenwnwne
ewneswsenwnwenenenwswseeesewnwsww
wswswenwwnenwnwseeswwnweswswnweeswse
nwnwnwsewnwnwnwenwswwsewnwenwnwwnw
neneswneneneneneneeneenenwnenewnwneenesw
eeeseseeweeeeenee
nwnwnwswsenenwenwnwnwnwswnwnwsenwnwsweene
wwsewwwwswwnewwnewwswwswwsw
nesesewwneseneseweeenwsweenwswwse
eeenweesweeewweeeeneeeee
eseswnwwsenwswneswsesweseneeneneswwwsw
wnwnwnwnwewnwnwseenwwnww
enwsenwseseeneseeseseseeswnwseesesee
neneseseseeswswwseswnesesewswnwnwwee
neenwnwnwnenwsenwnwnwsenwnenenwnwneneswnwnw
senewnwnenweeewnenwnenenwswnwnenwswnwne
seseswseswsesesesesenesewseesesesesew
nenenenwwnwneeneenwswnwnenwnwnenewnee
wwwwwseswneewnewneswnwewswsenw
nwnenwnwnwnwenwnwnenenwnwsenwnwwwnwne
wswwsenewnenenesewneneseseseewnewsw
nwnwsenwnwnwnenwnwnwnwnwnwnwnw
nwswswnwnenenwenenewneeeneswswnenwwnene
sesenwnwenwnwwnwnwnwnwnwnwnwsenwneswsenw
nwneneneswnenwnwnwnenenwnenwsenwnene
seneswneewswnenwwneeeeneeneneewe
seswswswswswneswswswswwweswwswnwswwne
swnenwnwwnenwnwnwsenenwweesenenenew
swsewwnenwnwwwwsenwwwewnwwsenew
eeeeeneeneeweneeeneenwnewswene
nwnwnwnwwnwwwwnwwwwnewnwwswneswe
swwnwsweneseswwswnewswswnwswseswnwseswe
swswswswswswswswswswseswswswswneewnwww
senwnenwsenenewnwnwwsenenwnwnwnwenenw
wswnwenwenewnwwwwwnwnwwswwwsw
swseseswswseswseneswwseneseswwseswsesese
eeeswsenewenweseeeeseeeenesw
enwnenwneswwewnwsewnwnenenwnwse
nwnenwnenwenwnwnenwnwnwswnwnwnwneneswnw
sweswseswswnwswswswswswswseenwswsewsw
wnwnwewnweenwnwewnwwsenwweswnw
senenwnwwnwnwnwwnwwwnwnwnwnwnwnwnwsesw
nwnwnwneswnwnwenwnwnewnwneenwnwnwswne
seesenewnwneswnenenenenenenenesewnene
seswwswnenwnwseseswseswswswseseweneesw
swwswenwwnwnwwewwwnwwnwnwwe
nwnwnenenwnwsenenwnwsenwnwswnwnwnwnwnw
wewsesenwswnewnwnwwnw
nesenenewneesenenweneweneeneeneeswne
senwwsenwswswnwneesewwnwneenwwnwswe
nwnwenwnwnwswnwnwnwnwnwswnwnwwenwnwnwnw
nwnwnwswnwnwneewnesenwnwnwnewnenwnenwnwe
wseseenwswseneseseneeeseeeeesenw
nenewwsewwenenwwsewswwnwwswww
nwwwnwwnesewewwwwswwewwseww
eeswseneswwsenwesesweswwsenwnwnwnese
wnwwswwewwwwwwwsenwnwwnwwsenw
nwnwnwnwnwneseneenwnenwwneenenwnwwnw
nwnwsewswnesenenwenweneseeneswwnenwwne
nwseeneneneneeneneneneneswwwwewswse
nwnenwnenenenwwswneneswnwneneneeenenwne
swswswsweswnwwswswswsweswneswswswswsw
seswseseswseswseswswnwseswswswseneswew
senwwwweswnwneswenwwswnwnwnenwwse
swswswswsewseswsewsesesesweneswsesesw
enenewneneneeeewneneseeneeneseene
nwnwnwnwnwwsenwnwsenwnwsenwnwwnwnenwnwnesw
nenenenwswnwneneneneneneneenwsenenenenw
nwnenwnwnwnwnwenwnwnwswneswnwnwnwnwnwsenw
neenenwseswnwseswswnwwnenwnwnenenenwswsew
sewnenwnenwenesenwwnwsenenwwne
wswnwwswwnwnwnwnenewnwnw
senwswneeswswswswwwswswswwsweswwsw
esewswneeeeneeewneneneneseenenwnene
nenwnwwneswnwswnwnenwswnwnwsenenwnenwnwnw
wswswnwswswwswnwswwsweweswswswsw
swswenewweswwwsweewwseswwnwnw
swwwseswswwsenesweesweenwnewsese
eseeseneseewsweneeeeseeeeee
wwnwwnwnwnwwswsewnwnwnwnwewwwnw
nwneswnwswnenwenwnwnenwnwwsenwnwnwnwne
eeeeeeneneneeweeeese
seseswseswneneseseswsenwseseseswseswsesee
wswwseswswswswswewwswnwnewsww
esenwwwseswwwnewwewnewwwww
seeeeeneeseeesenweseesewnwesese
eswwewwwwnwwwwwsewwwewnwsw
seeseeseesenwnwseeswsweswseseseesesenw
eeseeweeeseeeeeeeee
seeeseewswsenwseenwseeseneneswese
nwnwnwwneneneneewnwenenenenwsenwswnw
wsesweswnewswneswsenesewswnwseswnesene
seswseseseswseseseseswnwswswseswsesenwe
newnenesewneneneeneneseneeneneneesw
swswswswwsweswswwwwswsenweswnwwne
enwwwnwswswswwsew
nwnwnwneswnenwnwnwnenenwe
nenwneneseswnenwnenwneswneswwswneseee
eneneneeneswswneneenwswenwwneseenenw
seseswnwsenwsewswnewnwwneewneswswnew
eneneenenenenenenenenewnenenenesw
neswneswwneneewseneneeewnwnenenwne
swnwnewneeseswnweneswnwsenwnwwsewe
swwenenwswwnwsweseswswsw
senenwnenenenewnwnewnwenwnwneeneswnee
wnewneswswswwneseswww
sewwweswsewseswswswswnewseeneesw
wnwnwwsewwnwneseewwwnwsenwwww
swswswwswwswewwswswswseeswswnwswsw
seswneswsewswswswseseeswsw
nwwwnwsenwwseseneewwnwnwwwwnw
swswswswnwswwswsewne
sewneswswwweseneneeswnwnwswewswswe
nenwenwenwnwwnwnenwnenenenwnwneswnenw
eeneseseseseenwseswnewsesenwwew
nenwnesenenwwnenenenwnenenwneene
swseeseseseswsenewseseeswswnwswwswnwnwne
nwnenwnenwwnewswswseenwnwnwnw
seseswseswwsweswswswsenwswsenenwswswseswsw
nwwwsewwwwwnenwnwwwwwnwsenwsew
nenwnenwnenenenwnenwnenenesewneswnenenw
neenwnenesenwnenwnwneenwseswnwwwnwne
nenwnwnesenwnwenwnwsenwnwnwnwnwnwnwnww
swwwwwswwneswwwwsewwswwswenw
nwswswwswnwseseenww
nenwsesewneeswnwnenesenesenenewnwneee
swnewweneswseswswswswswswswswneswswswnwsw
eneseneeswwnwwnwnwsesewswenwnwsewnw
nweswnenenesenwneneneneswenenenenenenwnw
swnwnweneseenwewnweeswsenwswswnwese
esenwsweenwseeseeeeeesesweeese
wwwwwwwwwwwnesewww
swseswsesesenwseswswse
seseseswseesewseswseseseswswsese
wseeswswneseseswnwnwswswswnewwwwsw
wnwenwnwswnwnwswnwewewwnwnewnwnwse
enenwnwwwnwwwsenenwswnwseneseswnenw
eeeeswseseeeeseeeenwswnweeese
nwneswswswseswswwswswseeswswswwseswswsw
swseswnwswseswneswswswswswswsweswswsww
swswswswnwswswswsenweseseswseneseswswne
eswwnweseesesewnwsesesenwseseneesesese
enwseewnesweeenenwneseeswneeswenwe
wswwswswwseewswwnwwwseswnwswenw
nwnwnwwnwnwnwswnwnwnwe
swsenwnenwnwnwnwwe
nwseeseneeeeseeeeeeeswneseswe
neeeeewnenewnesesw
nwsewesenwnwnenenwnwsewwseneenwswnwnw
nwsewwnenenenesenwnwsenwsewnesenenwse
swsenenenwseseseswswsenwweeswsenwwsesw
wewswswwswwwwnenweswwsw
sewwwwneswnewwswwwwwwwnewwww
nenwnesenwenenwnenesenenwswswenewwnenene
eneeneeseeewneeneee
seswnwwwnenwewewnwenwwnwnwsesew
swseenewnesenwwsenwwseswnese
senwwwwewsenwwnwnwnwnwswnwnenwwswnwne
nwseseseneswsenenesesenewnesesenwswwseswe
sesewnwnwnweeswnwnwwnwnwwnwnenwnwnese
nwneneneenenwneswnwnwneneneneswnenenene
wweseseswswneswsesweseswseseswsewswe
esweseeeseswnwsenwseenwsenweesew
neswseeweeesweseeseesesenwseee
nwwnwnwswesewneenwsesewwwnwnwnww
nesewneseneeneneeeeenenewnenenenenenw
eswswswwswswwwwswnwswswwwswswsene
eeneneeneenenenwnenenewneeeeewsw
swseswneswswseseswswneseneswsesesese
weweseneneesweswswnenwenwnwwseswse
nenewnweesenenwneneneneeseneeneenenese
enenwwnwnwnwnwnewnwnwwswwwnwnwwnwse
seeseswseseeenwsesenesenwseseeeese
neenwwnesenwneneneswsenenenwnwsenwnwwne
swwwswswswnwwewswnewwnewwwswswsw
seswsesesesesewsesesenewneneseesesese
neswswnwswswswseswwnesewswnwse
wseseswnwsenwswswswseseeeswnewseeswsw
seseewenwseseseesesew
seneswseswnweneseswnwwnwsenenwsenwsesww
wwseneswswwswwneseswswswswwseswswwne

@ -0,0 +1,83 @@
"""Solution for 2020/24"""
from collections import defaultdict
instructions = []
with open('input', 'r') as f:
for line in f.readlines():
line = line.strip()
i = 0
instruction = []
while i < len(line):
if line[i] in ['w', 'e']:
instruction.append(line[i])
else:
instruction.append(line[i:i+2])
i += 1
i += 1
instructions.append(instruction)
print(instructions)
MOVEMENTS = {
'e': (1, 0),
'w': (-1, 0),
'ne': (0, 1),
'sw': (0, -1),
'nw': (-1, 1),
'se': (1, -1),
}
MOVES = 100
def main():
flipped_tiles = defaultdict(int)
for instruction in instructions:
coord = parse_instruction(instruction)
flipped_tiles[coord] += 1
print(''.join(instruction), coord)
blacks = set([x[0] for x in flipped_tiles.items() if x[1] % 2 == 1])
for day in range(MOVES):
new_blacks = set()
bbox = get_bbox(blacks)
for x in range(bbox[0] - 1, bbox[2] + 2):
for y in range(bbox[1] - 1, bbox[3] + 2):
coord = (x, y)
neighbors = get_neighbors(coord)
adj_blacks = len([x for x in neighbors if x in blacks])
is_black = coord in blacks
if is_black and adj_blacks in [1, 2]:
new_blacks.add(coord)
elif not is_black and adj_blacks == 2:
new_blacks.add(coord)
blacks = new_blacks
print(f'Day {day+1:>3}: {len(blacks)}')
def parse_instruction(instruction):
coord = (0, 0)
for move in instruction:
dx, dy = MOVEMENTS[move]
coord = (coord[0] + dx, coord[1] + dy)
return coord
def get_bbox(coords):
x_coords = list(map(lambda coord: coord[0], coords))
y_coords = list(map(lambda coord: coord[1], coords))
return min(x_coords), min(y_coords), max(x_coords), max(y_coords)
def get_neighbors(coord):
neigh = []
for dx, dy in MOVEMENTS.values():
neigh.append((coord[0] + dx, coord[1] + dy))
return neigh
main()

@ -0,0 +1,53 @@
"""Solution for 2020/24"""
from collections import defaultdict
instructions = []
with open('input', 'r') as f:
for line in f.readlines():
line = line.strip()
i = 0
instruction = []
while i < len(line):
if line[i] in ['w', 'e']:
instruction.append(line[i])
else:
instruction.append(line[i:i+2])
i += 1
i += 1
instructions.append(instruction)
print(instructions)
MOVEMENTS = {
'e': (1, 0),
'w': (-1, 0),
'ne': (0, 1),
'sw': (0, -1),
'nw': (-1, 1),
'se': (1, -1),
}
def parse_instruction(instruction):
coord = (0, 0)
for move in instruction:
dx, dy = MOVEMENTS[move]
coord = (coord[0] + dx, coord[1] + dy)
return coord
def main():
flipped_tiles = defaultdict(int)
for instruction in instructions:
coord = parse_instruction(instruction)
flipped_tiles[coord] += 1
print(''.join(instruction), coord)
blacks = [x[0] for x in flipped_tiles.items() if x[1] % 2 == 1]
print('flipped', blacks)
print(len(blacks))
main()

@ -0,0 +1,2 @@
5764801
17807724

@ -0,0 +1,2 @@
11349501
5107328

@ -0,0 +1,35 @@
with open('input', 'r') as f:
p_key_a = int(f.readline())
p_key_b = int(f.readline())
print(p_key_a, p_key_b)
PRIME = 20201227
SUBJECT_NUMBER = 7
def main():
enc_key = 1
loop_size_a = 0
print('Brute forcing loop size of a...')
while enc_key != p_key_b:
enc_key = loop(enc_key, SUBJECT_NUMBER)
loop_size_a += 1
enc_key = 1
print(loop_size_a)
for _ in range(loop_size_a):
enc_key = loop(enc_key, p_key_a)
print(enc_key)
pass
def loop(num, subj_num):
return (num * subj_num) % PRIME
main()

@ -0,0 +1,16 @@
#!/bin/bash
PARENT_DIR=$(dirname $PWD)
YEAR=${PARENT_DIR##*/}
DAY_RAW=${PWD##*/}
DAY=$((10#$DAY_RAW))
SESSION_KEY=$(cat ~/.aocrc)
echo "Fetching ${YEAR} ${DAY}"
echo $SESSION_KEY
curl -b session=$SESSION_KEY https://adventofcode.com/${YEAR}/day/${DAY}/input > input
echo "Visit: https://adventofcode.com/${YEAR}/day/${DAY}"
Loading…
Cancel
Save