Compare commits

..

6 Commits

17 changed files with 1896 additions and 213 deletions

143
Cargo.lock generated
View File

@@ -5,9 +5,7 @@ name = "advent-of-code-2020-rust"
version = "0.1.0"
dependencies = [
"lazy_static",
"rayon",
"regex",
"usize_cast",
]
[[package]]
@@ -19,147 +17,18 @@ dependencies = [
"memchr",
]
[[package]]
name = "autocfg"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "const_fn"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826"
[[package]]
name = "crossbeam-channel"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
dependencies = [
"cfg-if",
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d"
dependencies = [
"cfg-if",
"const_fn",
"crossbeam-utils",
"lazy_static",
"memoffset",
"scopeguard",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d"
dependencies = [
"autocfg",
"cfg-if",
"lazy_static",
]
[[package]]
name = "either"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
[[package]]
name = "hermit-abi"
version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
dependencies = [
"libc",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb"
[[package]]
name = "memchr"
version = "2.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
[[package]]
name = "memoffset"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87"
dependencies = [
"autocfg",
]
[[package]]
name = "num_cpus"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "rayon"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674"
dependencies = [
"autocfg",
"crossbeam-deque",
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
"crossbeam-utils",
"lazy_static",
"num_cpus",
]
[[package]]
name = "regex"
version = "1.4.2"
@@ -178,12 +47,6 @@ version = "0.6.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "thread_local"
version = "1.0.1"
@@ -192,9 +55,3 @@ checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
dependencies = [
"lazy_static",
]
[[package]]
name = "usize_cast"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "810f3a98a85147e3ad2a1331aa6dac66490e802d65fa0ab283c383058e3f9751"

View File

@@ -8,6 +8,4 @@ edition = "2018"
[dependencies]
regex = "1"
lazy_static = "1.4.0"
usize_cast = "1.0.0"
rayon = "1.5.0"
lazy_static = "1.4.0"

795
input/day12.txt Normal file
View File

@@ -0,0 +1,795 @@
N5
W1
F61
W2
R90
F50
N2
F40
E4
F48
R180
F17
W4
N5
F3
W3
F1
R90
S2
F23
L90
S3
W3
S4
E4
L90
W3
S3
E4
N2
F28
S2
W2
L180
E3
R90
E3
F83
W5
S4
W3
N2
W5
F90
N2
F82
N2
F2
S4
L90
N3
L90
S2
F12
S3
F40
L90
F56
N1
F29
W2
S2
R270
S4
F14
E4
R90
E2
S2
E2
F82
L90
N3
R180
R90
S1
W1
L90
S2
F78
W2
F52
N4
W5
F38
L90
W2
S2
L90
F66
R90
F62
E3
S5
L90
F99
F2
E4
R90
N3
W4
N1
F71
E2
N3
N2
R90
E2
F66
S4
R90
E5
F29
E5
L90
W2
N2
E3
F18
L180
F17
W1
R90
W3
S5
R90
S3
R180
N5
F69
W1
W3
L180
F72
W5
N1
R180
W3
W4
F85
W4
L90
E4
N5
F73
R90
F70
E4
F79
S5
R180
E2
F35
E4
L270
W2
L90
N5
R90
N4
F64
W2
R270
F33
N5
E4
F94
W1
N1
R90
F79
F46
E1
R180
S3
W3
F72
E1
W4
F95
W2
L90
N3
L90
F85
W3
W1
F54
N3
E1
N4
E5
L90
F61
W2
F7
L180
F87
N4
W1
F87
F3
E3
F63
R90
S4
R180
S4
R180
R90
R90
E5
N4
E2
F86
S3
F98
N4
F70
L90
E4
F26
W4
F19
L90
S4
W4
F84
N1
E4
L180
S2
F74
S1
F86
R90
S2
F78
N4
S2
W1
N5
E2
F38
W4
N1
F75
S1
E1
N3
S1
F54
N3
F88
N5
L180
F15
S2
S2
E2
N3
F97
S3
N3
E3
N5
E3
R90
F87
L90
F15
L90
E5
R90
F70
N3
W2
F47
W2
W3
F17
R90
F95
E4
F28
W4
R90
E2
R180
N4
R180
W4
R270
F73
W1
N2
L90
S1
F65
E1
F42
N2
F74
R90
F21
W5
S1
N5
R90
E4
N5
S5
F99
W4
L180
W1
F83
N2
W2
F87
E2
S3
W1
L180
F89
S1
W2
E2
L90
S2
W1
S5
R180
E5
N1
F82
S3
F7
L90
F31
L90
N3
F84
W3
N4
F100
N1
E2
R90
F90
N3
F43
R90
F2
W4
L90
F87
L90
E3
F71
L180
N1
L90
E4
N3
F31
W1
F80
R270
N1
E4
N1
F22
N4
E1
F57
R90
N3
W2
L180
N3
L180
W4
F59
S4
F10
N5
L90
S3
L90
E1
F96
E4
N3
F54
L180
F47
W1
N4
E1
S4
R180
L90
N1
R90
N3
R90
N4
R90
S3
F59
N5
L90
E4
F72
W4
F76
R90
E3
F70
L180
N3
W2
R90
F65
L90
F71
S3
F43
R90
W2
N2
R90
W1
R90
S4
R180
S1
E3
F72
L90
F61
L90
F75
S1
S5
F15
R90
E3
N2
L270
F48
N1
R180
W2
F69
E4
R90
R90
W1
S5
W5
R90
S4
S3
F51
F43
E2
N5
L180
F89
W1
R90
F59
R90
E2
F51
R90
F91
W4
S5
E4
L90
S5
R90
F44
F47
E4
W1
F77
S5
R90
N2
F87
N4
R90
W5
R90
W5
F89
L90
F61
E2
F29
N4
R90
F31
S1
L90
E5
N2
F7
L180
S4
F63
W4
N5
S2
N1
E5
F87
S5
R180
F14
W4
R180
E1
L90
F67
E2
L90
E5
S2
L90
W2
R90
F94
W4
R90
W3
S3
R90
N5
F55
L90
F43
L90
N5
F16
E4
N2
L270
W3
E1
N2
R180
F51
N5
N1
F36
W4
F38
N5
W1
F29
R180
L90
N1
W3
E1
F78
E1
N1
E2
F57
E4
F83
W5
F32
N3
W4
F36
N2
E3
F74
N4
F54
W5
L90
S1
F42
W4
S5
E3
F64
W2
R180
S2
E1
N2
R90
W3
F36
N3
R90
S2
F53
W2
F85
E5
N2
F9
E1
F83
L90
E5
F44
L90
F92
W5
R270
E4
S1
F6
L90
F96
R90
N1
E4
N1
W3
S2
S4
F39
E1
S1
F82
S3
F78
L90
N4
E1
N2
R90
F63
S3
L180
F52
W2
F49
W2
L270
N1
R180
E3
F79
F73
N1
R90
N3
R180
S2
F35
S1
F43
S1
R90
S4
W4
F12
S1
F2
N3
E4
L90
F51
R90
N4
F90
R90
F99
E3
N1
R90
S3
L270
W5
L90
R270
F50
N5
F33
S3
F18
L90
E4
L180
W4
R90
F21
W4
F24
W2
E5
N3
W1
R90
W3
S3
F82
W1
S1
F12
N3
L90
F37
R180
F36
F27
E3
S3
F36
W4
S1
F6
R90
F59
S1
E1
R180
S2
W3
L90
F45
R90
E1
F29
S5
W3
S5
W4
L270
S2
F13
E4
F28
R90
F80
S4
E1
S2
F62
R90
F26
L180
F19
W2
L180
W5
F15
N1
F68
E4
F75
S2
F58
S4
R180
E3
N1
L90
S2
F12
R90
E5
S5
W4
N5
W1
R180
S1
F70
R90
F97
L90
E3
S3
L270
E1
F51
N4
L180
N1
R90
F42

5
input/day12_example.txt Normal file
View File

@@ -0,0 +1,5 @@
F10
N3
F7
R90
F11

2
input/day13.txt Normal file
View File

@@ -0,0 +1,2 @@
1006605
19,x,x,x,x,x,x,x,x,x,x,x,x,37,x,x,x,x,x,883,x,x,x,x,x,x,x,23,x,x,x,x,13,x,x,x,17,x,x,x,x,x,x,x,x,x,x,x,x,x,797,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,29

7
input/day13_example.txt Normal file
View File

@@ -0,0 +1,7 @@
939
3,7919
7,31
67,7,x,59,61
1789,37,47,1889
7,13,x,x,59,x,31,19
67,x,7,59,61

567
input/day14.txt Normal file
View File

@@ -0,0 +1,567 @@
mask = X111000X0101100001000000100011X0000X
mem[4812] = 133322396
mem[39136] = 1924962
mem[35697] = 29912136
mem[41065] = 2558851
mask = 11001101X110000X010X01101100X1X0X001
mem[38134] = 481
mem[53084] = 5470
mem[37619] = 2696
mem[12248] = 262787806
mask = 011011000111X1000100010X00XXX0X010X0
mem[47555] = 417868017
mem[43020] = 11374336
mem[9849] = 677
mem[10472] = 2780071
mem[6278] = 44095
mem[61339] = 4820103
mask = 0001X1X0111101X0000000101110101XX010
mem[54969] = 910
mem[39162] = 100172
mem[17392] = 11619
mask = 110111X10111010X00000X1X10011X00X001
mem[45516] = 1541
mem[4373] = 50557596
mem[59075] = 12671
mask = 110111XX0X100100000011011001XX0XX100
mem[62464] = 171815
mem[46196] = 148784
mem[20537] = 616
mem[21990] = 737337799
mem[5155] = 1869813
mem[55244] = 25386
mask = 1X011XXX0X110X000000111111X0010X1100
mem[14027] = 131770871
mem[35273] = 329
mem[27168] = 13145
mem[15552] = 20442
mask = 000011110X1X1110100011XX010X0X0X00XX
mem[45041] = 535
mem[41349] = 2943
mem[32249] = 13150
mem[42109] = 12648516
mem[38042] = 469004
mem[31535] = 3710
mem[36786] = 4985
mask = 01XX01X10111X0X1XX0X011111101110X000
mem[21541] = 149981598
mem[55577] = 358503898
mask = 010XXXX10X100000010010010001011XX1XX
mem[61804] = 6027
mem[31021] = 7248
mem[13164] = 3531
mem[44086] = 3037407
mem[36788] = 692
mask = 000X1111011XX0100000X1011101X110XX00
mem[54870] = 3410195
mem[56040] = 124015462
mem[44086] = 7010
mem[12761] = 1494532
mem[19537] = 46357
mask = 1100110X01101100X0001100111X000110X0
mem[22275] = 64052559
mem[44465] = 140458063
mem[40841] = 137069
mem[3249] = 32613
mask = 01011X010010011X01011001000000X01X00
mem[39991] = 823052
mem[9454] = 18550503
mem[46196] = 49070
mask = 00001X110011X1110XX0X011XX0X00100111
mem[24003] = 69183
mem[51214] = 1231
mem[11159] = 190497327
mem[60674] = 2663233
mem[45359] = 221181147
mem[24393] = 6821
mask = 0X00XXX1011100XX0100X11110X001110001
mem[2424] = 16287
mem[62077] = 204882244
mem[51144] = 1552
mask = 0X011X11001101X00000000X10010101X000
mem[52533] = 814
mem[62367] = 2681
mem[15329] = 2524
mem[5958] = 33152916
mem[5169] = 14940999
mem[7316] = 16737491
mem[46594] = 82304549
mask = X0011111X11X0010X0X000000X0X01000000
mem[33860] = 9277
mem[40193] = 5247776
mem[21536] = 5090
mem[55159] = 525789978
mem[7272] = 1947
mem[43269] = 1262
mem[60321] = 366
mask = 0001111100111X10000X0X0001XX0110X001
mem[39371] = 20355
mem[20076] = 130194
mem[62464] = 165608
mem[5363] = 12798999
mem[23392] = 172431
mem[26007] = 1025238334
mem[31848] = 2690303
mask = 01000001XX1X0000010010X0001X1111X001
mem[47846] = 67159609
mem[20937] = 4060
mem[25317] = 2498
mem[3297] = 10289
mem[24930] = 32257217
mem[18446] = 224279204
mask = 1X01111100X1010X00X0001100011001010X
mem[13122] = 14370686
mem[4812] = 1894
mem[6609] = 52772339
mem[14721] = 1976711
mask = 01X1X111X011X000X000000X00X10100X000
mem[40113] = 2623234
mem[323] = 652
mem[1945] = 7426
mem[57708] = 9306
mask = 11011X101X100100000001110100X111000X
mem[33159] = 2659
mem[22884] = 64195
mem[834] = 833
mem[45165] = 9968
mem[28935] = 4681138
mem[44677] = 505010306
mask = 1101110X0X11010000001X010X001X000X00
mem[16970] = 183048247
mem[42799] = 257494062
mem[13112] = 533254525
mem[62010] = 512202
mem[20033] = 426
mem[43020] = 400947
mem[48764] = 118538673
mask = 0001X1X10011111000X1000X101XX010X0X0
mem[27241] = 68762
mem[32235] = 3226
mem[20033] = 371335116
mask = 0100110101110000X1X1XX11X011X01X1100
mem[54774] = 1707102
mem[53424] = 1648856
mem[15029] = 167830926
mask = 11X11101X01000000100010XX00101100100
mem[56937] = 2076568
mem[44446] = 3568
mask = 0X01011XX11XX1X000001X11000100010010
mem[26707] = 257188
mem[20837] = 1147
mem[35774] = 8287058
mem[59176] = 31911785
mem[50627] = 323142
mem[51555] = 112545
mem[13400] = 2049087
mask = 010101010111000001X0X010X01101X10100
mem[2294] = 1466
mem[31885] = 1602
mem[59859] = 61908
mask = X0001001011100X10X0011X1X0X0X11110X1
mem[27773] = 7111614
mem[39484] = 7001259
mem[31946] = 84116977
mem[39162] = 96247952
mem[51914] = 12595221
mem[49298] = 71588604
mask = X0X0X100101101XX0000001X100000000001
mem[48415] = 80182
mem[59003] = 7049
mem[6017] = 2787426
mask = 0X0X1X1101100010000X10000110111X0000
mem[24393] = 4269
mem[23336] = 64391144
mem[46643] = 130406
mem[59662] = 113947
mask = 01X0XX0X01110X00010X0100001X01X0X001
mem[25720] = 322160
mem[57525] = 111148340
mem[43480] = 1919
mask = 010XX111001100X0000X0001000101X00X11
mem[33465] = 911366523
mem[13169] = 81794
mem[57515] = 1697
mem[4419] = 29555
mem[4240] = 416685
mem[26177] = 28183
mask = X001X11X111100100XX010000X0101X00000
mem[65077] = 6440266
mem[33028] = 10910
mask = 100110111110001X100000011X00X110X000
mem[8931] = 10038533
mem[53984] = 2831
mem[17466] = 14082894
mem[38326] = 49428809
mem[4156] = 9647963
mask = 01001001011XX0X101X0111111001XX01X10
mem[28561] = 7722001
mem[53427] = 179659
mem[37705] = 1016
mem[32033] = 1659677
mem[42597] = 97610103
mem[40939] = 126093
mask = X001111X00X110100000001X010101110000
mem[39162] = 1420260
mem[49152] = 2802
mem[54774] = 2549
mem[6401] = 1061
mem[25048] = 791
mem[21448] = 56382
mask = 0X011X1X1110X01XX010000101010XXX0000
mem[12854] = 4443
mem[16736] = 3097
mem[15329] = 2868
mask = X1011X0100100XX001X1X001X10XX1101110
mem[22173] = 146697
mem[11532] = 4316
mem[41112] = 143103
mem[35929] = 36019
mem[14185] = 18987
mask = 010011X1011X00000X0X1110000X0X1X100X
mem[51323] = 196738
mem[20861] = 775
mem[49853] = 5614963
mem[4852] = 4092504
mem[34732] = 10160
mem[63865] = 552463
mem[53015] = 35092
mask = 110111X00011X1X00X1000X110010000X000
mem[59891] = 1040
mem[14027] = 831
mem[14721] = 431731202
mem[43480] = 136732740
mem[62010] = 53198026
mem[52533] = 65
mask = X1011110001X01XX00X000X0X0011X0X0000
mem[63869] = 7097798
mem[65485] = 43091
mem[12625] = 258935
mask = 1001111111100101000X00111XX100110X11
mem[29081] = 743
mem[11697] = 449089661
mem[27440] = 361017403
mask = 1X01111111X1001010X00X000X1X11100000
mem[61025] = 167531331
mem[42074] = 92704
mem[18402] = 472
mem[40360] = 280090
mem[5198] = 87354676
mem[9957] = 234433
mask = 0X001001011XX01101101111111X110010X1
mem[50537] = 346959
mem[21274] = 2621975
mem[4434] = 22182688
mem[14816] = 111642816
mem[45030] = 1047
mask = X10111010X100000010XX001110X0X0X11X0
mem[54995] = 10747901
mem[56949] = 580474160
mem[13122] = 1836825
mem[53718] = 320640
mem[46066] = 20031967
mem[9592] = 496370249
mask = 011X000101X1X000010XX00XX0X001110X00
mem[63634] = 58
mem[6549] = 125465708
mem[65227] = 106568
mem[7157] = 119628
mem[53879] = 3596
mem[24737] = 2988756
mem[28613] = 30239165
mask = 0000X1X10011011100001111110X000011X1
mem[20783] = 23844666
mem[60525] = 119787833
mem[25174] = 31103270
mask = 1101110X011X000X000011111111110X1101
mem[45272] = 46518537
mem[3148] = 1496883
mem[42109] = 267291213
mem[45414] = 29326966
mask = 0X0010010111X011010011X0X11001101101
mem[55042] = 14456992
mem[30328] = 1191922
mem[51217] = 39478
mem[1322] = 2415193
mem[24047] = 687485
mask = X1011001XX1X00000X1110011100X110101X
mem[42521] = 44802983
mem[45188] = 10474
mem[14816] = 1004064
mask = X00111XX1110010X000001X11XX000010XX1
mem[64649] = 1321
mem[27940] = 9780
mem[10759] = 1316
mem[42260] = 637
mask = 000001XXX110X000011X00X0X11111X1011X
mem[8130] = 586439
mem[20778] = 6114
mem[41065] = 69134521
mem[57668] = 25104
mask = 0001111000XX010000000001X0X110000001
mem[10566] = 242598767
mem[10513] = 341510032
mem[4240] = 11342
mem[39251] = 1852
mem[52533] = 505
mem[62768] = 1846627
mem[41273] = 78405
mask = 110111X000X101000X00X001111X11000001
mem[33847] = 843
mem[61025] = 231
mem[32862] = 3139142
mem[39477] = 104793
mem[48709] = 22758
mem[34944] = 81906
mem[60884] = 922756598
mask = 01XX10X1X0X00110011100X1001000X01110
mem[34411] = 14772
mem[9081] = 3144
mem[61341] = 5637589
mem[50639] = 938779
mem[50087] = 920425693
mask = 00001X1100111X1XX0000011X00000000101
mem[20861] = 406200
mem[59075] = 9157990
mem[21990] = 505513
mem[9592] = 413
mem[17466] = 858
mem[8519] = 949888
mask = 0110X1X00111X1000X0010100010110XX100
mem[49665] = 865148
mem[4812] = 68414685
mem[34425] = 226483883
mem[63865] = 2137555
mask = 000111100110010000XXX11110110100X001
mem[8335] = 716
mem[46594] = 986
mem[50399] = 186
mem[10648] = 865
mem[22244] = 24152
mem[34859] = 58911
mask = 11011X00001X0100001001111X10X0010101
mem[57303] = 25331540
mem[51255] = 24
mem[47101] = 73094
mem[33918] = 1216
mem[29564] = 1997625
mask = 0001111X1X1X0X1000X00XXX0101X0100000
mem[41256] = 6851204
mem[64098] = 3891136
mem[4192] = 1119
mem[63634] = 412948
mem[7034] = 184980285
mask = 0X11X00101111000X10001100100011X1011
mem[52085] = 320289
mem[61015] = 172827015
mem[58495] = 1213483
mem[31021] = 8612509
mem[33625] = 36389
mem[24830] = 609539269
mask = 1001111X0001010XXX0000X01X0011X10000
mem[4652] = 50833
mem[14676] = 853672
mask = 110011XX0110XX000X001100XX001X010X00
mem[2230] = 13635
mem[26596] = 1541
mem[48691] = 3294711
mem[54923] = 402638
mem[16937] = 5998214
mem[45115] = 914360
mask = 0X1011000111XX00010011011X00010X0X01
mem[45320] = 48783
mem[26007] = 8905339
mem[17200] = 675445941
mem[16192] = 2472925
mem[32043] = 18546
mask = 0X0X010XX110X0X001X0X010110111000110
mem[13424] = 2992684
mem[36655] = 2952618
mem[15191] = 15889
mem[46410] = 4107
mem[10930] = 254266
mem[17174] = 25
mask = 01X1010101X000XX010X1X01001101X10000
mem[46463] = 136939958
mem[12384] = 35808
mem[25429] = 58008820
mem[45359] = 87512582
mask = 010X1X100011X1X10X0000000001000X0XX1
mem[46605] = 1230722
mem[25174] = 437033994
mem[12673] = 730
mem[19856] = 1681
mask = 000X11X0X0110100000000011X11100X0XX1
mem[11408] = 935967
mem[20861] = 1048829
mem[24219] = 67911289
mask = X1X1110X00X1X0000000111110100XX10000
mem[40028] = 1018
mem[59183] = 14694
mem[2921] = 862972454
mem[13885] = 4679694
mem[43628] = 19289
mask = 000X111X0011X11000010X01X00000101XX1
mem[12269] = 3866
mem[17658] = 614591
mem[9957] = 408492346
mem[11396] = 4758
mem[12897] = 14036510
mask = 01011X100X11010000000X01000111000X01
mem[19856] = 191255190
mem[12106] = 3753509
mem[6353] = 57008
mem[39019] = 12566363
mem[48517] = 12346
mem[8240] = 83254479
mem[50020] = 11399
mask = 00011111001X100X0000110000X1X1101X01
mem[52533] = 2830
mem[1266] = 7910
mem[61174] = 2820
mem[20861] = 95813054
mem[56965] = 862485
mem[62822] = 41372
mem[47420] = 11474585
mask = 0101111110X001000XXXX0101X1X01000100
mem[10414] = 48452289
mem[7061] = 23575482
mem[8503] = 63531
mem[42733] = 4606968
mask = 11XX11100010010X000000110000X000XX01
mem[25088] = 120084812
mem[3201] = 6845180
mem[9592] = 1020
mem[4433] = 22837
mask = XX01111XXX1X01000000001110010X010X01
mem[4240] = 23113
mem[12224] = 858638082
mem[17504] = 317
mask = 0000111100111110X00XX101XX0XX1X110X1
mem[745] = 904
mem[53504] = 162
mem[31021] = 45256
mask = XXX11100001X01000010X1X1X0X1111110X1
mem[46463] = 38058788
mem[31885] = 2525105
mem[62077] = 13891952
mem[56140] = 1865
mem[4652] = 800219
mem[43269] = 240797
mem[35058] = 29633574
mask = 01010101011X000001XX00X01X010001XX1X
mem[32862] = 187905
mem[15688] = 239625041
mem[3826] = 7177029
mem[45414] = 1397
mem[3363] = 1396790
mem[21976] = 10750
mask = 00X0111100X1X110X00X0100X00XX0111X11
mem[6233] = 565
mem[51991] = 1735
mem[28206] = 1317648
mem[25174] = 880610
mask = 110111110X1X0000000010000110010XXX11
mem[32463] = 8176
mem[8050] = 6174
mem[55638] = 3675533
mem[46594] = 178473
mask = X00X1X111110001010X000011000001XXX00
mem[27567] = 1662437
mem[10759] = 6467
mem[8908] = 1030
mem[6248] = 2655
mask = 0100100001110000010110XX00001XX0010X
mem[2639] = 8577236
mem[34870] = 65836
mem[4053] = 222391
mem[57945] = 855831793
mask = 1X011101011X00X0010X0XX1001101111100
mem[55806] = 1749
mem[14816] = 56071
mem[64085] = 451286812
mem[36655] = 539840
mask = 0X0X11110X11XXX000000XX1000001000X00
mem[28935] = 1035091
mem[28017] = 7410228
mem[17504] = 6484
mem[63869] = 56633
mask = X10X010X0010X00000010011011101001X10
mem[20976] = 391341
mem[13770] = 245061
mask = X10X110X011000000XXX0101111011001001
mem[55892] = 6223387
mem[13408] = 26636189
mem[18959] = 15512439
mem[13486] = 547061
mem[51417] = 1732
mem[47710] = 191002
mask = 0100111XX110X000X00XX011X0X000101100
mem[59547] = 6680490
mem[53421] = 32962554
mem[4053] = 54327681
mask = X100X10101100000000XX1X00000X11010X0
mem[43106] = 972
mem[16979] = 1712450
mem[21809] = 60684
mem[7034] = 32377
mem[62077] = 1144693
mask = 110001X1X11000X0X0X0100010000110XX00
mem[45989] = 43960
mem[26220] = 2635467
mem[16394] = 88577466
mask = 000XX1XX01X0010000000X0010100100XX00
mem[29081] = 10123
mem[24649] = 319
mem[13486] = 1774
mem[46037] = 182
mem[17651] = 48948
mask = 00X111110011110000000X00010X0X000000
mem[12407] = 3445366
mem[26177] = 40338
mem[13408] = 867129107
mask = 01001X01011000X00X00010100101XX1X010
mem[36968] = 115095
mem[5759] = 178851
mem[27773] = 191592
mem[35287] = 2056
mem[26888] = 386883
mem[20525] = 34626
mask = 00X1X1100110X100X00001101000010000X0
mem[27168] = 686235562
mem[25070] = 380483
mem[18945] = 1696
mem[4979] = 15419
mask = 00XX111100X0010000X0X01X1011X0X1000X
mem[15024] = 101402
mem[6571] = 734201087
mask = 010XX101001000000X01001101XX00001110
mem[8062] = 974626
mem[3308] = 45423
mem[12897] = 147472
mem[54774] = 247807
mem[51694] = 1156
mem[8908] = 615
mask = 01X011000111110XX1X0011001X101X01001
mem[1998] = 8383268
mem[9454] = 105136
mem[39479] = 6515
mem[1360] = 239170
mem[62970] = 13188849
mask = X001X1110X100100000000111X0100X100XX
mem[23516] = 899356468
mem[58739] = 449
mem[7316] = 4769
mem[9857] = 373639523
mem[48106] = 1417
mask = 1100110101X00000XX011000010111111X01
mem[8712] = 500891722
mem[16579] = 431756695
mem[34425] = 3712
mem[40112] = 426
mem[36630] = 610
mem[20554] = 933886
mem[48342] = 177911
mask = 00011X11011X010X00000011X10010X10111
mem[6531] = 1493325
mem[35058] = 21547
mem[13400] = 5230289

4
input/day14_example.txt Normal file
View File

@@ -0,0 +1,4 @@
mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X
mem[8] = 11
mem[7] = 101
mem[8] = 0

1
input/day15.txt Normal file
View File

@@ -0,0 +1 @@
17,1,3,16,19,0

1
input/day15_example.txt Normal file
View File

@@ -0,0 +1 @@
0,3,6

View File

@@ -2,27 +2,19 @@ use super::util;
use crate::day11::GridState::Floor;
use crate::day11::GridState::FilledSeat;
use crate::day11::GridState::EmptySeat;
use rayon::prelude::*;
use std::time::Instant;
pub fn solve() {
let lines = util::read_file("input/day11.txt");
let seats = Seats::parse(&lines);
let now = Instant::now();
let seats = Seats::parse(&lines, 1);
let part1 = solve_part1(&seats);
println!("Part 1 took: {} μs", now.elapsed().as_micros());
println!("Day 11 Part 1: {}", part1);
let now2 = Instant::now();
let visible_chairs = seats.calculate_all_visible_chairs();
let part2 = solve_part2(&seats, &visible_chairs);
println!("Part 2 took: {} μs", now2.elapsed().as_micros());
println!("Day 11 Part 2: {}", part2);
}
@@ -31,38 +23,27 @@ fn solve_part1(seats: &Seats) -> usize {
let mut last_seats = seats.clone();
let mut next_seats = seats.clone();
let mut seat_idxs = Vec::new();
for y in 0..seats.height {
for x in 0..seats.width {
let seat = seats.get(&x, &y);
if seat != &Floor {
seat_idxs.push((x, y));
}
}
}
loop {
let changes: Vec<(usize, usize, &GridState)> = seat_idxs.par_iter().map(|pos| {
let x = &pos.0;
let y = &pos.1;
let seat = last_seats.get(x, y);
let occupied = last_seats.count_occupied_neighbors(x, y);
if seat == &EmptySeat && occupied == 0 {
return Option::from((pos.0, pos.1, &FilledSeat));
} else if seat == &FilledSeat && occupied >= 4 {
return Option::from((pos.0, pos.1, &EmptySeat));
} else {
return Option::None;
let mut changes = false;
for y in 1..seats.height-1 {
for x in 1..seats.width-1 {
let seat = last_seats.get(&x, &y);
if seat != &Floor {
let occupied = last_seats.count_occupied_neighbors(&x, &y);
if seat == &EmptySeat && occupied == 0 {
changes = true;
next_seats.set(&x, &y, FilledSeat);
} else if seat == &FilledSeat && occupied >= 4 {
next_seats.set(&x, &y, EmptySeat);
changes = true;
}
}
}
}).filter(|o| o.is_some()).map(|o| o.unwrap()).collect::<Vec<_>>();
if changes.is_empty() {
break;
}
for change in changes {
next_seats.set(&change.0, &change.1, *change.2);
}
// next_seats.print();
if !changes {
break;
}
last_seats = next_seats.clone();
}
@@ -74,11 +55,7 @@ fn solve_part2(seats: &Seats, visible_chairs: &Vec<Option<Vec<(usize, usize)>>>)
let mut last_seats = seats.clone();
let mut next_seats = seats.clone();
let mut calc_times = Vec::new();
let mut copy_times = Vec::new();
loop {
let calc_start = Instant::now();
let mut changes = false;
for y in 0..seats.height {
for x in 0..seats.width {
@@ -89,8 +66,8 @@ fn solve_part2(seats: &Seats, visible_chairs: &Vec<Option<Vec<(usize, usize)>>>)
changes = true;
next_seats.set(&x, &y, FilledSeat);
} else if seat == &FilledSeat && occupied >= 5 {
next_seats.set(&x, &y, EmptySeat);
changes = true;
next_seats.set(&x, &y, EmptySeat);
}
}
}
@@ -99,15 +76,9 @@ fn solve_part2(seats: &Seats, visible_chairs: &Vec<Option<Vec<(usize, usize)>>>)
if !changes {
break;
}
calc_times.push(calc_start.elapsed().as_micros());
let now = Instant::now();
last_seats = next_seats.clone();
copy_times.push(now.elapsed().as_micros());
}
println!("Avg calc time: {} μs", calc_times.iter().sum::<u128>() / (calc_times.len() as u128));
println!("Avg copy time: {} μs", copy_times.iter().sum::<u128>() / (copy_times.len() as u128));
return last_seats.grid.iter().filter(|s| s == &&FilledSeat).count();
}
@@ -123,16 +94,16 @@ impl Seats {
const DIRECTIONS: [(i32, i32); 8] = [(-1, 1), (-1, 0), (-1, -1), (0, -1), (0, 1), (1, 1), (1, 0), (1, -1)];
fn parse(lines: &Vec<String>) -> Seats {
fn parse(lines: &Vec<String>, padding: usize) -> Seats {
let height = lines.len();
let width = lines[0].len();
let height = lines.len() + padding * 2;
let width = lines[0].len() + padding * 2;
let mut grid = vec!(GridState::Floor; width * height);
for y in 0..lines.len() {
let line = &lines[y];
let mut line_chars = line.chars();
for x in 0..lines[0].len() {
grid[x + y * width] = GridState::parse(&line_chars.next().unwrap())
grid[(x + padding) + (y + padding) * width] = GridState::parse(&line_chars.next().unwrap())
}
}
@@ -199,20 +170,15 @@ impl Seats {
fn count_occupied_neighbors(&self, x: &usize, y: &usize) -> u8 {
let x_upper = x == &(self.width - &ONE);
let x_lower = x == &0;
let y_upper = y == &(self.height - &ONE);
let y_lower = y == &0;
return
if !x_lower && !y_lower && self.is_occupied(&(x - &ONE), &(y - &ONE)) { 1 } else { 0 } +
if !x_lower && self.is_occupied(&(x - &ONE), &y) { 1 } else { 0 } +
if !x_lower && !y_upper && self.is_occupied(&(x - &ONE), &(y + ONE)) { 1 } else { 0 } +
if !y_lower && self.is_occupied(&x, &(y - ONE)) { 1 } else { 0 } +
if !y_upper && self.is_occupied(&x, &(y + ONE)) { 1 } else { 0 } +
if !x_upper && !y_lower && self.is_occupied(&(x + ONE), &(y - ONE)) { 1 } else { 0 } +
if !x_upper && self.is_occupied(&(x + ONE), &y) { 1 } else { 0 } +
if !x_upper && !y_upper && self.is_occupied(&(x + ONE), &(y + ONE)) { 1 } else { 0 }
if self.is_occupied(&(x - &ONE), &(y - &ONE)) { 1 } else { 0 } +
if self.is_occupied(&(x - &ONE), &y) { 1 } else { 0 } +
if self.is_occupied(&(x - &ONE), &(y + ONE)) { 1 } else { 0 } +
if self.is_occupied(&x, &(y - ONE)) { 1 } else { 0 } +
if self.is_occupied(&x, &(y + ONE)) { 1 } else { 0 } +
if self.is_occupied(&(x + ONE), &(y - ONE)) { 1 } else { 0 } +
if self.is_occupied(&(x + ONE), &y) { 1 } else { 0 } +
if self.is_occupied(&(x + ONE), &(y + ONE)) { 1 } else { 0 }
}

174
src/day12.rs Normal file
View File

@@ -0,0 +1,174 @@
use super::util;
use crate::day12::Heading::{North, East, South, West};
use std::mem::swap;
pub fn solve()
{
let lines = util::read_file("input/day12.txt");
let instructions = lines.iter().map(|s| Instruction::parse(s)).collect::<Vec<_>>();
let ship_state = execute(&instructions);
let part1 = ship_state.manhattan_distance();
println!("Day 12 Part 1: {}", part1);
let ship_state2 = execute_with_waypoint(&instructions);
let part2 = ship_state2.manhattan_distance();
println!("Day 12 Part 2: {}", part2);
}
fn execute(instructions: &Vec<Instruction>) -> ShipState {
let mut res = ShipState { position_n: 0, position_e: 0, heading: East };
for instruction in instructions {
res.apply(&instruction);
}
return res;
}
fn execute_with_waypoint(instructions: &Vec<Instruction>) -> ShipState {
let mut ship = ShipState { position_n: 0, position_e: 0, heading: East };
let mut waypoint = WaypointState { position_n: 1, position_e: 10 };
for instruction in instructions {
// println!("Instruction: {}{}", instruction.action, instruction.amount);
if instruction.action == 'F' {
ship.position_n += waypoint.position_n * instruction.amount as i32;
ship.position_e += waypoint.position_e * instruction.amount as i32;
} else {
waypoint.apply(instruction);
}
// println!("Ship: {:?}, Waypoint: {:?}", ship, waypoint);
}
return ship;
}
#[derive(Debug)]
struct ShipState {
position_n: i32,
position_e: i32,
heading: Heading,
}
impl ShipState {
fn manhattan_distance(&self) -> i32 {
return self.position_n.abs() + self.position_e.abs();
}
fn apply(&mut self, instruction: &Instruction) {
match instruction.action {
'N'=> self.position_n += instruction.amount as i32,
'S' => self.position_n -= instruction.amount as i32,
'E' => self.position_e += instruction.amount as i32,
'W' => self.position_e -= instruction.amount as i32,
'L' => self.turn_left(instruction.amount),
'R' => self.turn_left(360 - (instruction.amount % 360)),
'F' => self.move_forward(instruction.amount),
_ => panic!("Unknown instruction: {}", instruction.action)
}
}
fn move_forward(&mut self, amount: u32) {
match self.heading {
North => self.position_n += amount as i32,
East => self.position_e += amount as i32,
South => self.position_n -= amount as i32,
West => self.position_e -= amount as i32,
}
}
fn turn_left(&mut self, amount: u32) {
assert_eq!(amount % 90, 0, "Only rotations of (multiples of) 90 degrees are supported");
let count = amount / 90;
for _ in 0..count {
self.heading = self.heading.turn_left();
}
}
}
#[derive(Debug)]
struct WaypointState {
position_n: i32,
position_e: i32,
}
impl WaypointState {
fn apply(&mut self, instruction: &Instruction) {
match instruction.action {
'N'=> self.position_n += instruction.amount as i32,
'S' => self.position_n -= instruction.amount as i32,
'E' => self.position_e += instruction.amount as i32,
'W' => self.position_e -= instruction.amount as i32,
'L' => self.rotate_left_around_origin(instruction.amount),
'R' => self.rotate_left_around_origin(360 - instruction.amount),
_ => panic!("Unknown instruction: {}", instruction.action)
}
}
fn rotate_left_around_origin(&mut self , amount: u32) {
assert_eq!(amount % 90, 0, "Only rotations of (multiples of) 90 degrees are supported");
if amount % 360 == 0 { return; }
match amount % 360 {
90 => {
swap(&mut self.position_n, &mut self.position_e);
self.position_e *= -1;
}
180 => {
self.position_n *= -1;
self.position_e *= -1;
}
270 => {
swap(&mut self.position_n, &mut self.position_e);
self.position_n *= -1;
}
_ => panic!("Unsupported amount of degrees")
}
}
}
#[derive(Debug)]
struct Instruction {
action: char,
amount: u32,
}
#[derive(Debug)]
enum Heading {
North, East, South, West
}
impl Heading {
fn turn_left(&self) -> Heading {
return match self {
North => West,
West => South,
South => East,
East => North
};
}
}
impl Instruction {
fn parse(line: &String) -> Instruction {
return Instruction {
action: line.chars().next().unwrap(),
amount: line[1..].parse::<u32>().unwrap(),
}
}
}

73
src/day13.rs Normal file
View File

@@ -0,0 +1,73 @@
use super::util;
pub fn solve() {
let lines = util::read_file("input/day13.txt");
let target_time = lines[0].parse::<u32>().unwrap();
let part1 = lines[1].split(",").filter(|s| s != &"x")
.map(|s| s.parse::<u32>().unwrap())
.map(|t| (t, t - (target_time % t)))
.min_by_key(|t| t.1)
.map(|bt| bt.0 * bt.1)
.unwrap();
println!("Day 13 Part 1: {}", part1);
let schedule_parts = lines[1].split(",").collect::<Vec<_>>();
let mut schedules = Vec::new();
// print!("[");
for i in 0..schedule_parts.len() {
let s = schedule_parts[i];
if s == "x" { continue; }
let bus_id = s.parse::<u64>().unwrap();
let mut offset = i as u64;
if offset > bus_id { offset = offset % bus_id; }
// print!("(x + {}) mod {} = 0, ", offset, bus_id );
schedules.push(Schedule {
bus_id, offset
});
}
// println!("]");
schedules.sort_by_key(|s| u64::max_value() - s.bus_id);
let part2 = find_fitting(&schedules);
println!("Day 13 Part 2: {}", part2);
}
fn find_fitting(schedules: &Vec<Schedule>) -> u64 {
let mut root_schedule = find_fitting_match(&schedules[0], &schedules[1]);
for schedule in schedules.iter().skip(2) {
root_schedule = find_fitting_match(schedule, &root_schedule)
}
return root_schedule.bus_id - root_schedule.offset;
}
fn find_fitting_match(s1: &Schedule, s2: &Schedule) -> Schedule {
// We know that the pattern repeats every s1.bus_id * s2.bus_id (and at no other times, since all bus_ids are at least co-prime).
// So all we need to do is find out what offset works:
let match_bus_id = s1.bus_id * s2.bus_id;
for mult in 0..s1.bus_id {
let offset = mult * s2.bus_id + s2.offset;
assert!(offset < match_bus_id, "Offset must not be bigger than the bus_id");
let solution = match_bus_id - offset;
if (solution + s1.offset) % s1.bus_id == 0 {
return Schedule {
bus_id: match_bus_id,
offset,
}
}
}
panic!("Couldn't find match!!!");
}
#[derive(Debug)]
struct Schedule {
bus_id: u64,
offset: u64,
}

161
src/day14.rs Normal file
View File

@@ -0,0 +1,161 @@
use super::util;
use std::collections::HashMap;
pub fn solve() {
let lines = util::read_file("input/day14.txt");
let part1 = solve_part1(&lines);
println!("Day X Part 1: {}", part1);
let part2 = solve_part2(&lines);
println!("Day X Part 2: {}", part2);
}
fn solve_part1(lines: &Vec<String>) -> u64 {
let mut mem = vec!{0u64; 1 << 16};
let mut mask = BitMask { ones_mask: 0, zeros_mask: !0 };
for line in lines {
if line.starts_with("mask = ") {
mask = BitMask::parse(&String::from(&line[("mask = ".len())..]))
} else {
let instr = Instruction::parse(line);
mem[instr.pos] = mask.apply(instr.n);
}
}
return mem.iter().sum();
}
fn solve_part2(lines: &Vec<String>) -> u64 {
/*
Idea for performance optimalization: use a Vec containing the "root" memory position, and
the mask of the floats used to write to that position.
Whenever something is written, check (using bit operations) if a collision between existing
memory positions is possible. If that is the case, modify the old (existing) entry by
removing all overlapping entries in the float mask.
*/
let mut mem: HashMap<u64, u64> = HashMap::new();
let mut mask = MemoryBitMask { ones_mask: 0, float_masks: Vec::new() };
for line in lines {
if line.starts_with("mask = ") {
mask = MemoryBitMask::parse(&String::from(&line[("mask = ".len())..]))
} else {
let instr = Instruction::parse(line);
mask.set_all(instr.pos as u64, instr.n, &mut mem);
}
}
return mem.values().sum();
}
struct BitMask {
/// One (1) everywhere except where the mask should be zero (0)
zeros_mask: u64,
/// Zero everywhere except where the mask is 1
ones_mask: u64,
}
impl BitMask {
fn parse(input: &String) -> BitMask {
let mut zeros = u64::max_value();
let mut ones = 0u64;
let mut i = 0usize;
for c in input.chars().rev() {
if c == '0' {
zeros &= !(1 << i);
} else if c == '1' {
ones |= 1 << i;
}
i += 1;
}
return BitMask {
zeros_mask: zeros,
ones_mask: ones,
}
}
fn apply(&self, x: u64) -> u64 {
return (x & self.zeros_mask) | self.ones_mask;
}
}
struct MemoryBitMask {
ones_mask: u64,
///Positions of the floating numbers
float_masks: Vec<u64>,
}
impl MemoryBitMask {
fn parse(input: &String) -> MemoryBitMask {
let mut ones = 0u64;
let mut float_masks: Vec<u64> = Vec::new();
let mut i = 0usize;
for c in input.chars().rev() {
if c == 'X' {
float_masks.push(1 << i);
} else if c == '1' {
ones |= 1 << i;
}
i += 1;
}
return MemoryBitMask {
float_masks,
ones_mask: ones,
}
}
fn set_all(&self, pos: u64, n: u64, mem: &mut HashMap<u64, u64>) {
let base_pos = pos | self.ones_mask;
for float_opt in 0..(1 << self.float_masks.len()) {
let mut real_pos = base_pos;
for i in 0..self.float_masks.len() {
let float_mask = self.float_masks[i];
// Clear the bit in the original pos
real_pos &= !float_mask;
let bit_mask = 1 << i;
if float_opt & bit_mask != 0 {
real_pos |= float_mask;
}
}
mem.insert(real_pos, n);
}
}
}
struct Instruction {
pos: usize,
n: u64,
}
impl Instruction {
fn parse(input: &String) -> Instruction {
let pos_start = input.find("[").unwrap() + 1;
let pos_end = input.find("]").unwrap();
let pos = input[pos_start..pos_end].parse::<usize>().unwrap();
let n_start = input.find(" = ").unwrap() + 3;
let n = input[n_start..].parse::<u64>().unwrap();
return Instruction { pos, n };
}
}

41
src/day15.rs Normal file
View File

@@ -0,0 +1,41 @@
use super::util;
pub fn solve() {
let lines = util::read_file("input/day15.txt");
let starting_numbers = lines[0].split(",").map(|s| s.parse::<usize>().unwrap()).collect::<Vec<_>>();
let part1 = play_until(2020, &starting_numbers);
println!("Day X Part 1: {}", part1);
let part2 = play_until(30_000_000, &starting_numbers);
println!("Day X Part 2: {}", part2);
}
fn play_until(max_turn: usize, starting_numbers: &Vec<usize>) -> usize {
// Because numbers can never be bigger than the number of turns, this works:
let mut last_occurrence = vec!{0usize; max_turn};
// Note: we ignore the last number here; it will be the "previous_number" later.
for i in 0..(starting_numbers.len() - 1) {
let n = starting_numbers[i];
last_occurrence[n] = i + 1;
}
let mut previous_number = starting_numbers[starting_numbers.len() - 1];
for turn in starting_numbers.len()..max_turn {
let prev_occurrence = last_occurrence[previous_number];
last_occurrence[previous_number] = turn;
if prev_occurrence == 0 {
previous_number = 0;
} else {
previous_number = turn - prev_occurrence;
}
println!("Turn {}: {}", turn + 1, previous_number);
}
return previous_number;
}

View File

@@ -2,4 +2,12 @@ use super::util;
pub fn solve() {
let lines = util::read_file("input/dayX.txt");
let part1 = 0;
println!("Day X Part 1: {}", part1);
let part2 = 0;
println!("Day X Part 2: {}", part2);
}

View File

@@ -13,8 +13,12 @@ mod day8;
mod day9;
mod day10;
mod day11;
mod day12;
mod day13;
mod day14;
mod day15;
const MAX_DAY: u8 = 11;
const MAX_DAY: u8 = 15;
const BENCHMARK_AMOUNT: u32 = 100;
fn solve(day: u8) {
@@ -30,13 +34,16 @@ fn solve(day: u8) {
9 => day9::solve(),
10 => day10::solve(),
11 => day11::solve(),
12 => day12::solve(),
13 => day13::solve(),
14 => day14::solve(),
15 => day15::solve(),
_ => println!("This day is not yet implemented")
}
}
fn main() {
let args: Vec<String> = std::env::args().collect();
let day_arg_idx = args.iter().position(|a| a == "-d");
@@ -49,8 +56,11 @@ fn main() {
// This is essentially the warmup for the benchmark:
run_once(single_day, day, &mut bench_results);
let first_run_time = bench_results[0];
if benchmark {
// Ignore the warmup run in the rest of the benchmark:
bench_results.clear();
for _ in 0..BENCHMARK_AMOUNT {
run_once(single_day, day, &mut bench_results);
}
@@ -59,6 +69,19 @@ fn main() {
let avg_runtime: u128 = bench_results.iter().sum::<u128>() / (bench_results.len() as u128);
println!("Execution took {} μs {}", avg_runtime, if benchmark { "on average" } else { "" });
if benchmark {
bench_results.sort();
println!("Min: {} μs, Max: {} μs, Median: {} μs",
bench_results[0],
bench_results[bench_results.len() - 1],
bench_results[bench_results.len() / 2]
);
println!("First time took {} μs", first_run_time);
// for res in bench_results {
// println!("{}", res);
// }
}
}
fn run_once(single_day: bool, day: u8, bench_results: &mut Vec<u128>) {