Start catching up after vacation.
This commit is contained in:
67
Cargo.lock
generated
67
Cargo.lock
generated
@@ -7,15 +7,53 @@ name = "advent2021"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itertools",
|
"itertools",
|
||||||
|
"pathfinding",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "autocfg"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "either"
|
name = "either"
|
||||||
version = "1.6.1"
|
version = "1.6.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fixedbitset"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "398ea4fabe40b9b0d885340a2a991a44c8a645624075ad966d21f88688e2b69e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.11.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indexmap"
|
||||||
|
version = "1.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"hashbrown",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "integer-sqrt"
|
||||||
|
version = "0.1.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.10.3"
|
version = "0.10.3"
|
||||||
@@ -25,6 +63,29 @@ dependencies = [
|
|||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-traits"
|
||||||
|
version = "0.2.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pathfinding"
|
||||||
|
version = "3.0.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8a64bfa665d8821a903701c7bb440e7f72b1f05387b390cc23f498cc23148099"
|
||||||
|
dependencies = [
|
||||||
|
"fixedbitset",
|
||||||
|
"indexmap",
|
||||||
|
"integer-sqrt",
|
||||||
|
"itertools",
|
||||||
|
"num-traits",
|
||||||
|
"rustc-hash",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.32"
|
version = "1.0.32"
|
||||||
@@ -43,6 +104,12 @@ dependencies = [
|
|||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc-hash"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.82"
|
version = "1.0.82"
|
||||||
|
|||||||
@@ -5,4 +5,5 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
itertools = "0.10.3"
|
itertools = "0.10.3"
|
||||||
|
pathfinding = "3.0.5"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|||||||
25
data/day12a.txt
Normal file
25
data/day12a.txt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
bm-XY
|
||||||
|
ol-JS
|
||||||
|
bm-im
|
||||||
|
RD-ol
|
||||||
|
bm-QI
|
||||||
|
JS-ja
|
||||||
|
im-gq
|
||||||
|
end-im
|
||||||
|
ja-ol
|
||||||
|
JS-gq
|
||||||
|
bm-AF
|
||||||
|
RD-start
|
||||||
|
RD-ja
|
||||||
|
start-ol
|
||||||
|
cj-bm
|
||||||
|
start-JS
|
||||||
|
AF-ol
|
||||||
|
end-QI
|
||||||
|
QI-gq
|
||||||
|
ja-gq
|
||||||
|
end-AF
|
||||||
|
im-QI
|
||||||
|
bm-gq
|
||||||
|
ja-QI
|
||||||
|
gq-RD
|
||||||
7
data/day12t1.txt
Normal file
7
data/day12t1.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
start-A
|
||||||
|
start-b
|
||||||
|
A-c
|
||||||
|
A-b
|
||||||
|
b-d
|
||||||
|
A-end
|
||||||
|
b-end
|
||||||
10
data/day12t2.txt
Normal file
10
data/day12t2.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
dc-end
|
||||||
|
HN-start
|
||||||
|
start-kj
|
||||||
|
dc-start
|
||||||
|
dc-HN
|
||||||
|
LN-dc
|
||||||
|
HN-end
|
||||||
|
kj-sa
|
||||||
|
kj-HN
|
||||||
|
kj-dc
|
||||||
812
data/day13a.txt
Normal file
812
data/day13a.txt
Normal file
@@ -0,0 +1,812 @@
|
|||||||
|
470,705
|
||||||
|
331,196
|
||||||
|
1241,728
|
||||||
|
1034,161
|
||||||
|
181,850
|
||||||
|
999,484
|
||||||
|
480,680
|
||||||
|
798,33
|
||||||
|
226,86
|
||||||
|
475,226
|
||||||
|
113,287
|
||||||
|
770,702
|
||||||
|
47,35
|
||||||
|
848,312
|
||||||
|
1129,402
|
||||||
|
179,326
|
||||||
|
766,404
|
||||||
|
1258,717
|
||||||
|
470,494
|
||||||
|
723,434
|
||||||
|
418,291
|
||||||
|
100,298
|
||||||
|
994,316
|
||||||
|
423,434
|
||||||
|
985,292
|
||||||
|
721,261
|
||||||
|
528,572
|
||||||
|
595,567
|
||||||
|
909,665
|
||||||
|
411,292
|
||||||
|
1056,291
|
||||||
|
1051,434
|
||||||
|
311,484
|
||||||
|
462,312
|
||||||
|
187,273
|
||||||
|
715,567
|
||||||
|
114,819
|
||||||
|
634,861
|
||||||
|
79,318
|
||||||
|
912,344
|
||||||
|
1144,845
|
||||||
|
152,745
|
||||||
|
201,464
|
||||||
|
840,185
|
||||||
|
291,100
|
||||||
|
1084,31
|
||||||
|
1255,434
|
||||||
|
909,229
|
||||||
|
895,827
|
||||||
|
557,29
|
||||||
|
441,159
|
||||||
|
661,193
|
||||||
|
826,215
|
||||||
|
535,70
|
||||||
|
974,767
|
||||||
|
254,739
|
||||||
|
512,189
|
||||||
|
868,75
|
||||||
|
1076,9
|
||||||
|
700,86
|
||||||
|
684,515
|
||||||
|
356,422
|
||||||
|
348,344
|
||||||
|
605,341
|
||||||
|
360,586
|
||||||
|
383,824
|
||||||
|
239,393
|
||||||
|
751,12
|
||||||
|
253,229
|
||||||
|
403,759
|
||||||
|
166,273
|
||||||
|
1196,819
|
||||||
|
406,301
|
||||||
|
343,102
|
||||||
|
1119,618
|
||||||
|
333,892
|
||||||
|
711,789
|
||||||
|
283,70
|
||||||
|
418,603
|
||||||
|
380,714
|
||||||
|
756,255
|
||||||
|
20,375
|
||||||
|
1145,794
|
||||||
|
642,180
|
||||||
|
1140,273
|
||||||
|
984,451
|
||||||
|
763,619
|
||||||
|
196,427
|
||||||
|
869,159
|
||||||
|
460,96
|
||||||
|
35,548
|
||||||
|
512,709
|
||||||
|
1231,318
|
||||||
|
1163,21
|
||||||
|
465,275
|
||||||
|
32,187
|
||||||
|
212,296
|
||||||
|
718,835
|
||||||
|
1036,42
|
||||||
|
1002,672
|
||||||
|
108,492
|
||||||
|
321,892
|
||||||
|
294,0
|
||||||
|
252,350
|
||||||
|
377,733
|
||||||
|
1196,822
|
||||||
|
316,344
|
||||||
|
254,519
|
||||||
|
1168,49
|
||||||
|
1158,745
|
||||||
|
142,49
|
||||||
|
130,504
|
||||||
|
397,56
|
||||||
|
718,186
|
||||||
|
463,170
|
||||||
|
482,463
|
||||||
|
1032,752
|
||||||
|
649,193
|
||||||
|
512,158
|
||||||
|
895,501
|
||||||
|
1150,122
|
||||||
|
537,833
|
||||||
|
915,434
|
||||||
|
790,262
|
||||||
|
1058,539
|
||||||
|
764,44
|
||||||
|
512,861
|
||||||
|
493,296
|
||||||
|
472,422
|
||||||
|
44,86
|
||||||
|
1101,592
|
||||||
|
671,276
|
||||||
|
977,2
|
||||||
|
822,621
|
||||||
|
179,668
|
||||||
|
415,46
|
||||||
|
1067,154
|
||||||
|
895,169
|
||||||
|
475,728
|
||||||
|
231,434
|
||||||
|
156,103
|
||||||
|
1176,72
|
||||||
|
113,607
|
||||||
|
301,851
|
||||||
|
927,824
|
||||||
|
346,870
|
||||||
|
892,603
|
||||||
|
610,86
|
||||||
|
1114,19
|
||||||
|
295,353
|
||||||
|
402,350
|
||||||
|
1118,145
|
||||||
|
201,318
|
||||||
|
681,732
|
||||||
|
338,792
|
||||||
|
855,733
|
||||||
|
202,364
|
||||||
|
125,430
|
||||||
|
1140,285
|
||||||
|
917,309
|
||||||
|
1309,542
|
||||||
|
10,540
|
||||||
|
246,499
|
||||||
|
1038,178
|
||||||
|
209,609
|
||||||
|
242,16
|
||||||
|
10,214
|
||||||
|
20,519
|
||||||
|
276,173
|
||||||
|
540,520
|
||||||
|
192,582
|
||||||
|
681,891
|
||||||
|
830,680
|
||||||
|
600,44
|
||||||
|
895,848
|
||||||
|
1009,219
|
||||||
|
425,442
|
||||||
|
1049,185
|
||||||
|
994,166
|
||||||
|
1034,733
|
||||||
|
453,240
|
||||||
|
605,833
|
||||||
|
154,71
|
||||||
|
141,607
|
||||||
|
840,494
|
||||||
|
131,87
|
||||||
|
1084,86
|
||||||
|
1193,592
|
||||||
|
1163,166
|
||||||
|
847,724
|
||||||
|
329,318
|
||||||
|
567,46
|
||||||
|
850,798
|
||||||
|
554,255
|
||||||
|
817,598
|
||||||
|
723,658
|
||||||
|
1027,70
|
||||||
|
1154,103
|
||||||
|
822,273
|
||||||
|
704,290
|
||||||
|
985,72
|
||||||
|
386,593
|
||||||
|
1015,353
|
||||||
|
907,435
|
||||||
|
867,847
|
||||||
|
711,835
|
||||||
|
415,718
|
||||||
|
903,343
|
||||||
|
252,539
|
||||||
|
574,310
|
||||||
|
295,801
|
||||||
|
156,733
|
||||||
|
1173,395
|
||||||
|
736,218
|
||||||
|
700,360
|
||||||
|
865,144
|
||||||
|
1044,240
|
||||||
|
708,628
|
||||||
|
354,262
|
||||||
|
1298,42
|
||||||
|
987,250
|
||||||
|
857,430
|
||||||
|
184,185
|
||||||
|
1066,14
|
||||||
|
130,894
|
||||||
|
917,585
|
||||||
|
882,596
|
||||||
|
156,791
|
||||||
|
868,296
|
||||||
|
1248,29
|
||||||
|
1300,354
|
||||||
|
1180,504
|
||||||
|
542,385
|
||||||
|
710,850
|
||||||
|
172,407
|
||||||
|
1064,310
|
||||||
|
962,166
|
||||||
|
458,504
|
||||||
|
992,295
|
||||||
|
517,667
|
||||||
|
95,12
|
||||||
|
484,299
|
||||||
|
523,390
|
||||||
|
865,733
|
||||||
|
326,82
|
||||||
|
1300,91
|
||||||
|
69,728
|
||||||
|
470,548
|
||||||
|
1015,541
|
||||||
|
141,735
|
||||||
|
278,756
|
||||||
|
1237,140
|
||||||
|
642,714
|
||||||
|
728,71
|
||||||
|
1064,666
|
||||||
|
1128,477
|
||||||
|
301,403
|
||||||
|
677,159
|
||||||
|
340,266
|
||||||
|
984,812
|
||||||
|
972,792
|
||||||
|
212,374
|
||||||
|
828,463
|
||||||
|
987,810
|
||||||
|
1109,318
|
||||||
|
212,178
|
||||||
|
1275,548
|
||||||
|
1016,894
|
||||||
|
962,128
|
||||||
|
840,548
|
||||||
|
10,149
|
||||||
|
933,833
|
||||||
|
80,411
|
||||||
|
1136,883
|
||||||
|
676,766
|
||||||
|
421,632
|
||||||
|
242,786
|
||||||
|
131,721
|
||||||
|
274,189
|
||||||
|
407,576
|
||||||
|
80,35
|
||||||
|
393,361
|
||||||
|
425,421
|
||||||
|
184,397
|
||||||
|
1101,196
|
||||||
|
1154,411
|
||||||
|
529,878
|
||||||
|
711,518
|
||||||
|
1223,270
|
||||||
|
579,459
|
||||||
|
343,838
|
||||||
|
428,415
|
||||||
|
933,733
|
||||||
|
930,628
|
||||||
|
55,294
|
||||||
|
1226,336
|
||||||
|
378,721
|
||||||
|
435,553
|
||||||
|
546,492
|
||||||
|
1019,100
|
||||||
|
763,684
|
||||||
|
1076,885
|
||||||
|
1150,772
|
||||||
|
276,876
|
||||||
|
574,51
|
||||||
|
25,610
|
||||||
|
117,644
|
||||||
|
410,563
|
||||||
|
311,838
|
||||||
|
192,817
|
||||||
|
626,696
|
||||||
|
1309,352
|
||||||
|
604,18
|
||||||
|
1036,705
|
||||||
|
782,124
|
||||||
|
338,464
|
||||||
|
502,774
|
||||||
|
1243,882
|
||||||
|
950,756
|
||||||
|
1232,593
|
||||||
|
25,284
|
||||||
|
853,173
|
||||||
|
1295,614
|
||||||
|
1144,534
|
||||||
|
44,534
|
||||||
|
1118,312
|
||||||
|
954,515
|
||||||
|
410,747
|
||||||
|
806,348
|
||||||
|
1193,644
|
||||||
|
1248,59
|
||||||
|
700,836
|
||||||
|
247,318
|
||||||
|
1121,739
|
||||||
|
681,715
|
||||||
|
1185,430
|
||||||
|
759,103
|
||||||
|
459,504
|
||||||
|
981,292
|
||||||
|
1131,668
|
||||||
|
798,64
|
||||||
|
728,39
|
||||||
|
251,435
|
||||||
|
688,187
|
||||||
|
326,451
|
||||||
|
828,351
|
||||||
|
654,869
|
||||||
|
723,712
|
||||||
|
1300,680
|
||||||
|
442,598
|
||||||
|
1310,645
|
||||||
|
688,222
|
||||||
|
994,344
|
||||||
|
277,833
|
||||||
|
309,318
|
||||||
|
26,184
|
||||||
|
711,387
|
||||||
|
418,515
|
||||||
|
1109,436
|
||||||
|
274,705
|
||||||
|
1131,813
|
||||||
|
618,614
|
||||||
|
229,298
|
||||||
|
388,128
|
||||||
|
411,366
|
||||||
|
125,464
|
||||||
|
3,362
|
||||||
|
131,173
|
||||||
|
1216,772
|
||||||
|
830,540
|
||||||
|
572,115
|
||||||
|
922,576
|
||||||
|
830,214
|
||||||
|
520,184
|
||||||
|
895,718
|
||||||
|
808,203
|
||||||
|
443,847
|
||||||
|
729,453
|
||||||
|
781,240
|
||||||
|
1078,794
|
||||||
|
1282,144
|
||||||
|
196,390
|
||||||
|
502,203
|
||||||
|
992,711
|
||||||
|
557,588
|
||||||
|
934,828
|
||||||
|
1010,632
|
||||||
|
212,520
|
||||||
|
174,11
|
||||||
|
976,630
|
||||||
|
1066,147
|
||||||
|
913,822
|
||||||
|
731,459
|
||||||
|
213,93
|
||||||
|
244,270
|
||||||
|
306,791
|
||||||
|
254,155
|
||||||
|
103,103
|
||||||
|
671,52
|
||||||
|
1128,271
|
||||||
|
1010,262
|
||||||
|
62,708
|
||||||
|
412,556
|
||||||
|
5,193
|
||||||
|
294,446
|
||||||
|
828,95
|
||||||
|
201,458
|
||||||
|
838,271
|
||||||
|
47,859
|
||||||
|
314,628
|
||||||
|
425,473
|
||||||
|
571,654
|
||||||
|
994,540
|
||||||
|
567,841
|
||||||
|
236,575
|
||||||
|
141,287
|
||||||
|
197,621
|
||||||
|
480,206
|
||||||
|
868,534
|
||||||
|
435,822
|
||||||
|
62,59
|
||||||
|
363,346
|
||||||
|
1056,739
|
||||||
|
201,10
|
||||||
|
994,680
|
||||||
|
907,135
|
||||||
|
974,743
|
||||||
|
1168,64
|
||||||
|
380,180
|
||||||
|
247,103
|
||||||
|
1225,747
|
||||||
|
841,287
|
||||||
|
79,352
|
||||||
|
295,161
|
||||||
|
393,306
|
||||||
|
864,646
|
||||||
|
1158,149
|
||||||
|
348,128
|
||||||
|
348,469
|
||||||
|
189,739
|
||||||
|
199,285
|
||||||
|
318,711
|
||||||
|
888,794
|
||||||
|
1109,458
|
||||||
|
1068,108
|
||||||
|
463,724
|
||||||
|
397,822
|
||||||
|
1255,294
|
||||||
|
917,185
|
||||||
|
272,716
|
||||||
|
706,466
|
||||||
|
979,644
|
||||||
|
887,460
|
||||||
|
1053,838
|
||||||
|
1131,226
|
||||||
|
1173,787
|
||||||
|
979,196
|
||||||
|
557,865
|
||||||
|
441,735
|
||||||
|
1290,519
|
||||||
|
1044,576
|
||||||
|
1222,854
|
||||||
|
989,165
|
||||||
|
107,723
|
||||||
|
1238,155
|
||||||
|
67,460
|
||||||
|
1238,71
|
||||||
|
1213,726
|
||||||
|
443,47
|
||||||
|
316,166
|
||||||
|
711,105
|
||||||
|
498,273
|
||||||
|
70,102
|
||||||
|
65,585
|
||||||
|
475,442
|
||||||
|
599,789
|
||||||
|
32,873
|
||||||
|
1012,379
|
||||||
|
623,609
|
||||||
|
10,91
|
||||||
|
569,147
|
||||||
|
1067,814
|
||||||
|
580,798
|
||||||
|
321,2
|
||||||
|
209,196
|
||||||
|
967,410
|
||||||
|
1230,411
|
||||||
|
1282,870
|
||||||
|
731,87
|
||||||
|
736,859
|
||||||
|
294,894
|
||||||
|
546,402
|
||||||
|
334,630
|
||||||
|
559,12
|
||||||
|
651,196
|
||||||
|
65,261
|
||||||
|
1149,598
|
||||||
|
473,492
|
||||||
|
393,452
|
||||||
|
629,491
|
||||||
|
480,763
|
||||||
|
1202,44
|
||||||
|
1261,61
|
||||||
|
1056,519
|
||||||
|
992,127
|
||||||
|
972,430
|
||||||
|
740,562
|
||||||
|
344,290
|
||||||
|
882,479
|
||||||
|
45,644
|
||||||
|
1193,302
|
||||||
|
1113,273
|
||||||
|
58,525
|
||||||
|
718,865
|
||||||
|
400,515
|
||||||
|
1084,479
|
||||||
|
1074,603
|
||||||
|
835,450
|
||||||
|
316,728
|
||||||
|
480,373
|
||||||
|
1154,733
|
||||||
|
892,575
|
||||||
|
1097,129
|
||||||
|
353,59
|
||||||
|
1136,688
|
||||||
|
1128,422
|
||||||
|
547,619
|
||||||
|
587,182
|
||||||
|
962,344
|
||||||
|
622,707
|
||||||
|
626,198
|
||||||
|
1154,483
|
||||||
|
75,135
|
||||||
|
277,161
|
||||||
|
894,406
|
||||||
|
278,534
|
||||||
|
951,609
|
||||||
|
711,152
|
||||||
|
70,550
|
||||||
|
738,432
|
||||||
|
907,759
|
||||||
|
882,534
|
||||||
|
923,327
|
||||||
|
933,229
|
||||||
|
383,294
|
||||||
|
25,3
|
||||||
|
1009,851
|
||||||
|
507,614
|
||||||
|
174,883
|
||||||
|
295,129
|
||||||
|
276,428
|
||||||
|
446,86
|
||||||
|
318,767
|
||||||
|
703,859
|
||||||
|
1094,710
|
||||||
|
480,688
|
||||||
|
1184,124
|
||||||
|
336,127
|
||||||
|
923,567
|
||||||
|
790,184
|
||||||
|
1285,284
|
||||||
|
152,579
|
||||||
|
599,742
|
||||||
|
1197,287
|
||||||
|
639,500
|
||||||
|
467,273
|
||||||
|
785,495
|
||||||
|
300,262
|
||||||
|
855,285
|
||||||
|
277,285
|
||||||
|
267,567
|
||||||
|
403,459
|
||||||
|
1179,56
|
||||||
|
1029,801
|
||||||
|
551,103
|
||||||
|
1289,159
|
||||||
|
415,515
|
||||||
|
97,596
|
||||||
|
1109,884
|
||||||
|
885,227
|
||||||
|
166,534
|
||||||
|
213,129
|
||||||
|
927,70
|
||||||
|
472,623
|
||||||
|
1113,49
|
||||||
|
480,354
|
||||||
|
166,397
|
||||||
|
1034,721
|
||||||
|
629,610
|
||||||
|
376,590
|
||||||
|
442,411
|
||||||
|
676,861
|
||||||
|
1230,859
|
||||||
|
1068,878
|
||||||
|
278,590
|
||||||
|
49,161
|
||||||
|
899,528
|
||||||
|
759,791
|
||||||
|
1071,169
|
||||||
|
1230,758
|
||||||
|
1032,380
|
||||||
|
271,387
|
||||||
|
974,711
|
||||||
|
0,197
|
||||||
|
70,400
|
||||||
|
806,856
|
||||||
|
987,698
|
||||||
|
1038,380
|
||||||
|
395,460
|
||||||
|
793,107
|
||||||
|
376,828
|
||||||
|
405,152
|
||||||
|
78,301
|
||||||
|
256,550
|
||||||
|
1113,497
|
||||||
|
892,274
|
||||||
|
853,721
|
||||||
|
783,865
|
||||||
|
397,166
|
||||||
|
579,87
|
||||||
|
243,154
|
||||||
|
454,280
|
||||||
|
999,500
|
||||||
|
898,502
|
||||||
|
55,600
|
||||||
|
621,161
|
||||||
|
786,894
|
||||||
|
1144,808
|
||||||
|
192,134
|
||||||
|
1126,285
|
||||||
|
196,245
|
||||||
|
1290,833
|
||||||
|
1223,501
|
||||||
|
847,276
|
||||||
|
835,452
|
||||||
|
1228,523
|
||||||
|
653,542
|
||||||
|
413,250
|
||||||
|
1200,490
|
||||||
|
278,304
|
||||||
|
813,365
|
||||||
|
582,855
|
||||||
|
633,735
|
||||||
|
520,710
|
||||||
|
398,344
|
||||||
|
1145,122
|
||||||
|
740,332
|
||||||
|
1131,529
|
||||||
|
544,180
|
||||||
|
1039,61
|
||||||
|
363,548
|
||||||
|
981,740
|
||||||
|
830,521
|
||||||
|
674,865
|
||||||
|
736,676
|
||||||
|
300,632
|
||||||
|
671,170
|
||||||
|
572,299
|
||||||
|
185,607
|
||||||
|
907,459
|
||||||
|
1196,72
|
||||||
|
687,285
|
||||||
|
196,19
|
||||||
|
55,434
|
||||||
|
999,813
|
||||||
|
288,754
|
||||||
|
446,646
|
||||||
|
981,154
|
||||||
|
587,460
|
||||||
|
323,810
|
||||||
|
1126,497
|
||||||
|
110,714
|
||||||
|
512,326
|
||||||
|
830,354
|
||||||
|
1232,301
|
||||||
|
266,240
|
||||||
|
172,487
|
||||||
|
1208,152
|
||||||
|
618,280
|
||||||
|
766,714
|
||||||
|
721,633
|
||||||
|
316,680
|
||||||
|
987,523
|
||||||
|
147,614
|
||||||
|
672,380
|
||||||
|
467,173
|
||||||
|
253,665
|
||||||
|
840,189
|
||||||
|
673,878
|
||||||
|
944,754
|
||||||
|
278,75
|
||||||
|
1163,813
|
||||||
|
927,294
|
||||||
|
1310,197
|
||||||
|
1183,865
|
||||||
|
47,488
|
||||||
|
152,315
|
||||||
|
472,477
|
||||||
|
770,371
|
||||||
|
388,766
|
||||||
|
108,44
|
||||||
|
863,294
|
||||||
|
629,715
|
||||||
|
1043,775
|
||||||
|
924,593
|
||||||
|
1179,838
|
||||||
|
703,655
|
||||||
|
1213,596
|
||||||
|
985,766
|
||||||
|
830,11
|
||||||
|
1031,721
|
||||||
|
623,285
|
||||||
|
130,448
|
||||||
|
380,628
|
||||||
|
72,739
|
||||||
|
84,749
|
||||||
|
977,729
|
||||||
|
318,183
|
||||||
|
229,227
|
||||||
|
687,733
|
||||||
|
179,564
|
||||||
|
415,270
|
||||||
|
606,138
|
||||||
|
1274,280
|
||||||
|
295,541
|
||||||
|
1054,550
|
||||||
|
610,836
|
||||||
|
239,583
|
||||||
|
524,894
|
||||||
|
383,600
|
||||||
|
1102,808
|
||||||
|
830,883
|
||||||
|
828,543
|
||||||
|
686,845
|
||||||
|
252,544
|
||||||
|
832,490
|
||||||
|
1109,10
|
||||||
|
1009,267
|
||||||
|
869,765
|
||||||
|
822,360
|
||||||
|
928,716
|
||||||
|
1118,817
|
||||||
|
1063,103
|
||||||
|
10,680
|
||||||
|
497,813
|
||||||
|
295,609
|
||||||
|
1230,310
|
||||||
|
1042,145
|
||||||
|
1144,397
|
||||||
|
70,494
|
||||||
|
226,31
|
||||||
|
378,466
|
||||||
|
401,441
|
||||||
|
592,29
|
||||||
|
257,838
|
||||||
|
366,754
|
||||||
|
174,540
|
||||||
|
1253,49
|
||||||
|
78,593
|
||||||
|
903,576
|
||||||
|
764,828
|
||||||
|
382,716
|
||||||
|
793,499
|
||||||
|
1063,576
|
||||||
|
316,878
|
||||||
|
1128,417
|
||||||
|
1298,266
|
||||||
|
520,262
|
||||||
|
10,354
|
||||||
|
388,576
|
||||||
|
403,435
|
||||||
|
393,451
|
||||||
|
626,750
|
||||||
|
610,58
|
||||||
|
279,721
|
||||||
|
358,574
|
||||||
|
239,400
|
||||||
|
1010,184
|
||||||
|
1253,845
|
||||||
|
415,67
|
||||||
|
867,47
|
||||||
|
1032,75
|
||||||
|
1156,519
|
||||||
|
254,827
|
||||||
|
582,603
|
||||||
|
360,696
|
||||||
|
1071,311
|
||||||
|
246,666
|
||||||
|
353,851
|
||||||
|
838,477
|
||||||
|
320,182
|
||||||
|
835,220
|
||||||
|
1282,24
|
||||||
|
200,280
|
||||||
|
57,845
|
||||||
|
504,856
|
||||||
|
741,182
|
||||||
|
242,430
|
||||||
|
291,794
|
||||||
|
|
||||||
|
fold along x=655
|
||||||
|
fold along y=447
|
||||||
|
fold along x=327
|
||||||
|
fold along y=223
|
||||||
|
fold along x=163
|
||||||
|
fold along y=111
|
||||||
|
fold along x=81
|
||||||
|
fold along y=55
|
||||||
|
fold along x=40
|
||||||
|
fold along y=27
|
||||||
|
fold along y=13
|
||||||
|
fold along y=6
|
||||||
21
data/day13t.txt
Normal file
21
data/day13t.txt
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
6,10
|
||||||
|
0,14
|
||||||
|
9,10
|
||||||
|
0,3
|
||||||
|
10,4
|
||||||
|
4,11
|
||||||
|
6,0
|
||||||
|
6,12
|
||||||
|
4,1
|
||||||
|
0,13
|
||||||
|
10,12
|
||||||
|
3,4
|
||||||
|
3,0
|
||||||
|
8,4
|
||||||
|
1,10
|
||||||
|
2,14
|
||||||
|
8,10
|
||||||
|
9,0
|
||||||
|
|
||||||
|
fold along y=7
|
||||||
|
fold along x=5
|
||||||
102
data/day14a.txt
Normal file
102
data/day14a.txt
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
SHPPPVOFPBFCHHBKBNCV
|
||||||
|
|
||||||
|
HK -> C
|
||||||
|
SP -> H
|
||||||
|
VH -> K
|
||||||
|
KS -> B
|
||||||
|
BC -> S
|
||||||
|
PS -> K
|
||||||
|
PN -> S
|
||||||
|
NC -> F
|
||||||
|
CV -> B
|
||||||
|
SH -> K
|
||||||
|
SK -> H
|
||||||
|
KK -> O
|
||||||
|
HO -> V
|
||||||
|
HP -> C
|
||||||
|
HB -> S
|
||||||
|
NB -> N
|
||||||
|
HC -> K
|
||||||
|
SB -> O
|
||||||
|
SN -> C
|
||||||
|
BP -> H
|
||||||
|
FC -> V
|
||||||
|
CF -> C
|
||||||
|
FB -> F
|
||||||
|
VP -> S
|
||||||
|
PO -> N
|
||||||
|
HN -> N
|
||||||
|
BS -> O
|
||||||
|
NF -> H
|
||||||
|
BH -> O
|
||||||
|
NK -> B
|
||||||
|
KC -> B
|
||||||
|
OS -> S
|
||||||
|
BB -> S
|
||||||
|
SV -> K
|
||||||
|
CH -> B
|
||||||
|
OB -> K
|
||||||
|
FV -> B
|
||||||
|
CP -> V
|
||||||
|
FP -> C
|
||||||
|
VC -> K
|
||||||
|
FS -> S
|
||||||
|
SS -> F
|
||||||
|
VK -> C
|
||||||
|
SF -> B
|
||||||
|
VS -> B
|
||||||
|
CC -> P
|
||||||
|
SC -> S
|
||||||
|
HS -> K
|
||||||
|
CN -> C
|
||||||
|
BN -> N
|
||||||
|
BK -> B
|
||||||
|
FN -> H
|
||||||
|
OK -> S
|
||||||
|
FO -> S
|
||||||
|
VB -> C
|
||||||
|
FH -> S
|
||||||
|
KN -> K
|
||||||
|
CK -> B
|
||||||
|
KV -> P
|
||||||
|
NP -> P
|
||||||
|
CB -> N
|
||||||
|
KB -> C
|
||||||
|
FK -> K
|
||||||
|
BO -> O
|
||||||
|
OV -> B
|
||||||
|
OC -> B
|
||||||
|
NO -> F
|
||||||
|
VF -> V
|
||||||
|
VO -> B
|
||||||
|
FF -> K
|
||||||
|
PP -> O
|
||||||
|
VV -> K
|
||||||
|
PC -> N
|
||||||
|
OF -> S
|
||||||
|
PV -> P
|
||||||
|
PB -> C
|
||||||
|
KO -> V
|
||||||
|
BF -> N
|
||||||
|
OO -> K
|
||||||
|
NV -> P
|
||||||
|
PK -> V
|
||||||
|
BV -> C
|
||||||
|
HH -> K
|
||||||
|
PH -> S
|
||||||
|
OH -> B
|
||||||
|
HF -> S
|
||||||
|
NH -> H
|
||||||
|
NN -> K
|
||||||
|
KF -> H
|
||||||
|
ON -> N
|
||||||
|
PF -> H
|
||||||
|
CS -> H
|
||||||
|
CO -> O
|
||||||
|
SO -> K
|
||||||
|
HV -> N
|
||||||
|
NS -> N
|
||||||
|
KP -> S
|
||||||
|
OP -> N
|
||||||
|
KH -> P
|
||||||
|
VN -> H
|
||||||
18
data/day14t.txt
Normal file
18
data/day14t.txt
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
NNCB
|
||||||
|
|
||||||
|
CH -> B
|
||||||
|
HH -> N
|
||||||
|
CB -> H
|
||||||
|
NH -> C
|
||||||
|
HB -> C
|
||||||
|
HC -> B
|
||||||
|
HN -> C
|
||||||
|
NN -> C
|
||||||
|
BH -> H
|
||||||
|
NC -> B
|
||||||
|
NB -> B
|
||||||
|
BN -> B
|
||||||
|
BB -> N
|
||||||
|
BC -> B
|
||||||
|
CC -> N
|
||||||
|
CN -> C
|
||||||
100
data/day15a.txt
Normal file
100
data/day15a.txt
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
4474378939294561989629896994983437978985699596253525532314671357192283111874776269135656912429997578
|
||||||
|
7219771638623996974474331969734641552892111142431138735944711231631835799842996212331146124475743238
|
||||||
|
2961148417649542737169677941564183516932969881196199629267699818691135791971999512361149183535329621
|
||||||
|
9871881628922851313992884355318183839744114854999945898819527955613877899148971997483443895124972749
|
||||||
|
1919361485782789198624931971845488739823696439544194485467971198599719115839184879611199597989117999
|
||||||
|
1762668465318987168679928273548752326493925445898712574999271872149411413954567149128321356713711996
|
||||||
|
9758891114897878442978961731916935611295376892731655257822281645887798623165679892842795149121794562
|
||||||
|
8794174313234999832712179769998559998319429239188767268151198118491878742622198897183212759541967655
|
||||||
|
2988678541317271143977933951868179839261219262553692783314191948932847911897935195171794197173989921
|
||||||
|
7937619183351979421629995717138359299237763666982678128915583393591966489388882278897968133587978187
|
||||||
|
1771288861854197689291788182899974391348865254618377682157212997376757227474976188287284936469139151
|
||||||
|
9183171919381592591722911886147813851975446285895928831495379146316888188317259118133391938222425326
|
||||||
|
8999178115764971149712252879912618793998823997753599775883399792278112838295641244444695117892369594
|
||||||
|
1873895726139973829121992299149664519785161871191838821669115381988745189919982189161288151474919995
|
||||||
|
4984136373971951668595392799193993899717185589797683743651997948311187535129949925427154914977164128
|
||||||
|
9999159992495621281598156294198291771196656252551198178355135412329871819929964915836591711989341781
|
||||||
|
7448271118737319391897193945577185237289149161185958425793253988117519337798691129411823525491989579
|
||||||
|
1912877398736652997252949361587894888177859385896119191174915547635924182517149861596823312348516838
|
||||||
|
7411916158128158526295478182717158294634384119891189918596922443111778313519369151918184392138369342
|
||||||
|
3989641959996582997942999622814729287794974299321769978698859937138824918999289852969229264591966121
|
||||||
|
8248393694679143264483712911924992583617814177146997918231121311389144659299451133991759578899318192
|
||||||
|
3927235872389919653155979999938328728187786191428826154721811577636987639937191152179849749966459891
|
||||||
|
1948525667811945875973719911429986557611991729719152988893663912242325911951514496896839921798125311
|
||||||
|
4987111141491841355858599711851255968675598926996649953727649597973995225881919322173123485832889187
|
||||||
|
1365195963998349531975969939812311357919355589887113191872918217753311788481269124528221117399621391
|
||||||
|
2618399161117299311163167989995957247641824731167387813331889776165824292119925999974397616419172118
|
||||||
|
6291632879111763162218245818574896537571235342881933628446932929988162198918431515299983116383625972
|
||||||
|
4989885351975368919517881131331939647361285982389886925914714583162935321262181334119131787812193875
|
||||||
|
4299299298919624924959969574186387338111585431643179184399993147111734367892182112528965596812136913
|
||||||
|
1913417117824121122119581991583716146219291199512144882994343791853825968313288116386929568382564187
|
||||||
|
1111259582212962927119928188628297964251334111125433112968386513986892961393919529268118897941692493
|
||||||
|
2715119997271968941687778579456127393214439129136886489627687923892484915195916991318729518168291959
|
||||||
|
2291724998124331715461758417591991226316441238978117126961397713993893999191415391189914953491293518
|
||||||
|
6651599814824738431585179992975983597917279992953923879142789688619729867911998791486584911598218845
|
||||||
|
2918442247528921633279871699883197935812912988473973121391419422515181381798846124621198681771116747
|
||||||
|
7172399883999223589838199921288236965432928913987668795869711289579187827728254357182673543399455211
|
||||||
|
3569393618413195995391741993182111311863518792867229192811659349495352298888119612596629417295412514
|
||||||
|
3998347219684977173226832679351211849496942187999476517196156923911939957433439827199611519926291969
|
||||||
|
9977828541228662797249561538682143142912917199521133659429132814291869965747141895918621158384181577
|
||||||
|
3967357136159726912989158186141497914658884759161819339941915817318261777142291971767934513151711191
|
||||||
|
8778541261893461761951522343928625399856964371891169438911911122822912841986768693517712511587843892
|
||||||
|
3833315936351459473456192583978135792776752315117136132357898139879939295549611194156997971187878978
|
||||||
|
2999641761928943389161333525895439191749829143634997999562535389149495518993726784548236849917137469
|
||||||
|
4214435519912859292367198497751599991519199621895696677722866184996118129977367158899387561811918658
|
||||||
|
7231114979829829321158658131391759347796376211984948269698619841398767854635929631175398998618572335
|
||||||
|
9313714946993197143176667115892291898319189491659939292999929988795125299947811314219729882911991887
|
||||||
|
2431979557916685876176288971223844899949112179913119728153582922392676827594238311846859276898923985
|
||||||
|
2298182669623428768512173915565236181839119711668131839772497512198294739345891359413973166631273169
|
||||||
|
8252112361839197878358752854282389886943817597211988118627211731273149928198939566118122128841996531
|
||||||
|
2337699983275712849656128989981911537185958574583845722121193117562892294498614395491592899933659212
|
||||||
|
7835143227123429411997859131228998886319979718665139818711399818999495433364914764241123721713998422
|
||||||
|
2342981165371313441558921141193218916711873656679413979634321347456287987891354613188158163526439664
|
||||||
|
9968695782986491149112599371175397912721977143321762942839646919197966291866914197298621385251921577
|
||||||
|
3998992498311799137251321139836993298621918948485199967815255118632159287218116971357568151411518924
|
||||||
|
1888767584516918979116831969684198131139152419142419199229931716585258963961725216716375611191148939
|
||||||
|
8679972994968135896941454213273618172633413893517415398811979928196388336225492953687951759799299494
|
||||||
|
9268198998268358914731411728913143173989653793437178974319158741943243387571241681357965185312759759
|
||||||
|
4514415891598969983119893138887691162819199829581939189129625117153997172489929659441995563665252756
|
||||||
|
9761151889796191211989125275371563715891139933695658126189249913196967329183393395969219863889676661
|
||||||
|
2938315992611197591948197275927991961719112797199755413492386942224942718236489121713581914899162893
|
||||||
|
4395774214496174235572725299871291344821199963513129911973529221391842392121228344796144961395373279
|
||||||
|
7169235111278731299349194879561642927221385965252469499129166943949261126118955691946896131632763991
|
||||||
|
4182586898216472291721495499162914796616976593699934121197795791198151975744258153997558688681125324
|
||||||
|
2771241899369961675639292111153329919298919888341935788379952838991529795168864334579341944353139918
|
||||||
|
1929719796991998842893188199974443739822392912715991758633111534282888557598811717116422289319174234
|
||||||
|
8227445999711199165256581394711919882435899194112272635796122499955738435681954751995754828785863335
|
||||||
|
8729951893951458193176413529119379912287122558862639638362659118815726858589241612424874965948595588
|
||||||
|
8511215326829698921879251514193578281912679118343826143217429129999127819784588298767727133549889612
|
||||||
|
6382942339132989347621977329997789611123946187243171299917261115375998629792191171457419111628551833
|
||||||
|
5196411177129652468443166759257467191294653897926186178359322737194158687342924625234616743421831915
|
||||||
|
3119774454627842122238898938198398383523128289373178928124148914919779921881813499178793921224852955
|
||||||
|
7531169319889954774375677294553282895191113131163599175439212797364869867596793921132718138441171912
|
||||||
|
6731921588989796739221366138283466411951368178219585181184473112811174364385961459883733385891993199
|
||||||
|
4574139868545716129662294787788295397897183864953171131197921294921216787929998139387985941459997892
|
||||||
|
9114942724959127928293995753431994317864268467596979991595123389116539473212431173289917364566915973
|
||||||
|
9341929934129358191797626852989194781281961649194523995992215232749181878422232253289971438754945431
|
||||||
|
9711152565169547161792212418146438141573599572942189811381975633231484186771811384619293994316987371
|
||||||
|
6131964633192235767728441171994861691529178511919117275411839951991266231998851948696438627996557551
|
||||||
|
3148296295114114748119216197997581912166946469723628251179241221245394648451897828498337979132867349
|
||||||
|
5619591141279131179181294531676498187714322291293127899492999728165269816922513816979398883981987125
|
||||||
|
9291461484772577319579551995948438439426145159466288861499231447345317187441884819168882981519468534
|
||||||
|
7168729632153199693784461154421624968914968952182817868119431781278811691271694391273878312657379273
|
||||||
|
9946766299185992112985121571599989161421889915736923711827194941719778878516511122132169474883348691
|
||||||
|
9856269294522977396615891811325159414911139194979131992323319999997799632878319169846119312295884989
|
||||||
|
4478951999896991194591814281651647293997171866357947886291688317199128157536483298223818685997392164
|
||||||
|
6118292371386186497793385499159998311132592238538673922123742571831885763912281733919347629811931136
|
||||||
|
1559539789584621626699998299699573848437397472896218368568884152614411988211446699867863392231178582
|
||||||
|
3955545111973721673191918166186131172392954394391219111256767119175548689756115339875111299664124644
|
||||||
|
8532211187629552833266327798975958598213391751421237299429191278411695787897851286879811159917618734
|
||||||
|
2929979895191915513867778943916115416353324189939545761426692999878281933282414635716916418195731288
|
||||||
|
1752488277292284446514194696663537222777119194745592921911172268969679581894751682321198962925794788
|
||||||
|
9137893929311663938849971741824143649379956797731399631858279684249888929391696496889397231156431327
|
||||||
|
1867976767614781682191913943361471819244932778711517643998163299119525998895828969289556719268691861
|
||||||
|
7964834798931319884983618211814386951383713141581986214139319531157939294721187371941194911787999195
|
||||||
|
9136759325819523117222783968949195359947999675194157265271519931694932993191618368533937986955857334
|
||||||
|
1253987569539135869579376395211977798915817921811334441166659757918483967813112499681797768695123417
|
||||||
|
1194831387932819991127838412992226682976224442219982251828819129911478993471543959236282538182799247
|
||||||
|
9183416999951935493911137611615966391419988372968197976193987713623716848299299431993223458419679991
|
||||||
|
4962689198187192592599439628128214183938152641919458516294432194147333651495386497911639332152979188
|
||||||
|
8798649298935671297823969873452881511219118163995469811846217496897676246893511198571281879831529181
|
||||||
10
data/day15t.txt
Normal file
10
data/day15t.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
1163751742
|
||||||
|
1381373672
|
||||||
|
2136511328
|
||||||
|
3694931569
|
||||||
|
7463417111
|
||||||
|
1319128137
|
||||||
|
1359912421
|
||||||
|
3125421639
|
||||||
|
1293138521
|
||||||
|
2311944581
|
||||||
145
src/bin/day12.rs
Normal file
145
src/bin/day12.rs
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
use std::collections::{HashMap, HashSet, VecDeque};
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
#[derive(Debug, Error, PartialEq)]
|
||||||
|
enum Oopsie {
|
||||||
|
#[error("Bad line found: {0}")]
|
||||||
|
BadLine(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
const TEST1_DATA: &str = include_str!("../../data/day12t1.txt");
|
||||||
|
const TEST2_DATA: &str = include_str!("../../data/day12t2.txt");
|
||||||
|
const REAL_DATA: &str = include_str!("../../data/day12a.txt");
|
||||||
|
|
||||||
|
struct Graph<'a> {
|
||||||
|
edges: HashMap<&'a str, HashSet<&'a str>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Graph<'a> {
|
||||||
|
fn add_edge(&mut self, from: &'a str, to: &'a str) {
|
||||||
|
match self.edges.get_mut(from) {
|
||||||
|
None => {
|
||||||
|
let mut new_set = HashSet::new();
|
||||||
|
new_set.insert(to);
|
||||||
|
self.edges.insert(from, new_set);
|
||||||
|
}
|
||||||
|
Some(set) => {
|
||||||
|
set.insert(to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn paths(&self) -> Paths<'_> {
|
||||||
|
Paths {
|
||||||
|
graph: self,
|
||||||
|
state: VecDeque::from([vec!["start"]]),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Paths<'a> {
|
||||||
|
graph: &'a Graph<'a>,
|
||||||
|
state: VecDeque<Vec<&'a str>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn count<T: PartialEq>(items: &[T], item: &T) -> usize {
|
||||||
|
let mut num = 0;
|
||||||
|
|
||||||
|
for x in items.iter() {
|
||||||
|
if x == item {
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
num
|
||||||
|
}
|
||||||
|
|
||||||
|
fn still_valid(items: &[&str]) -> bool {
|
||||||
|
let mut counts = HashMap::new();
|
||||||
|
|
||||||
|
for item in items.iter() {
|
||||||
|
if item.chars().all(|x| x.is_lowercase()) {
|
||||||
|
if counts.contains_key(item) {
|
||||||
|
counts.insert(item, 2);
|
||||||
|
} else {
|
||||||
|
counts.insert(item, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut caught_two = false;
|
||||||
|
|
||||||
|
for count in counts.values() {
|
||||||
|
if caught_two && count > &1 {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if count > &1 {
|
||||||
|
caught_two = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Iterator for Paths<'a> {
|
||||||
|
type Item = Vec<&'a str>;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
while let Some(possible) = self.state.pop_front() {
|
||||||
|
match possible.last() {
|
||||||
|
None => panic!("Internal error; empty path in queue"),
|
||||||
|
Some(&"end") => return Some(possible),
|
||||||
|
Some(v) => {
|
||||||
|
for x in self.graph.edges.get(v).unwrap_or(&HashSet::new()) {
|
||||||
|
if x == &"start" {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if !x.chars().all(|x| x.is_lowercase()) || count(&possible, x) < 2 {
|
||||||
|
let mut copy = possible.clone();
|
||||||
|
copy.push(x);
|
||||||
|
if still_valid(©) {
|
||||||
|
self.state.push_back(copy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> TryFrom<&'a str> for Graph<'a> {
|
||||||
|
type Error = Oopsie;
|
||||||
|
|
||||||
|
fn try_from(value: &'a str) -> Result<Self, Self::Error> {
|
||||||
|
let mut graph = Graph {
|
||||||
|
edges: HashMap::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
for line in value.lines() {
|
||||||
|
match line.split_once('-') {
|
||||||
|
None => return Err(Oopsie::BadLine(line.to_string())),
|
||||||
|
Some((left, right)) => {
|
||||||
|
graph.add_edge(left, right);
|
||||||
|
graph.add_edge(right, left);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(graph)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let test1 = Graph::try_from(TEST1_DATA).unwrap();
|
||||||
|
let test2 = Graph::try_from(TEST2_DATA).unwrap();
|
||||||
|
let real = Graph::try_from(REAL_DATA).unwrap();
|
||||||
|
|
||||||
|
println!("Test #1 count: {}", test1.paths().count());
|
||||||
|
println!("Test #2 count: {}", test2.paths().count());
|
||||||
|
println!("Real count: {}", real.paths().count());
|
||||||
|
}
|
||||||
141
src/bin/day13.rs
Normal file
141
src/bin/day13.rs
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
use core::num::ParseIntError;
|
||||||
|
use std::str::FromStr;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
const TEST_DATA: &str = include_str!("../../data/day13t.txt");
|
||||||
|
const REAL_DATA: &str = include_str!("../../data/day13a.txt");
|
||||||
|
|
||||||
|
#[derive(Debug, Error, PartialEq)]
|
||||||
|
enum Oopsie {
|
||||||
|
#[error("Couldn't parse point based on this string: {0}")]
|
||||||
|
InvalidPoint(String),
|
||||||
|
#[error("Couldn't parse fold based on this string: {0}")]
|
||||||
|
BadFold(String),
|
||||||
|
#[error("Couldn't parse number: {0}")]
|
||||||
|
ParseIntError(#[from] ParseIntError),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, PartialOrd, Eq, Ord)]
|
||||||
|
struct Point {
|
||||||
|
x: usize,
|
||||||
|
y: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Point {
|
||||||
|
type Err = Oopsie;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s.split_once(',') {
|
||||||
|
None => Err(Oopsie::InvalidPoint(s.to_string())),
|
||||||
|
Some((xstr, ystr)) => {
|
||||||
|
let x = usize::from_str(xstr)?;
|
||||||
|
let y = usize::from_str(ystr)?;
|
||||||
|
Ok(Point { x, y })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Fold {
|
||||||
|
AlongX(usize),
|
||||||
|
AlongY(usize),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Fold {
|
||||||
|
type Err = Oopsie;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s.strip_prefix("fold along ") {
|
||||||
|
None => Err(Oopsie::BadFold(s.to_string())),
|
||||||
|
Some(line) => {
|
||||||
|
if let Some(num) = line.strip_prefix("x=") {
|
||||||
|
return Ok(Fold::AlongX(usize::from_str(num)?));
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(num) = line.strip_prefix("y=") {
|
||||||
|
return Ok(Fold::AlongY(usize::from_str(num)?));
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(Oopsie::BadFold(s.to_string()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_file(contents: &str) -> Result<(Vec<Point>, Vec<Fold>), Oopsie> {
|
||||||
|
let mut reading_points = true;
|
||||||
|
let mut points = Vec::new();
|
||||||
|
let mut folds = Vec::new();
|
||||||
|
|
||||||
|
for line in contents.lines() {
|
||||||
|
if line.is_empty() {
|
||||||
|
reading_points = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if reading_points {
|
||||||
|
points.push(Point::from_str(line)?);
|
||||||
|
} else {
|
||||||
|
folds.push(Fold::from_str(line)?);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok((points, folds))
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Point {
|
||||||
|
fn fold(&mut self, fold: &Fold) {
|
||||||
|
match fold {
|
||||||
|
Fold::AlongY(value) => {
|
||||||
|
if &self.y > value {
|
||||||
|
let difference = self.y - value;
|
||||||
|
self.y = value - difference;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Fold::AlongX(value) => {
|
||||||
|
if &self.x > value {
|
||||||
|
let difference = self.x - value;
|
||||||
|
self.x = value - difference;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fold(vec: &mut Vec<Point>, fold: &Fold) {
|
||||||
|
for point in vec.iter_mut() {
|
||||||
|
point.fold(fold);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec.sort_unstable();
|
||||||
|
vec.dedup();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(), Oopsie> {
|
||||||
|
let (mut test_points, test_folds) = parse_file(TEST_DATA)?;
|
||||||
|
|
||||||
|
fold(&mut test_points, &test_folds[0]);
|
||||||
|
println!("{} test points: {:?}", test_points.len(), test_points);
|
||||||
|
fold(&mut test_points, &test_folds[1]);
|
||||||
|
println!("{} test points: {:?}", test_points.len(), test_points);
|
||||||
|
let (mut real_points, real_folds) = parse_file(REAL_DATA)?;
|
||||||
|
fold(&mut real_points, &real_folds[0]);
|
||||||
|
println!("{} real points after first fold", real_points.len());
|
||||||
|
for instr in real_folds[1..].iter() {
|
||||||
|
fold(&mut real_points, instr);
|
||||||
|
}
|
||||||
|
let max_x = real_points.iter().map(|x| x.x).max().unwrap();
|
||||||
|
let max_y = real_points.iter().map(|x| x.y).max().unwrap();
|
||||||
|
for y in 0..=max_y {
|
||||||
|
for x in 0..=max_x {
|
||||||
|
if real_points.contains(&Point { x, y }) {
|
||||||
|
print!("#")
|
||||||
|
} else {
|
||||||
|
print!(" ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!()
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
183
src/bin/day14.rs
Normal file
183
src/bin/day14.rs
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
const TEST_DATA: &str = include_str!("../../data/day14t.txt");
|
||||||
|
const REAL_DATA: &str = include_str!("../../data/day14a.txt");
|
||||||
|
|
||||||
|
#[derive(Debug, Error, PartialEq)]
|
||||||
|
enum Oopsie {
|
||||||
|
#[error("Bad transform declaration: {0}")]
|
||||||
|
BadTransform(String),
|
||||||
|
#[error("No data found?!")]
|
||||||
|
NoData,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Transform {
|
||||||
|
lead: char,
|
||||||
|
follow: char,
|
||||||
|
inject: char,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<&str> for Transform {
|
||||||
|
type Error = Oopsie;
|
||||||
|
|
||||||
|
fn try_from(s: &str) -> Result<Self, Self::Error> {
|
||||||
|
match s.split_once(" -> ") {
|
||||||
|
None => Err(Oopsie::BadTransform(s.to_string())),
|
||||||
|
Some((from, to_str)) => Ok(Transform {
|
||||||
|
lead: from.chars().next().unwrap(),
|
||||||
|
follow: from.chars().nth(1).unwrap(),
|
||||||
|
inject: to_str.chars().next().unwrap(),
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_file(contents: &str) -> Result<(String, Vec<Transform>), Oopsie> {
|
||||||
|
let mut lines = contents.lines();
|
||||||
|
let mut transforms = Vec::new();
|
||||||
|
|
||||||
|
let base_str = match lines.next() {
|
||||||
|
None => return Err(Oopsie::NoData),
|
||||||
|
Some(x) => x.to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
|
for line in lines {
|
||||||
|
if line.is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
transforms.push(Transform::try_from(line)?);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok((base_str, transforms))
|
||||||
|
}
|
||||||
|
|
||||||
|
type Pair = (char, char);
|
||||||
|
type TransformDictionary = HashMap<Pair, [Pair; 2]>;
|
||||||
|
|
||||||
|
fn build_transform_dictionary(mut transforms: Vec<Transform>) -> TransformDictionary {
|
||||||
|
let mut result = HashMap::with_capacity(transforms.len());
|
||||||
|
|
||||||
|
for transform in transforms.drain(..) {
|
||||||
|
result.insert(
|
||||||
|
(transform.lead, transform.follow),
|
||||||
|
[
|
||||||
|
(transform.lead, transform.inject),
|
||||||
|
(transform.inject, transform.follow),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
type State = HashMap<Pair, usize>;
|
||||||
|
|
||||||
|
macro_rules! insert_update {
|
||||||
|
($dict: expr, $key: expr, $value: expr, |$x: ident| $body: expr) => {
|
||||||
|
match $dict.get_mut(&$key) {
|
||||||
|
None => {
|
||||||
|
$dict.insert($key, $value);
|
||||||
|
}
|
||||||
|
Some($x) => *$x = $body,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_initial_state(base: &str) -> State {
|
||||||
|
let mut state = HashMap::new();
|
||||||
|
let mut chars = base.chars().peekable();
|
||||||
|
|
||||||
|
while let Some(c1) = chars.next() {
|
||||||
|
match chars.peek() {
|
||||||
|
None => break,
|
||||||
|
Some(c2) => insert_update!(state, (c1, *c2), 1, |v| *v + 1),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state
|
||||||
|
}
|
||||||
|
|
||||||
|
fn step(base: &State, transforms: &TransformDictionary) -> State {
|
||||||
|
let mut result = HashMap::new();
|
||||||
|
|
||||||
|
for (pair, count) in base.iter() {
|
||||||
|
match transforms.get(pair) {
|
||||||
|
None => insert_update!(result, *pair, *count, |v| *v + count),
|
||||||
|
Some([p1, p2]) => {
|
||||||
|
insert_update!(result, *p1, *count, |v| *v + count);
|
||||||
|
insert_update!(result, *p2, *count, |v| *v + count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn steps(base: &State, steps: usize, transforms: &TransformDictionary) -> State {
|
||||||
|
let mut result = base.clone();
|
||||||
|
|
||||||
|
for i in 0..steps {
|
||||||
|
println!("At step {}, length is {}", i, result.len());
|
||||||
|
result = step(&result, transforms);
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn counts(polymer: &State) -> HashMap<char, usize> {
|
||||||
|
let mut char_counts = HashMap::new();
|
||||||
|
|
||||||
|
for ((c1, c2), count) in polymer.iter() {
|
||||||
|
insert_update!(char_counts, *c1, *count, |v| *v + count);
|
||||||
|
insert_update!(char_counts, *c2, *count, |v| *v + count);
|
||||||
|
}
|
||||||
|
|
||||||
|
char_counts
|
||||||
|
}
|
||||||
|
|
||||||
|
fn score(map: &HashMap<char, usize>) -> usize {
|
||||||
|
let high = map.values().max().unwrap();
|
||||||
|
let low = map.values().min().unwrap();
|
||||||
|
|
||||||
|
(high - low) / 2
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(), Oopsie> {
|
||||||
|
let (test_base, test_transforms) = read_file(TEST_DATA)?;
|
||||||
|
let (real_base, real_transforms) = read_file(REAL_DATA)?;
|
||||||
|
let test_initial = build_initial_state(&test_base);
|
||||||
|
let real_initial = build_initial_state(&real_base);
|
||||||
|
let test_transform_dict = build_transform_dictionary(test_transforms);
|
||||||
|
let real_transform_dict = build_transform_dictionary(real_transforms);
|
||||||
|
|
||||||
|
println!("test base: {:?}", test_initial);
|
||||||
|
println!("one step: {:?}", step(&test_initial, &test_transform_dict));
|
||||||
|
println!(
|
||||||
|
"four steps: {:?}",
|
||||||
|
steps(&test_initial, 4, &test_transform_dict)
|
||||||
|
);
|
||||||
|
println!(
|
||||||
|
"Length at 10 steps: {:?}",
|
||||||
|
steps(&test_initial, 10, &test_transform_dict).len()
|
||||||
|
);
|
||||||
|
println!(
|
||||||
|
"Counts at 10 steps: {:?}",
|
||||||
|
counts(&steps(&test_initial, 10, &test_transform_dict))
|
||||||
|
);
|
||||||
|
println!(
|
||||||
|
"Score at 10 steps: {:?}",
|
||||||
|
score(&counts(&steps(&test_initial, 10, &test_transform_dict)))
|
||||||
|
);
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"Real score at 10 steps: {:?}",
|
||||||
|
score(&counts(&steps(&real_initial, 10, &real_transform_dict)))
|
||||||
|
);
|
||||||
|
println!(
|
||||||
|
"Real score at 40 steps: {:?}",
|
||||||
|
score(&counts(&steps(&real_initial, 40, &real_transform_dict)))
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
128
src/bin/day15.rs
Normal file
128
src/bin/day15.rs
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
use pathfinding::directed::dijkstra::dijkstra;
|
||||||
|
|
||||||
|
use advent2021::map::{Graph, Oopsie};
|
||||||
|
|
||||||
|
const TEST_DATA: &str = include_str!("../../data/day15t.txt");
|
||||||
|
const REAL_DATA: &str = include_str!("../../data/day15a.txt");
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
struct Risk(usize);
|
||||||
|
|
||||||
|
impl TryFrom<char> for Risk {
|
||||||
|
type Error = Oopsie;
|
||||||
|
|
||||||
|
fn try_from(value: char) -> Result<Self, Self::Error> {
|
||||||
|
value
|
||||||
|
.to_digit(10)
|
||||||
|
.map(|x| Risk(x as usize))
|
||||||
|
.ok_or(Oopsie::BadCharacter(value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Risk {
|
||||||
|
fn inc(&mut self) {
|
||||||
|
self.0 = if self.0 == 9 { 1 } else { self.0 + 1 };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
#[allow(dead_code)]
|
||||||
|
struct Path {
|
||||||
|
points: Vec<(usize, usize)>,
|
||||||
|
cost: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn shortest_path(graph: &Graph<Risk>) -> Path {
|
||||||
|
let target_x = graph.width - 1;
|
||||||
|
let target_y = graph.height - 1;
|
||||||
|
|
||||||
|
let result = dijkstra(
|
||||||
|
&(0, 0),
|
||||||
|
|(x, y)| {
|
||||||
|
graph
|
||||||
|
.neighbors(*x, *y)
|
||||||
|
.into_iter()
|
||||||
|
.map(|p| ((p.x, p.y), p.value.0))
|
||||||
|
},
|
||||||
|
|(x, y)| x == &target_x && y == &target_y,
|
||||||
|
);
|
||||||
|
|
||||||
|
if let Some((points, cost)) = result {
|
||||||
|
Path { points, cost }
|
||||||
|
} else {
|
||||||
|
panic!("Couldn't find a result.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn embiggen(graph: &Graph<Risk>) -> Graph<Risk> {
|
||||||
|
let region8 = graph.clone();
|
||||||
|
let mut region9 = region8.clone();
|
||||||
|
region9.points_mut().for_each(|x| x.value.inc());
|
||||||
|
let mut region1 = region9.clone();
|
||||||
|
region1.points_mut().for_each(|x| x.value.inc());
|
||||||
|
let mut region2 = region1.clone();
|
||||||
|
region2.points_mut().for_each(|x| x.value.inc());
|
||||||
|
let mut region3 = region2.clone();
|
||||||
|
region3.points_mut().for_each(|x| x.value.inc());
|
||||||
|
let mut region4 = region3.clone();
|
||||||
|
region4.points_mut().for_each(|x| x.value.inc());
|
||||||
|
let mut region5 = region4.clone();
|
||||||
|
region5.points_mut().for_each(|x| x.value.inc());
|
||||||
|
let mut region6 = region5.clone();
|
||||||
|
region6.points_mut().for_each(|x| x.value.inc());
|
||||||
|
let mut region7 = region6.clone();
|
||||||
|
region7.points_mut().for_each(|x| x.value.inc());
|
||||||
|
|
||||||
|
Graph::from_subgraphs(
|
||||||
|
5,
|
||||||
|
5,
|
||||||
|
&[
|
||||||
|
region8,
|
||||||
|
region9.clone(),
|
||||||
|
region1.clone(),
|
||||||
|
region2.clone(),
|
||||||
|
region3.clone(),
|
||||||
|
region9.clone(),
|
||||||
|
region1.clone(),
|
||||||
|
region2.clone(),
|
||||||
|
region3.clone(),
|
||||||
|
region4.clone(),
|
||||||
|
region1.clone(),
|
||||||
|
region2.clone(),
|
||||||
|
region3.clone(),
|
||||||
|
region4.clone(),
|
||||||
|
region5.clone(),
|
||||||
|
region2.clone(),
|
||||||
|
region3.clone(),
|
||||||
|
region4.clone(),
|
||||||
|
region5.clone(),
|
||||||
|
region6.clone(),
|
||||||
|
region3.clone(),
|
||||||
|
region4.clone(),
|
||||||
|
region5.clone(),
|
||||||
|
region6.clone(),
|
||||||
|
region7.clone(),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(), Oopsie> {
|
||||||
|
let test_graph: Graph<Risk> = Graph::from_file_data(TEST_DATA)?;
|
||||||
|
let real_graph: Graph<Risk> = Graph::from_file_data(REAL_DATA)?;
|
||||||
|
|
||||||
|
println!("Test shortest path: {:?}", shortest_path(&test_graph));
|
||||||
|
println!("Real shortest path: {:?}", shortest_path(&real_graph));
|
||||||
|
|
||||||
|
let embiggened_test = embiggen(&test_graph);
|
||||||
|
println!(
|
||||||
|
"Larger test shortest path: {:?}",
|
||||||
|
shortest_path(&embiggened_test)
|
||||||
|
);
|
||||||
|
let embiggened_real = embiggen(&real_graph);
|
||||||
|
println!(
|
||||||
|
"Larger real shortest path: {:?}",
|
||||||
|
shortest_path(&embiggened_real)
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
@@ -269,7 +269,7 @@ impl<'a> ProblemInput<'a> {
|
|||||||
.map(build_local_iterator)
|
.map(build_local_iterator)
|
||||||
.multi_cartesian_product()
|
.multi_cartesian_product()
|
||||||
.map(|x| HashMap::from_iter(x.iter().cloned()))
|
.map(|x| HashMap::from_iter(x.iter().cloned()))
|
||||||
.filter(|x| reasonable_assignments(x));
|
.filter(reasonable_assignments);
|
||||||
|
|
||||||
for assignments in possibles {
|
for assignments in possibles {
|
||||||
if self.assignments_validate(&assignments) {
|
if self.assignments_validate(&assignments) {
|
||||||
|
|||||||
47
src/map.rs
47
src/map.rs
@@ -13,8 +13,18 @@ pub enum Oopsie {
|
|||||||
|
|
||||||
pub struct Graph<T> {
|
pub struct Graph<T> {
|
||||||
data: Vec<T>,
|
data: Vec<T>,
|
||||||
width: usize,
|
pub width: usize,
|
||||||
height: usize,
|
pub height: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Clone> Clone for Graph<T> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
Graph {
|
||||||
|
data: self.data.clone(),
|
||||||
|
width: self.width,
|
||||||
|
height: self.height,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: TryFrom<char, Error = Oopsie>> Graph<T> {
|
impl<T: TryFrom<char, Error = Oopsie>> Graph<T> {
|
||||||
@@ -59,6 +69,39 @@ impl<T: TryFrom<char, Error = Oopsie>> Graph<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: Clone> Graph<T> {
|
||||||
|
pub fn from_subgraphs(num_wide: usize, num_high: usize, graphs: &[Graph<T>]) -> Graph<T> {
|
||||||
|
let inner_width = graphs[0].width;
|
||||||
|
let inner_height = graphs[0].height;
|
||||||
|
let width = num_wide * inner_width;
|
||||||
|
let height = num_high * inner_height;
|
||||||
|
let mut data = Vec::with_capacity(width * height);
|
||||||
|
|
||||||
|
for y in 0..height {
|
||||||
|
for x in 0..width {
|
||||||
|
let graph_x = x / inner_width;
|
||||||
|
let idx_x = x % inner_width;
|
||||||
|
let graph_y = y / inner_height;
|
||||||
|
let idx_y = y % inner_height;
|
||||||
|
|
||||||
|
data.push(
|
||||||
|
graphs[(graph_y * num_wide) + graph_x]
|
||||||
|
.get(idx_x, idx_y)
|
||||||
|
.unwrap()
|
||||||
|
.value
|
||||||
|
.clone(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Graph {
|
||||||
|
data,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T> Graph<T> {
|
impl<T> Graph<T> {
|
||||||
pub fn size(&self) -> usize {
|
pub fn size(&self) -> usize {
|
||||||
self.width * self.height
|
self.width * self.height
|
||||||
|
|||||||
Reference in New Issue
Block a user