-1
.envrc
-1
.envrc
···
1
-
use_flake .
-1
.gitignore
-1
.gitignore
···
1
-
.direnv
+1
2024/.gitignore
+1
2024/.gitignore
···
1
+
.direnv
+1
2024/day_1/.gitignore
+1
2024/day_1/.gitignore
···
1
+
/target
+7
2024/day_1/Cargo.lock
+7
2024/day_1/Cargo.lock
+6
2024/day_1/Cargo.toml
+6
2024/day_1/Cargo.toml
+1000
2024/day_1/input.txt
+1000
2024/day_1/input.txt
···
1
+
77221 93653
2
+
61169 27995
3
+
49546 69782
4
+
11688 41563
5
+
15820 48282
6
+
63235 37517
7
+
28850 68189
8
+
80735 25255
9
+
42616 65322
10
+
55068 99897
11
+
30851 35509
12
+
14907 49013
13
+
64732 92011
14
+
16709 68830
15
+
67643 36207
16
+
44080 23559
17
+
96480 58330
18
+
99450 40186
19
+
21169 63410
20
+
58096 21671
21
+
53828 79572
22
+
47026 44529
23
+
90101 28656
24
+
45773 73412
25
+
71303 85991
26
+
45304 78294
27
+
96528 23559
28
+
19794 17882
29
+
74831 17211
30
+
88912 11644
31
+
98961 80435
32
+
15788 96101
33
+
16350 86995
34
+
96806 19028
35
+
99959 77868
36
+
58887 90255
37
+
42568 25255
38
+
29278 88912
39
+
94028 63269
40
+
42810 21548
41
+
97490 71747
42
+
89051 24477
43
+
73916 31808
44
+
97751 88912
45
+
73608 77868
46
+
62426 13754
47
+
29429 36177
48
+
11070 10894
49
+
78656 85185
50
+
31308 60500
51
+
96166 91114
52
+
36906 85134
53
+
99662 77868
54
+
66402 41563
55
+
37085 14475
56
+
80907 53324
57
+
61650 53324
58
+
84223 63753
59
+
83891 47827
60
+
15973 77536
61
+
68843 40593
62
+
98854 31274
63
+
42426 97404
64
+
25255 67531
65
+
44559 50141
66
+
93909 50674
67
+
28070 32858
68
+
24880 24813
69
+
29338 89795
70
+
64883 77868
71
+
66924 57646
72
+
32984 66502
73
+
32238 39062
74
+
38816 23559
75
+
58770 65322
76
+
74953 91636
77
+
70592 19028
78
+
93111 11644
79
+
31065 23537
80
+
67370 19028
81
+
18314 47412
82
+
71075 74334
83
+
21544 44529
84
+
59137 50980
85
+
20440 80749
86
+
14393 38495
87
+
72130 90255
88
+
43828 68830
89
+
23262 73660
90
+
11923 50980
91
+
47754 14164
92
+
96043 34362
93
+
27162 28090
94
+
20838 50713
95
+
75009 11121
96
+
92099 31274
97
+
22054 38248
98
+
43518 80106
99
+
68189 13153
100
+
50520 12727
101
+
51425 40674
102
+
42998 31053
103
+
52443 33051
104
+
37256 54436
105
+
16648 95555
106
+
81123 17329
107
+
46974 79835
108
+
36328 77868
109
+
76373 23559
110
+
82592 70046
111
+
70600 22417
112
+
27116 89690
113
+
28090 34969
114
+
86348 23559
115
+
53145 50980
116
+
30203 83301
117
+
23347 77681
118
+
76433 26236
119
+
28046 92869
120
+
58920 50980
121
+
25518 28090
122
+
12791 44529
123
+
61967 31808
124
+
98022 53056
125
+
24326 12263
126
+
41095 13121
127
+
24045 82448
128
+
31274 16530
129
+
78021 21589
130
+
63029 19658
131
+
75684 14475
132
+
31258 36493
133
+
40561 48589
134
+
20457 54974
135
+
14783 88465
136
+
39433 23537
137
+
34774 53324
138
+
10455 14329
139
+
26338 74416
140
+
55227 37003
141
+
36963 40380
142
+
31910 68189
143
+
94894 18220
144
+
23166 44111
145
+
48884 46787
146
+
73036 89795
147
+
83519 25205
148
+
50205 93653
149
+
85926 50141
150
+
69194 23559
151
+
25529 11642
152
+
10182 31274
153
+
13638 61987
154
+
83588 19028
155
+
75911 20768
156
+
44692 24325
157
+
43278 94888
158
+
48148 24394
159
+
86205 99327
160
+
82605 58818
161
+
52770 68189
162
+
89068 84917
163
+
66452 83679
164
+
50217 85099
165
+
64914 52073
166
+
76460 78294
167
+
43026 24410
168
+
44179 50980
169
+
47653 90255
170
+
78061 50980
171
+
14475 71478
172
+
77868 37150
173
+
99645 28090
174
+
86267 70055
175
+
58072 68830
176
+
96428 66585
177
+
77501 50141
178
+
52344 93653
179
+
49534 35509
180
+
46925 12437
181
+
40005 87987
182
+
17329 86995
183
+
17585 89795
184
+
32296 59660
185
+
81836 11644
186
+
89435 65322
187
+
55149 59423
188
+
56971 50141
189
+
26342 95142
190
+
57894 56227
191
+
49762 33007
192
+
48949 65641
193
+
40453 53505
194
+
67613 23537
195
+
27110 87987
196
+
25231 63910
197
+
92546 50713
198
+
70074 27554
199
+
39649 93653
200
+
93231 30520
201
+
60008 79179
202
+
18449 47209
203
+
68828 36207
204
+
18908 72254
205
+
55426 44661
206
+
62522 87987
207
+
60923 25255
208
+
85721 68107
209
+
35153 71814
210
+
20053 24813
211
+
24233 22904
212
+
36237 92731
213
+
92077 68189
214
+
30105 50674
215
+
37032 90255
216
+
12745 54116
217
+
41563 53324
218
+
24700 29145
219
+
60226 85335
220
+
50713 64775
221
+
29972 51790
222
+
79176 19794
223
+
40017 96101
224
+
90724 41345
225
+
51608 39176
226
+
46178 50141
227
+
26151 23489
228
+
19569 44529
229
+
34368 86052
230
+
18948 50801
231
+
62091 17329
232
+
89749 38984
233
+
68315 37514
234
+
52396 19794
235
+
14981 14475
236
+
36038 69571
237
+
50048 50980
238
+
60796 41563
239
+
69942 72877
240
+
80976 25234
241
+
56722 90255
242
+
49489 28090
243
+
60768 65557
244
+
70753 85065
245
+
15233 23522
246
+
94697 87600
247
+
40958 41532
248
+
91709 40116
249
+
83586 19028
250
+
88140 24977
251
+
56993 50980
252
+
17980 53324
253
+
12421 97982
254
+
30183 40884
255
+
50452 53324
256
+
91314 90651
257
+
69995 19028
258
+
16588 28090
259
+
22432 98658
260
+
86088 77868
261
+
46361 65322
262
+
97178 75705
263
+
37444 79320
264
+
12275 96101
265
+
47016 16942
266
+
36822 87327
267
+
62082 31274
268
+
68265 64314
269
+
87344 24603
270
+
40642 23559
271
+
87254 38755
272
+
62372 50713
273
+
89026 68830
274
+
88519 96101
275
+
53514 31808
276
+
24686 41563
277
+
23817 68705
278
+
26704 89031
279
+
37908 65322
280
+
22665 35601
281
+
75378 59200
282
+
16797 86995
283
+
55847 68189
284
+
55932 72688
285
+
41470 96101
286
+
43557 17329
287
+
45439 77868
288
+
41230 76226
289
+
25104 92869
290
+
43736 93653
291
+
85938 93653
292
+
74153 54726
293
+
73956 70350
294
+
70419 37102
295
+
81275 64160
296
+
30656 32684
297
+
46218 32617
298
+
67969 31808
299
+
61544 81806
300
+
39376 56568
301
+
14769 60336
302
+
10199 97703
303
+
61064 40091
304
+
75531 30486
305
+
17211 31808
306
+
75184 74633
307
+
24565 61765
308
+
83922 44529
309
+
11644 25255
310
+
71836 14393
311
+
53030 19028
312
+
83437 33190
313
+
33687 54998
314
+
92054 82083
315
+
48250 68533
316
+
10977 34363
317
+
51050 19028
318
+
80898 68276
319
+
26442 68830
320
+
39875 65514
321
+
24976 76417
322
+
31946 23537
323
+
95278 90255
324
+
71678 26450
325
+
49641 28580
326
+
12962 13674
327
+
13598 30362
328
+
40620 21256
329
+
49062 92869
330
+
88449 79529
331
+
80153 94081
332
+
36918 70556
333
+
77902 99228
334
+
41848 99097
335
+
26032 39378
336
+
23830 50980
337
+
49712 78294
338
+
95464 65322
339
+
76971 27393
340
+
67074 22132
341
+
17629 71246
342
+
92019 92869
343
+
20780 96521
344
+
68372 16880
345
+
49710 88060
346
+
94680 52634
347
+
28626 57101
348
+
31808 60809
349
+
25578 28090
350
+
12020 25255
351
+
46008 33046
352
+
27712 36207
353
+
17168 53033
354
+
92923 87987
355
+
94668 65843
356
+
59490 48858
357
+
69085 38485
358
+
28242 14664
359
+
18302 96101
360
+
64047 71241
361
+
62752 73532
362
+
28873 59278
363
+
22206 18029
364
+
57298 85374
365
+
26420 78294
366
+
74055 30817
367
+
74377 45566
368
+
81846 17058
369
+
35184 27305
370
+
72054 89795
371
+
78666 41563
372
+
80545 96101
373
+
69240 51322
374
+
76319 36831
375
+
23617 14475
376
+
53848 93653
377
+
65082 36888
378
+
18802 93491
379
+
63942 23559
380
+
80208 22876
381
+
17018 68830
382
+
78018 51611
383
+
35520 75130
384
+
43479 88543
385
+
18522 96101
386
+
41260 15010
387
+
58041 21675
388
+
96272 68830
389
+
73601 78294
390
+
44788 52104
391
+
67152 89795
392
+
57671 61399
393
+
33841 56764
394
+
41963 53394
395
+
41010 28090
396
+
53937 65322
397
+
75472 76675
398
+
22253 92068
399
+
24277 93653
400
+
62012 14475
401
+
27539 50141
402
+
29180 41637
403
+
27151 35922
404
+
28752 23559
405
+
31602 47673
406
+
80298 50906
407
+
94689 38297
408
+
87987 48139
409
+
51692 61967
410
+
93653 86995
411
+
99694 96638
412
+
50948 11644
413
+
87830 19794
414
+
57579 93403
415
+
60947 72082
416
+
18514 53324
417
+
99194 25255
418
+
57630 93653
419
+
49914 10526
420
+
34613 94340
421
+
32145 16105
422
+
39569 62764
423
+
14118 31274
424
+
38901 19016
425
+
47443 66925
426
+
83812 31274
427
+
61920 50141
428
+
88684 50713
429
+
32305 31808
430
+
58695 50713
431
+
20016 42720
432
+
68955 31976
433
+
96299 99509
434
+
83258 96101
435
+
49424 68830
436
+
97130 14043
437
+
34668 50936
438
+
27567 35509
439
+
57890 65959
440
+
58399 78860
441
+
88934 50980
442
+
70656 66788
443
+
91507 44529
444
+
53671 87987
445
+
75858 71137
446
+
14726 13674
447
+
25416 31274
448
+
90521 50075
449
+
37289 96101
450
+
79415 19028
451
+
21158 25355
452
+
53210 16168
453
+
35192 81526
454
+
67240 23559
455
+
42967 65310
456
+
81598 93094
457
+
12765 36207
458
+
23853 41643
459
+
78439 22984
460
+
13052 50141
461
+
56642 93653
462
+
19028 82791
463
+
89371 36244
464
+
89795 50799
465
+
41542 90489
466
+
49486 72630
467
+
26630 50763
468
+
35019 68830
469
+
62271 78294
470
+
16433 77868
471
+
42466 57338
472
+
63666 39984
473
+
56231 83564
474
+
51132 96101
475
+
33675 74200
476
+
94670 70445
477
+
51236 17822
478
+
52493 64460
479
+
45346 86995
480
+
41620 31274
481
+
80479 88912
482
+
46200 90255
483
+
13789 60686
484
+
98564 76843
485
+
44974 92717
486
+
76047 80674
487
+
60650 89430
488
+
55723 45722
489
+
89426 97853
490
+
33961 98414
491
+
32872 68189
492
+
65322 12029
493
+
29922 36159
494
+
74923 34697
495
+
37065 59688
496
+
66622 23559
497
+
68253 14475
498
+
28664 53324
499
+
62981 25761
500
+
83161 50674
501
+
22849 50980
502
+
11119 76308
503
+
22980 13794
504
+
76171 19411
505
+
96351 28221
506
+
45573 90255
507
+
19850 79146
508
+
97828 90483
509
+
23867 85271
510
+
36353 50141
511
+
46579 87987
512
+
73434 23559
513
+
57169 68189
514
+
68768 41682
515
+
59354 97617
516
+
62181 64641
517
+
34167 53324
518
+
28374 24803
519
+
55863 57352
520
+
25058 33040
521
+
76126 53005
522
+
97283 51641
523
+
25887 29253
524
+
43067 50713
525
+
51616 61868
526
+
97533 16129
527
+
50692 80951
528
+
43173 41626
529
+
93917 76055
530
+
84713 53465
531
+
24130 13599
532
+
56773 50980
533
+
15310 44529
534
+
63375 50141
535
+
75875 93653
536
+
22284 33135
537
+
46294 77836
538
+
29713 14393
539
+
95318 83346
540
+
83264 61967
541
+
39267 47771
542
+
61101 86995
543
+
47882 96101
544
+
24345 70347
545
+
50674 14475
546
+
17296 12880
547
+
52605 11644
548
+
40817 78294
549
+
36207 93653
550
+
16045 96101
551
+
91784 68830
552
+
34583 69934
553
+
71867 28090
554
+
74898 22671
555
+
54609 27206
556
+
33070 26257
557
+
18570 57394
558
+
16766 87036
559
+
62825 21503
560
+
39793 17504
561
+
12038 82452
562
+
37265 12706
563
+
69479 44529
564
+
96101 44260
565
+
49175 50713
566
+
70708 55412
567
+
50136 14475
568
+
27300 96101
569
+
75794 62368
570
+
10277 87990
571
+
30825 87987
572
+
35563 24149
573
+
12505 91890
574
+
11323 14393
575
+
89922 84455
576
+
10927 65359
577
+
50656 71304
578
+
47973 11644
579
+
17156 92869
580
+
98964 96101
581
+
50980 59345
582
+
94733 23559
583
+
22743 26134
584
+
90255 54273
585
+
80006 65322
586
+
10157 92869
587
+
70496 28090
588
+
25569 41226
589
+
79982 92869
590
+
34897 76485
591
+
83357 86388
592
+
26352 79503
593
+
67432 15174
594
+
49155 72153
595
+
36311 86995
596
+
14394 65333
597
+
70928 51667
598
+
67367 23559
599
+
48195 57003
600
+
52001 26154
601
+
63251 21651
602
+
21894 89795
603
+
50774 43252
604
+
85637 36207
605
+
79243 11644
606
+
49512 57954
607
+
22454 15919
608
+
84214 20805
609
+
67121 86995
610
+
49247 78035
611
+
79313 34840
612
+
33168 19814
613
+
48657 92888
614
+
59824 74905
615
+
30088 68830
616
+
74246 90052
617
+
78389 65322
618
+
88418 28090
619
+
93716 62226
620
+
74962 29324
621
+
47309 50980
622
+
93517 14393
623
+
23895 68175
624
+
34548 25255
625
+
32628 84730
626
+
55988 31274
627
+
82578 40953
628
+
51728 16926
629
+
19440 27805
630
+
42922 45159
631
+
52930 41563
632
+
91562 31274
633
+
23559 62680
634
+
92150 26879
635
+
78315 61783
636
+
43601 91325
637
+
87621 17838
638
+
78580 65350
639
+
94778 77868
640
+
68519 83273
641
+
35509 66389
642
+
82288 52439
643
+
65083 19794
644
+
86995 13010
645
+
66618 95850
646
+
18656 70145
647
+
98537 65322
648
+
60842 52161
649
+
68830 10132
650
+
99689 24077
651
+
33740 89795
652
+
45595 53090
653
+
78239 36207
654
+
20185 36207
655
+
87307 69366
656
+
83009 77868
657
+
34685 88642
658
+
13674 28090
659
+
82450 69909
660
+
44812 75146
661
+
54296 92869
662
+
73558 94990
663
+
21422 48229
664
+
49473 10547
665
+
66108 68189
666
+
71169 74202
667
+
78276 40690
668
+
82977 78294
669
+
61842 15634
670
+
31582 95459
671
+
39064 14475
672
+
70204 18593
673
+
71244 87987
674
+
31642 50490
675
+
98413 37109
676
+
61175 50141
677
+
37168 23559
678
+
44093 11032
679
+
18806 40848
680
+
91249 73483
681
+
95812 32572
682
+
93644 68189
683
+
30669 20850
684
+
75404 92869
685
+
53324 50141
686
+
80675 50216
687
+
14897 73401
688
+
34074 29952
689
+
16366 32630
690
+
95656 28090
691
+
73964 58896
692
+
90705 66916
693
+
92869 59662
694
+
99522 78294
695
+
35903 19794
696
+
33033 42610
697
+
55650 50980
698
+
29289 11753
699
+
32302 58345
700
+
76036 57644
701
+
74870 31274
702
+
85035 77868
703
+
79322 25255
704
+
50332 31274
705
+
78294 44529
706
+
93000 53324
707
+
36560 19028
708
+
40041 53525
709
+
70360 89795
710
+
19074 98749
711
+
32829 89603
712
+
61436 71046
713
+
89938 85369
714
+
52708 28090
715
+
83958 53324
716
+
88155 67097
717
+
32730 75527
718
+
64221 23559
719
+
60391 97432
720
+
70047 20185
721
+
12372 73527
722
+
46501 29274
723
+
66552 14746
724
+
56373 51614
725
+
95596 11782
726
+
81196 72623
727
+
32282 60515
728
+
49504 14393
729
+
57642 34348
730
+
95402 87987
731
+
81625 68830
732
+
28527 37199
733
+
71475 31808
734
+
94280 23005
735
+
55623 99355
736
+
46783 29073
737
+
36641 81559
738
+
74788 14535
739
+
87994 78773
740
+
80189 77868
741
+
33263 89795
742
+
23537 23537
743
+
25755 22264
744
+
67413 72800
745
+
74924 73774
746
+
81215 78294
747
+
78206 92869
748
+
36161 50141
749
+
54925 86995
750
+
66305 49951
751
+
42462 28090
752
+
99051 88912
753
+
44954 89795
754
+
88856 28090
755
+
63026 85778
756
+
22651 24813
757
+
39262 14475
758
+
86176 69982
759
+
65395 14393
760
+
12926 78294
761
+
81994 53324
762
+
16933 30191
763
+
46987 19794
764
+
37215 28090
765
+
15340 63748
766
+
40271 86674
767
+
23747 52856
768
+
61156 11644
769
+
65356 56048
770
+
72336 51278
771
+
21864 77868
772
+
99351 13349
773
+
24599 79046
774
+
62281 23361
775
+
81871 53324
776
+
14029 42297
777
+
50141 48720
778
+
46677 43636
779
+
10745 35965
780
+
39344 80864
781
+
38077 50038
782
+
13983 89795
783
+
66663 67877
784
+
64175 19028
785
+
62355 68830
786
+
96823 79443
787
+
46436 44754
788
+
53388 68830
789
+
45987 92723
790
+
87646 11707
791
+
75997 45545
792
+
69968 93653
793
+
30425 44529
794
+
83211 88109
795
+
28725 64932
796
+
47043 89795
797
+
34475 31274
798
+
42302 94895
799
+
66558 92753
800
+
48964 50713
801
+
19546 78294
802
+
51026 89795
803
+
89346 57408
804
+
52993 54676
805
+
29577 38385
806
+
85932 60320
807
+
18030 22556
808
+
65993 19922
809
+
74692 23559
810
+
61588 89795
811
+
50688 69541
812
+
93760 44529
813
+
75094 96101
814
+
68976 86835
815
+
46278 50980
816
+
97836 44529
817
+
17576 32708
818
+
48519 46071
819
+
72647 93653
820
+
54724 34155
821
+
45186 43448
822
+
44529 41828
823
+
90404 86357
824
+
63175 44529
825
+
88381 25963
826
+
32140 23537
827
+
43348 36423
828
+
41733 88912
829
+
84065 98953
830
+
20389 96101
831
+
38749 93788
832
+
37929 35143
833
+
63747 35340
834
+
72249 93653
835
+
98042 59381
836
+
22741 95783
837
+
88124 33425
838
+
16493 44529
839
+
36599 69408
840
+
50436 41563
841
+
67695 86149
842
+
89091 20022
843
+
60708 92607
844
+
28750 68830
845
+
80224 39113
846
+
34580 96101
847
+
79688 34798
848
+
14870 68189
849
+
47719 29252
850
+
57652 33458
851
+
65541 87987
852
+
86435 19794
853
+
95204 81239
854
+
43800 50980
855
+
94063 11644
856
+
24096 36588
857
+
36628 95478
858
+
81443 17329
859
+
61221 57166
860
+
52782 78294
861
+
16740 31274
862
+
68369 45653
863
+
28895 44529
864
+
39222 65582
865
+
97201 77602
866
+
81119 11644
867
+
41083 50141
868
+
72917 25255
869
+
46148 21269
870
+
44495 18020
871
+
99464 90525
872
+
67254 58381
873
+
52750 28135
874
+
63899 55754
875
+
14617 50713
876
+
36962 50713
877
+
41322 73436
878
+
22504 38709
879
+
72577 39875
880
+
67799 68830
881
+
68284 71156
882
+
46011 61967
883
+
50367 31808
884
+
45832 87987
885
+
88775 87987
886
+
32562 26340
887
+
43756 49887
888
+
73444 16547
889
+
67302 92449
890
+
22133 85451
891
+
17768 77868
892
+
69281 39885
893
+
87364 25255
894
+
41209 27363
895
+
37792 77868
896
+
66667 73746
897
+
22195 28090
898
+
65037 37556
899
+
28634 89795
900
+
23901 50674
901
+
40511 95801
902
+
47779 45253
903
+
76489 86807
904
+
77873 66992
905
+
87523 35509
906
+
32876 50980
907
+
62342 50980
908
+
84222 41563
909
+
88205 40382
910
+
78856 20051
911
+
97888 68189
912
+
22233 17329
913
+
35868 81437
914
+
80155 93653
915
+
82730 78294
916
+
12733 19794
917
+
55038 26258
918
+
50682 23250
919
+
42043 74279
920
+
54719 71512
921
+
54474 23991
922
+
61776 25255
923
+
55564 41563
924
+
39404 31274
925
+
94954 14475
926
+
76258 89795
927
+
87689 67995
928
+
65619 59930
929
+
41846 17435
930
+
21990 22185
931
+
60161 53026
932
+
44955 57523
933
+
84178 39875
934
+
32693 87987
935
+
19125 44529
936
+
96731 93653
937
+
98080 44529
938
+
72947 95746
939
+
67285 23344
940
+
78101 77580
941
+
43064 11644
942
+
81350 23483
943
+
46937 11644
944
+
97686 79381
945
+
66339 60744
946
+
39269 50674
947
+
61837 77868
948
+
97647 86995
949
+
44613 93568
950
+
73127 68830
951
+
64048 80370
952
+
15530 87987
953
+
63926 51860
954
+
95853 91981
955
+
26155 28090
956
+
82222 19794
957
+
10035 87445
958
+
16445 93653
959
+
67972 15558
960
+
51780 68830
961
+
52358 31274
962
+
83942 60096
963
+
64899 11955
964
+
56009 96101
965
+
42288 36590
966
+
53349 65322
967
+
76255 50713
968
+
53044 26351
969
+
37184 31274
970
+
24813 19028
971
+
62309 52490
972
+
93607 19028
973
+
27423 45568
974
+
26128 78294
975
+
72691 50141
976
+
42162 60052
977
+
78247 10613
978
+
80209 31808
979
+
38310 93653
980
+
59228 47607
981
+
24897 23559
982
+
55176 37760
983
+
33062 53324
984
+
26521 39170
985
+
93209 68189
986
+
89881 23559
987
+
11418 50980
988
+
16884 78294
989
+
31995 50980
990
+
17858 98671
991
+
49107 96101
992
+
50512 54526
993
+
56890 65322
994
+
76173 65309
995
+
51569 52845
996
+
73919 23537
997
+
62591 16739
998
+
53735 79935
999
+
14454 69804
1000
+
19976 46609
+92
2024/day_1/src/main.rs
+92
2024/day_1/src/main.rs
···
1
+
#![feature(test)]
2
+
3
+
extern crate test;
4
+
5
+
use std::{collections::HashMap, fs};
6
+
7
+
fn part_1(left: &Vec<u32>, right: &Vec<u32>) {
8
+
let mut diff: u32 = 0;
9
+
for (i, l) in left.iter().enumerate() {
10
+
diff += l.abs_diff(right[i]);
11
+
}
12
+
13
+
println!("Part 1: {diff}");
14
+
}
15
+
16
+
#[derive(Debug, Clone, Copy)]
17
+
struct Occurences {
18
+
left: u32,
19
+
right: u32
20
+
}
21
+
22
+
fn part_2(left: &Vec<u32>, right: &Vec<u32>) {
23
+
let mut mapped = HashMap::<u32, Occurences>::new();
24
+
for (_, l) in left.iter().enumerate() {
25
+
let v = &mut mapped.get(l).unwrap_or( &Occurences { left: 0, right: 0 });
26
+
mapped.insert(*l, Occurences { left: v.left + 1, right: v.right });
27
+
}
28
+
for (_, r) in right.iter().enumerate() {
29
+
let v = &mut mapped.get(r).unwrap_or( &Occurences { left: 0, right: 0 });
30
+
mapped.insert(*r, Occurences { left: v.left, right: v.right + 1 });
31
+
}
32
+
33
+
let reduce = mapped.iter().map(
34
+
|(num, occurences)| {
35
+
num*occurences.left*occurences.right
36
+
}
37
+
);
38
+
39
+
let similarity: u32 = reduce.sum();
40
+
41
+
println!("Part 2: {similarity}");
42
+
}
43
+
44
+
fn parse_input() -> Option<(Vec<u32>, Vec<u32>)> {
45
+
let input = fs::read_to_string("./input.txt").expect("Couldn't read file");
46
+
47
+
let (mut left, mut right) = input.lines().map(
48
+
|l| {
49
+
let mut split = l.split_whitespace();
50
+
let left = split.next();
51
+
let right = split.next();
52
+
53
+
(
54
+
left.unwrap().parse::<u32>().unwrap(),
55
+
right.unwrap().parse::<u32>().unwrap()
56
+
)
57
+
}
58
+
).collect::<(Vec<_>, Vec<_>)>();
59
+
60
+
left.sort();
61
+
right.sort();
62
+
63
+
Some((left, right))
64
+
}
65
+
66
+
fn main() {
67
+
let (left, right) = parse_input().unwrap();
68
+
part_1(&left, &right);
69
+
part_2(&left, &right);
70
+
}
71
+
72
+
#[bench]
73
+
fn full(b: &mut test::Bencher) {
74
+
b.iter(|| main());
75
+
}
76
+
77
+
#[bench]
78
+
fn input_only(b: &mut test::Bencher) {
79
+
b.iter(|| parse_input());
80
+
}
81
+
82
+
#[bench]
83
+
fn part_one(b: &mut test::Bencher) {
84
+
let (left, right) = parse_input().unwrap();
85
+
b.iter(|| part_1(&left, &right));
86
+
}
87
+
88
+
#[bench]
89
+
fn part_two(b: &mut test::Bencher) {
90
+
let (left, right) = parse_input().unwrap();
91
+
b.iter(|| part_2(&left, &right));
92
+
}
+1
2024/day_3/.gitignore
+1
2024/day_3/.gitignore
···
1
+
/target
+54
2024/day_3/Cargo.lock
+54
2024/day_3/Cargo.lock
···
1
+
# This file is automatically @generated by Cargo.
2
+
# It is not intended for manual editing.
3
+
version = 4
4
+
5
+
[[package]]
6
+
name = "aho-corasick"
7
+
version = "1.1.3"
8
+
source = "registry+https://github.com/rust-lang/crates.io-index"
9
+
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
10
+
dependencies = [
11
+
"memchr",
12
+
]
13
+
14
+
[[package]]
15
+
name = "day_3"
16
+
version = "0.1.0"
17
+
dependencies = [
18
+
"regex",
19
+
]
20
+
21
+
[[package]]
22
+
name = "memchr"
23
+
version = "2.7.4"
24
+
source = "registry+https://github.com/rust-lang/crates.io-index"
25
+
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
26
+
27
+
[[package]]
28
+
name = "regex"
29
+
version = "1.11.1"
30
+
source = "registry+https://github.com/rust-lang/crates.io-index"
31
+
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
32
+
dependencies = [
33
+
"aho-corasick",
34
+
"memchr",
35
+
"regex-automata",
36
+
"regex-syntax",
37
+
]
38
+
39
+
[[package]]
40
+
name = "regex-automata"
41
+
version = "0.4.9"
42
+
source = "registry+https://github.com/rust-lang/crates.io-index"
43
+
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
44
+
dependencies = [
45
+
"aho-corasick",
46
+
"memchr",
47
+
"regex-syntax",
48
+
]
49
+
50
+
[[package]]
51
+
name = "regex-syntax"
52
+
version = "0.8.5"
53
+
source = "registry+https://github.com/rust-lang/crates.io-index"
54
+
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
+7
2024/day_3/Cargo.toml
+7
2024/day_3/Cargo.toml
+6
2024/day_3/input.txt
+6
2024/day_3/input.txt
···
1
+
<;'mul(234,359)who()-who():where()}%what()(when()mul(260,344)}[$*{&from()?]>mul(87,298)what()&+)who()(!#!when()mul(407,173)who(952,771)how()@!?what()]#mul(763,519)'from()$when()%mul(258,409)<)mul(703,155)who()who()<!!mul(423,685)%<?what()how()!,mul(647,758){'mul(595,333)';mul(228,760)~what()@when()who(617,201){{mul(403,912)when()-}(^[^;mul(513,464)where()mul(154,341),$~#^/ mul(469,16)^mul(328,795) from()what()who()when()from()mul(547,469)how()}<?#(/mul(365,823)where();]^^@{(mul(211,19)from()?-+?;@how()where(921,941)mul(816,990)/#)<when():<:'mul(698,62)&~@)+^&$mul(485,158)why()<when(),how()>when()-^}mul(736,421)^<^@?]#;mul(817,275))do()from()how()@where()<@mul(909,873)]:don't()!}&%why(418,225)}-(#mul(212,255)%} ;!]mul(707,897)how()$mul(837,220)when()(,-:+mul(560,935)mul(932,628)when()$&[mul(860,85)&where(){;*:mul(189,383)#'mul(219,523)(who()mul(950,9)';/mul(388,844):~,mul(66,658)where()what()&$&mul(871,390):-mul(587,687)?what()mul(905,131)]what()/+don't()->when()];<select()-where()mul(926,945)'mul(180,934)!don't()mul(736,865)//%mul(662,142)^+>where()'mul(108,216)@?]:mul(222,569)from(961,743):$&-/when()*where()@mul(669,307)$&]who(719,188)>#how()< mul(902,394)when()-^:mul(949,576)@mul(193,521)mul(319,755)?where()mul(494,883)(,>@where(533,792)/mul(579,616)&+?how()~select()mul(840,737)why()-+select()/how(313,74)//where())mul(895,693)from()<don't()mul(984,889),)}who()mul(233,534): ^&~;/<mul(257,146)'( -#!from()]^mul(870,750);select()-how(155,90)why(315,964)mul(298,2)$,how()!@from() #what()#mul(977,312)$&{!who():+$:mul(544,624)from()/mul(404,459)$:?}(@<@what()mul(607,342)who()@how()who()]mul(182,480)'what():@%>*~#mul(410,170){*{where()~~why()}who()mul(796,85)'+&^-)mul(603,101)who()*who()when()@when()where()%/mul(925,329) who()[& ] mul(788,146):^mul(959,154)#{;select(),:^+(from()mul(763,850)/+?mul!,&'what()from())+mul(241,655)>'^/)>why()who();mul(431,988)$from()mul(289,336) &how()what()mul(225,551)when(465,383)&!?['&when() %do()* when()#mul(677,661)what()?mul(688,941),!what(),who()?(who()mul(954,807)!'why()mul(414,536)'who()mul(614,164)mul(941,169){>:mul(755,577)@;!'^@{+mul(640,716)from()from()!where()where(503,241)(&mul(155,305)>([when())select()who(),>,mul(624,695);,what()[]select()!where()who()$mul(100,414)]where()how()!^:who()do())mul(116,506){<%/mul(922,523);why()&mul(850,674)[>^<$;select()what() mul(671,568))why()~?**[*how()mul(920,910)^^-@what()mul(783,710) ]#who():who()mul(492,190):%<how()mul(432,182)[%?mul(758,818)%+!@~mul(241,233)^mul(557,142)^?where()what()why()mul(400,622)%)$mul(251,504){#>+&+(how()#mul(771,755)~mul(709,707)<$[<~}why()[what()[don't()%(^mul(987,332)-]%+]<}who()!mul(144,70)~;*<:mul(218,330);*}what()who()mul(334,779)[@select()where(631,792),)mul(508,632))%;!what()select())>mul(411,371)(?who()select()>?:mul(526,934)mul(804,300)
2
+
*+!#-select()where()mul(91,61)$'#&who()where()[,)who()mul(995,486)~(from()]mul(395what()[%from()'%mul(3,116)$-;>why()mul(80,100)don't()+<{mul(40,909){,from()-from()}*mul(5,637)~#don't()>{)#?~mul(710,464)mul(574,738)),'mul(529,787)])how()<who()?*/:#mul(989,869)]how(96,728)+?what()where()])mul(725>,':+<{}mul(805,948)#&!do()#>who()()mul(741,273)mul(183,374)@#{~from()+from()-#mul(155,454)^@#%+<[^{where()mul(24,698)^~!what()don't()^mul(807,271){*;#?&^;from()<mul(210,40):why()*^!$/@mul(392,727)!]:;[?>how()mul(95,214)>select()#~why(152,808)] do()mul(242,354){mul(118,780)<where()mul(237 what()/mul(943,660)mul(238,123)<+}#what()&+where()!mul(850,209):'*select()mul(832,641)mul(374,249) {*{>'@ )?mul(6,158)when()how())[#select()^+<mul(757,651),why()}(#!mul(113,873)-%!mul(157,958):don't()}where()where()why()?!mul(596,489)*from() &&mul(699,920)mul(528,834):^how()+$mul(766,867)*#do()&mul(548,545)(/,*$mul(65,784when(360,503)}from()mul(715,419)what()#/mul(629,49)# who():~mul(362,297)<<from()mul(355,704)>}[;how()[who(101,571)why()><mul(840,568)&,&from()don't()when()mul(706,400)}:'mul(745,820)from(){where()?/!~mul(520,697)*#when()mul(428,711)mul@how():who()*@%];mul(516,414)where()-how()]*;mul(669,963)~from()]select()how()(mul(723,742):,what();}& why(274,391)>mul(791,364)who(683,177);mul(590,613)from()when()why()*:mul(440,124)who(82,539)how()-*%' ,when()&mul(566,425)-;*//(how()<*don't()<%?!{%why()$>mul(37,637)(what()(]<':mul(591how()when()$>$:+#mul(919,784)>*}select()} mul(9,439)';{from()mul(774,58)!%':from()mul(382,161)/when()select(){>#%&mul(434,502)^&/(why()}when()why()from()mul(407,807)'<*{#mul(506,544)],+'[mul(288,577;}>+@who()(mul(684,3)>#mul(878,375){ mul(868,218)why(){mul(738from()+!who()&mul(226,71)from():-where(898,603)/$mul(429,484);}(&-,(]mul(373,23)+,mul)!who()where():;select()how()mul(619,655))mul(572,765)</-mul(422,415)select()how()/)how()mul(691,406);% [what()(from()mul(46,308)$where()'!mul(882,592)when()what(736,407)(why()?(< /-mul(42,917)mul(86,993)~~mul(243,489)*+:from()^who(777,604){[mul(54,523)}mul(675,809)}how();who()mul(52,681)${:who()mul(124,290>?;:&why();%(mul(662,820)from()when()+mul(451,488)* /mul(833,260)'mulwho()#]how()from()*@mul(796,371);{{@^<;~mul(82,742),who()[?:'what()do()@}-}mul(466,182),select()$}{^~how()^mul(263,924)?{??mul(979,300)/:*!mul(85,685)>mul(289,416why()?++$%}{mul(519,250)#&/mul(42,521)what()mul(665,935)where()>~<)who()[mul(457,738)-'$mul(459,702)$;~{;+mul(36,315)mul(881,516)*#$~from()why(967,755)mul(569,650when()>~!:*%&don't()}(^who() ~how()mul(84,748)how()mul(362,548)select()/:%mul(30,445%;;/(}who(971,849)<?^mul(688,9)when()mul(848,69),]mul(109,183)mul(764,444)[(]{[^(mul(505,559)%[mul(470,217)$@select()*why()$ mul(374,21)~what()[}who(); @}mul(387,945)how()),mul(990,737)where(),~*mul(947,938)[mul(603,229)#when()who()*select()mul(852,493)mul(537,342)mul(442,380]],$mul(122,335)
3
+
-mul(510,616)mul(235,612><#}who()+?(mul(367,39){};mul(435,762)from()&<?,~select()#where()mul(465,421)'where(608,591)+&when()mul(422,877)$)/#)?{why()(mul(184,55)(select()[&mul(92,651);when()#*[mul(527,555)mul(208,942)({)how()[select()[who()do(){*who()-/$@mul(427,566)where()!&[when() mul(512,215)[select()[where()$how()'where()mul(725,463);#select()don't(),-~+when()%mul(174,734&?mul(929,59)#<what()~$/(mul(184,5)%{}mul(121,138)?where()mul(840,231)}mul(13,563)}?what()why()*>mul(967,363)what()-select()how()!select(),what(){mul(678>what()what()where()mul(32,798)(where(994,20)mul(657,41)when()select(949,914))^mul(790,381)where()mul(854,543)mul(133,378)%how()select()/from()mul(629,798)}mul(371select()do();/where()#''mul(218,299)$^from() ' +why()mul(401,872)!/select()mul(824,807^[mul(992,848)from()%what()when()(-(,mul(453,186)how()who()mul(320,220)who() why()mul(445,909)^>mul(535,611)who()%what()<&mul(760,213){mul(842,923)}'what():when()%where()--do()when()where(732,868)when():why()'why()why(242,296)#from()mulwhen()}{-'>}!why()mul(820,582)~mul(661,206)({don't()select()+when()*:who(544,855)$from()mul(463,28'<](who()mul(851,538)}#]who()who():from()#%mul(320,395)!/when()~$#{+-mul(822,348){)((what()}$mul(396,562)mul(597,851)mul(164,858):!>]mul(421,774)+(mul(302,479)@$mul(393,48 /)}who()@why()+$(mul(94,468))#from()mul(97,244)'?>-how()mul(801,524)+*mul(798,793))!where()~?*mul(803,188) ~when()''mul(276,321(select()do()$&]what()why(224,253)>>$&~mul/*-@'?!mul(273,411)when()-@;why()[when()mul(911,533)!+^how():@from(177,840)@from(951,534)?mul(870,233)from():when()who()where()who()mul(199,165)mul(807,41)what()'~**:mul(487,78)}};mul(392,620)^{why()*<?-when(542,189)mul(531,837)how()]{?mul(798,614)mul(864,588)what(856,979)+~,}select()?&mul(659,85)>who()&(who()~when()#how()!mul(22,783)?select()[&why()select()^mul(671,865)mul(927,45)*#;;how()&mul(519,741)mul(656-what()select()?where()mul(214,386),why()how()mul(924,777)why()%^ &when()what(998,86) [do() -:?how(235,349)%mul(567,616)from()from()mul(665,710)-:*+select()when()[do()[$from()-$%mul(113,895)#-][&when()#where()><do()(!mul(797,837)select()mul(524,378){>%when()mul(914,804)'why(88,694)]]}mul(52,954))why()don't(){[[>@-mul(988,821){],?'how()%:mul(448,457)+ who()?who()mul(62,38)^&>#*?mul(464,719)mul(251,921)mul(82,764)}*#mul(150{+who()+mul(659,141)}select()>why()/mul(270,268)how():mul(523,786);how()+why(685,187)mul(607,577)?(:mul(510+&!&$why()mul(263,702)from(),<^mul(679,458))'/!&do()select()mul(174,946);! :''mul(876,163)%what()/mul(182,358)-+what()^mul(510,134)>select()*who()mul(538,210)from(),how(362,521)@>select()what()who()why()from()mul(525,17)what()(mul(367,947) ?+mul(602,880)^,select():[why()mul(782,143)}]mul(310,79)mul(693,386),mul+~where()];from()?>where()mul(749,859)select() +,^where()mul(611,689)where())!+!!,:mul(486,599)>how()><where()%when()why()>mul(409,246 mul(220,151){select()where()^mul(168,729)>mul(42,222) ;mul(460,16)/({why()}&mul(378,136){@})mul(713,841where()mul(622,542)who()^}#from()mul(975,695)mul?):]mul(65,736)]from()[(,&#who()from()mul(601,954'~*()<;$> mul(332,193)-~when()/[+,/,#!/usr/bin/perl;mul(507@[how()#'where()why()mul(607,129)@where()*'who()~&mul(48,672)
4
+
;[?-+(@when(618,593)@mul(463,743)@&when()&~;<&mul(78,96)^]mul(857,303);~/select(),mul(980,536)who();#$mul(223,620){ -(where()mul(960,194)+! [((who()@%mul(530,458)~[?'from()%){%mul(547,623)%(:from(622,543),mul(484,923)why()who()&)mul(261,937)what()#>where()from()[)'mul(342,883)who()$mul(630,484)what()mul(29,250)]'%}when()~!&>mul(995,972)when()mul(15,702)(~#[where()mul(965,454)/,who()mul(739,675)@%-how()-what()*'%mul(810,99)when();[ #mul(22,38)+don't()~[#who()/mul(17,38) why()mul(778,682)how()@?<when()<%mul(695,791)&+%?-where()>[#~mul(780,237)#what()'mul(338,796)$what(825,687),><</how()<]mul(593,291)-:mul(107,558)&from()select() ,how()*[how()mul(811,501)*~(}[{@/,$mul(588,893)--select() ,*mul(291,200)@mul(380,703);~why()how()where()?-how()[mul(746,5),~-mul(271,992)*$*when()mul(626,216)(how()!<how()' how()mul(648,45) {(,what()where(946,541)}#mul(144,262){-#)when()~^mul(515@where()$ +]mul(357,55)^[)mul(404,638){mul(917,462)why()mul(826,942)what()$;][who()what()how()mul(829,811)~what()~when()-)mul(288,652) /who()mul(326,472),))mul(86,683)$/select()/$}where()-)+mul(561,359) '<)mul(304,38)select()>/+@^mul(885,827)?[ why()^when(364,10)>&mul(852,590)^<when()why()why(),~mul(311,677)*mul(707,282)when()mul(19,241)mul~:>/how()%from(699,716)mul(680,396)[!%}select()when(463,111)~who()#mul(363,227why()@,mul(487,707)how()[{+/what()'[}[mul(975,629)>>++{[$mul(336,79):from()mul(707,55)#)select()*<who();mul(602,976)mul(949,866)what()when()mul(72,693)+/$*(from():where()'{mul(202,519)%'mul(773,650)&}[when(): #(&mul;+/!##?why()mul(369,77)from()}#(,]who()>]mul(992,868))where()mul(106,687): $!where()mul(744,983)how()!mul(313,790)(+))]select()*!>:mul(210,868)+;why(672,934)how()when()why()>%]/mul(108,885)&/{how()mul(159,898),()who(),when()?<#mul(188,958):from(636,533)+&<*[select()how()mul(152,658)who()*;mul(477,718)when(720,25)!who(){&mul(795,952)select(435,575);!/how()select()^select()mul(281,344)from()$<>*:!mul(830,180))(select()how():&mul(397,50)*mul(413,309)where()~,/,mul(796,87)*<~&!(&don't()select()( what(709,443) &who()']mul(445,518)^:mul(655,75){from()mul(377,846)where()mul(321,815)mulfrom()>mul(937,444)where()?}how()mul(112,471)what()>%when()where()who()<$mul(318,492)-what()mul(78,20)select()?mul(851,874)&!#;select():?'^*mul(598,757)mul(326,573){/[%,why();mul(445,682'(who()^+why()why()from()mul(816,284)*%&^'^)>mul(274,211)@*,'^(mul(592,927) ;!~&how()~mul(195,155)mul(896,831)what()()+#who()&*mul(708,134}^who()where()&[mul(138,384)+select()who();where()-?&[mul(767,907)*mul(436,412);[;)-{#(where()mul(987,536)don't()#?mul(616,255)+]:when()when()}#mul(41,533)#^>from()<how(290,301)mul(63,747)what()(+;^,#who()how():mul(249,969)select()+ mul(387,732):+{what()~:!select(67,813)mul(788}!;:*where()<mul(291,542)why()('^&where()]/how()&mul(605,763)-]-why(),@mul(556,282)how()'>!what()mul(151,867);/]select(),mul(754,334)&:mul(97,118)select()mul(593,702)
5
+
&*don't()]select()from()where()[mulwhen()^^/from()&mul(461,659)&mul(643[mul(572,503)mul(588,137){;mul(849,301)who()how()%;why()who()mul(233,687) why()*do()+who(),#how()( -mul(650,3)^+mul(14,551)who()^#? !<from()]mul(912,640)!?where()*%mul(328,45)/how();;where()(mul(843,155)who()what())?%what()what()@mul(923,667)) @how())+who()-mul(503,43)when(530,489)why()from()&select(617,173)what()mul(471,175>~>-mul(628,710)%;why()<('$&:when()mul;why(155,340):^+where()/[%@mul(931,55)%(~:why()from()mul(715,482)!{mul(766,239)how()mul(284,603)>where(897,837)mul(530,610),;-why()<select()/]!mul(389,108)'[~#mul(230,503)^)%~^how()^(&mul(216,268):mul(190,552$</who()!select()]do()}what()mul(144,685)%(don't()/[where(),>^}select()(mul(470,194)from()*,who()!mul(394,768):from()?{$ ;@~mul(571,519) what()[:mul(65,328)where()>~where()< :#mul(490,774)'why()>,@<mul(945,164)?,select()from()]mul(191,618);') #mul(984,94)^^mul(764,343)[!~?%why()-select()mul(802,97)#why()when()~,<?mul(817,989)![>mul(588who()}!-'mul(35,602)+ -%[' how()]:mul(502,722):why()!!mul(332,723)!{ ,[}{^who()don't()&@[when()>'mul(695,738)select()how()do()what(635,547)};>mul(50,148),,,mul(974,330)mul(973,477)+>mul/<how()why()])[+where()mul(727,316)&}#*];(~+do()>when()mul(74,42),how()who():,what(182,526)>mul(301,319)from()*how()#mul(808,632)don't()%- ~mul(671,835)who()}&mul(330,88)){+when()&who()<$who()where()mul(653,324))(select(){/!*select())<mul(933,167)/::?+~*how()mul(266,2):**!)what()mul(491,655)}?mul(949,984)~(,who()%mul(254,681)who()%from()-;from()?%{)do() [{mul(570,36)):^;{-who()<mul(820,352)/,>select()mul(800,74)mul(780>~where()[)/why():+mul(95,301)+#~-]^< mul(453,169))!)-who()}select()!/+mul(514,816)'>,)mul(188,237)'(*><<who()why())how()mul(738,289)what(639,365)$</]~'}what()when()mul(102,510)mul?!/%why()-why()who()where()how()don't()who()who()&',~%*where()mul(790,751)@;]mul(699,591)from(10,889)'from();~?%'mul(501,173)):mul(92,868)~>#@from()$&[mul(896,181)+why()[/}mul(292,818):what(933,189)when()where()+when(),how()mul(325,460)*!'?$}why()mul(868,19)]>do()]]'@-select()+?:,mul(705,664)why() :when(320,386):]where()mul(101,603)from()mul(584,674){*why()mul(527,341)mul(314,923),&*!#don't()from(),&: mul(610,911))(!when(12,857)how()&}/don't(){from(872,604)[]}}$when()from(393,26)mulwhy()why()from():;] }mul(618,762)who()>#' <-@why()#mul(342,769)#'-&<:from():>*mul(995,557)[':&when()&don't()%+}:who(699,463)}?mul(949,652):why()#'what()mul(466,912)how() ~where(){?mul(498,589)-:]}*(<?&mul(922,310)mul(469,882when()who()#{mul(553,266)!;&(%select()?#@how()mul(84,210)from()where():mul(7,362)~?{$~!:why()^mul(770,657)]%#mul(601,370)how()?#mul(81,96);who(){mul(519,362)what()} ##:~>mul(554,92)select();~how()&#mul(296,200)$why()why()don't()mul(718,92)[select()*?:where()mul(868,217)when()'what()]mul(608,255how():*~when()!:%{how(720,870)mul(857,876)+[how()select():[mul(926,987)why()]select()don't()%?,/&][]>^mul(20,520)mul(970,495); ?from(971,165)+@'{>mul(541,168)mul(697,290)/mul(724,20)/@/how()when()select()(]why()do()-(mul(250,857)}~<mul(670,830):mul(37,452)#%</who()@why()mul(258,824)'-^+#}how(683,511)from()who()mul(572,263))(mul(516,90)&# }where(161,891)$?>mul(612,107):>'}+{(@<mul(410,789)'@mul(41,356)
6
+
how()who()from()why()&+'what()+mul(948,970)how()^^ what()what()mul(124,952)#?why()']?when()mul(559where()$/<}#mul(683,315),{*mul(835,821)@%{who()?mul(528,442)#{/+!#>&?mul(264,859):'{;+]who()-mul(671,460)}how()when()[{mul(383,254) !mul(3,918)mul(874,303)!@mul(279,457)why()*>from()do()#/?<mul(522,927)what()[)what()~~how()when()}>mul(567,487)<what()?,][*}mul(390,810)![why()$who()mul(632,35):~ ',mul(741,335)[how()+>]*&don't()(who()}'mul(522,610)when()${{]#'mul(311,306);{^{ '[mul(270,712)@'}%why()#~:^what()do()>mul(6,137);from()-*%,;~<mul(123,497)mul(47,167>how();+ from()[?&how()]do()~who())& &;%why()why()mul(742,979)$}#,what(609,482)^mul(506,252) -:what(362,209) who()mul(399,346)%'&?mul(229,623)!)how()~mul(436,283)!)@how(){?mul(237,965) #>mul(594,38)^-mul(516,90)who(441,355)[+from()/how()mul~%[mul(434,408)where(690,778)when(978,434)>]?what()[mul(907,397)?@do()?@,select()who()-%(]where()mul(36,78)(:+when()select()mul(477,631)[#when()}mul(45,264@who()select()(mul(656,657)]select()how()[))from()mul(444,181)]!+select(36,597){*who()!/ mul(543,648)from()from()from()$when()+-} mul(293,90)who(183,746)mul(872,855how()[!>~from()*?'<mul(449,852)$:why()!+mul(71,240)?@#}:where()+from(){mul(191,72)@&^&({from()mul(981,127)?&how()[}mul(78,213)*&where()when()^what()@&%mul(149,819)@why()from(376,630) when()+don't()(><] mul(664,827)'-from()#*]mul(912,740)'from()when(473,160)mul(459,94);do()?:, ],{mul(322,110)}>where()}when()when()mul(443,449)where()#}~]mul(94,385)where()>do()<*:@##?what()'mul(63,18)[mul(414,464)>do()what(858,375)%}<'^!*mul(855,863)(mul(557,951)select()$what()+?%/ ]mul(805,186)^who()'mul(549,457)mul(604,658)select()!*~mul(508,395)where()+~]^mul(404,113)*)&$-'where()mul(428,314)$($(%$/,?where()mul(33,256)?mul(199,365)&select()when()>what(111,916)from()mul(588,754)(},@-+who()when()mul(828,506)&select(),select()who()#mul(689,772)$-&@+~what()mul(96,741)}?{-where()when(891,721)~do()*#<%who()^&;#how()mul(365,858)*$mul(903,693)who(385,109)what()'%}'mul(27,403)who()mul(874,113)( ,-@@mul(260,787)@why()*from()mul(679,437)?why()from()-what()mul(240,527):,from()>#[$do()}what()]mul(632,184)&)[?when()mul(70,409):[^-where(585,55)]%^mul(779,948)?$}from();[+?mul(964,869)-?^when() [ mul(729,356)how()({>]+ why()how(908,783)from()mul(774,617)!how()')*;]mul(484,579),#select()&why()mul(873,5)(/(@mul(573,802)what()<(<*mul(759,343)?mul(301,853)when()][) don't()?+from()mul(556,868)?$how()@>*when()<:$don't()/<^)/what()!mul(434,251)mul(882,866),mul(744,572)(why(112,504)$-how()mul(154,96)mul(201,94)$[:@&%-,>!mul(188,433)!*?mul(546,999)%&@>*/mul(310,391)-<+{]mul(938,579)+,@%[why()why(75,712)+from():mul(472,593)^mul(733,69)why())mul(961,406)~@$* )-from()mul(932,700): %!mul(382,321)!mul(297,196)where()mul(444,227)what()where())^#who()from()-mul(65,99)$:why()mul(652,486)mul(446,486)mul(970,630)$~]mul(510,304)]*:>how()/}$
+112
2024/day_3/src/main.rs
+112
2024/day_3/src/main.rs
···
1
+
#![feature(test)]
2
+
3
+
extern crate test;
4
+
5
+
use regex::Regex;
6
+
use std::fs;
7
+
8
+
enum Value {
9
+
Flip(bool),
10
+
Mult(usize, usize)
11
+
}
12
+
13
+
fn part_1(input: &Vec<Value>) -> usize {
14
+
let sum = input.iter().map(|v| {
15
+
match v {
16
+
Value::Flip(_) => {
17
+
0
18
+
},
19
+
Value::Mult(a, b) => {
20
+
a*b
21
+
},
22
+
}
23
+
}).sum();
24
+
25
+
println!("Part 1: {sum}");
26
+
27
+
sum
28
+
}
29
+
30
+
fn part_2(input: &Vec<Value>) -> usize {
31
+
let mut enable = true;
32
+
33
+
let mut sum: usize = 0;
34
+
for value in input.iter() {
35
+
match value {
36
+
Value::Flip(b) => {enable = *b},
37
+
Value::Mult(a, b) => {
38
+
if enable {
39
+
sum += a*b
40
+
}
41
+
},
42
+
}
43
+
}
44
+
45
+
println!("Part 2: {sum}");
46
+
47
+
sum
48
+
}
49
+
50
+
fn parse_input(input: &str) -> Option<Vec<Value>> {
51
+
let mul_regex = Regex::new(r"mul\((\d+)\,(\d+)\)|(do\(\))|(don\'t\(\))").unwrap();
52
+
53
+
let caps = mul_regex.captures_iter(input);
54
+
55
+
Some(
56
+
caps
57
+
.map(|cps: regex::Captures<'_>| {
58
+
let t = cps.get(0).map_or("", |m| m.as_str());
59
+
match t {
60
+
"do()" => Value::Flip(true),
61
+
"don't()" => Value::Flip(false),
62
+
_ => Value::Mult(
63
+
cps.get(1)
64
+
.map_or(0, |m|
65
+
m.as_str().parse::<usize>().unwrap()
66
+
),
67
+
cps.get(2)
68
+
.map_or(0, |m|
69
+
m.as_str().parse::<usize>().unwrap()
70
+
)
71
+
)
72
+
}
73
+
})
74
+
.collect::<Vec<Value>>()
75
+
)
76
+
}
77
+
78
+
fn main() {
79
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
80
+
81
+
let input = parse_input(file.as_str()).unwrap();
82
+
part_1(&input);
83
+
part_2(&input);
84
+
}
85
+
86
+
#[bench]
87
+
fn full(b: &mut test::Bencher) {
88
+
b.iter(|| main());
89
+
}
90
+
91
+
#[bench]
92
+
fn input_only(b: &mut test::Bencher) {
93
+
let input = fs::read_to_string("./input.txt").expect("Couldn't read file");
94
+
95
+
b.iter(|| parse_input(input.as_str()));
96
+
}
97
+
98
+
#[bench]
99
+
fn part_one(b: &mut test::Bencher) {
100
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
101
+
102
+
let input = parse_input(file.as_str()).unwrap();
103
+
b.iter(|| part_1(&input));
104
+
}
105
+
106
+
#[bench]
107
+
fn part_two(b: &mut test::Bencher) {
108
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
109
+
110
+
let input = parse_input(file.as_str()).unwrap();
111
+
b.iter(|| part_2(&input));
112
+
}
+1
2024/day_4/.gitignore
+1
2024/day_4/.gitignore
···
1
+
/target
+7
2024/day_4/Cargo.lock
+7
2024/day_4/Cargo.lock
+6
2024/day_4/Cargo.toml
+6
2024/day_4/Cargo.toml
+140
2024/day_4/input.txt
+140
2024/day_4/input.txt
···
1
+
XASXMAXXMSXXSMMSXMMSMXSMXMSSMSSSMMSMAMXMXSMMMMAXAMXSASXSSMMSSMXAMXMSAMXMMXAXXXSAMXXXXXMMXSXMXXSMASAMXMXAXXMASAMXXXMAMMMSXSXMXMMMSAASXSMSSMMS
2
+
XASAMSSMAMMMAMAAAMASMAMAAXMASAAASAAMAMAMAAAAASMSSSSMAXAAAXASASMMMMMMXMASXMAMXXXXSMSMSXSAAXAMXMASMXMMSMSAXSXMMSXSMMAAMXAMAAMMAAAAXMXSAAAAXAAM
3
+
MXSXMAAMXAAAXMMSSMAXMASXSSSSMMSMMSXSASMSMSSMMMAAAXXXXMMMMMXXAMMAAAASMMAAAXMASMXXXAAASAMMXSASASMMMAMXSASASASMAXXMAMSSSMSSMMAXSMMSXMMMMMMMXAMX
4
+
SAMMMSSMMXXSXXXAAMSMSASXAAXMXXAAXXXMAXAAAXXMASMMMMMMXMXXXXSMXMSSMSASASMMXMMXMAAMASMSMSMAASXSAAAASAXAMAMXAAXMASMSSMXAMMMAMXSAMAMAASXMMSSMSAMX
5
+
MASAAAAMSMMMMMMSMMMAMAXMMMMMXMSSMMXMSMMMMMAMXASAXAASXMMASAAXAXAXMXMXMXAASXMAMSXSAMMXMMMMMSAMXMSMSMSMMAMSMXMMASAMXAMMSASAMMXASAMSXMAMXAAXSAMA
6
+
SSMXMSMAAMAAXXAMXASMMSMAMXSXSAMXXMAAAAXSXSAMXMASMSXMASXAMSAMXMMMSASMXMXMMAMSMXAMASXMXAASXMMMMXMMXAAXXAMXXAAMAMAMXXXASXSASXMMSAMMASXMMMMMMMMS
7
+
XXXXMAMMMSSSMXSXSASXAXSXMASAMXSMXMASMSMSXMASXXMMXMXSAMMXMAXAMAXXSXSAASMASXMXAMXMMMAASMXXAMXMMAXMXMSMSAMSSMSMMSSSSMMMSXMXMASXSMMXAXAXSSSMXAAX
8
+
MMXSSXSMXAMAMAAAMSXMXMMXMASXMMSAMXXAAMXSASAMMXXSXMXMASXSSSMXSSMXXMXMMSAXMASMMMSMASAMXMASXSAMSSMSMAAAMAMAXAMAMAMXAXAXSAMXMXAXMMSMMSXMAAAMSAMX
9
+
AXMXMASMMASAMXSXMMXSAMAAMXMMMAXMMSMMXMASAMXSXMXMAAMAMSAMAAAMSAMMSXMXSXMXAXMASAMXAXMASXMAMMAMAAASMMMSSSMSSMXSAMXSMSMXXAMXSSMASAMAMMASMMMASMMM
10
+
XMAMSXSASASASMXXMAMMAASXSAAAMMXAAXXAMMMMSMSMXMAXMXMAMXAMSMMMSAMASAMXSAMMMMXMMAMMSXXAMAXXAMSMMSMMAXXXMAAAAMAMAXXAMXXSMSAXAAXAMMMAMSXMAXXMSASX
11
+
MSSMXASAMXSMMMAXASMSMMAXMAMSASXMAXMMSAXSASAAASMXMASMSSMMMAAXSAMMSAMAMAMMSAMSSSMSAMMSSSMSMXMAXXASXMMMMMMMSMASASXSXMASAXXMSSMMXMXMMMMSAMMXSAMX
12
+
MAMMMMMMMMMASAMMMXAAXXMASAAXASMMSXMAXMXSMSMSMSXAMMXXAMXASXMXXAMASAMSSXAAMAMAAMXMASAAAAAAXSSSMMAMASASXXXXMMXSASAXXAAMAMAXXMXSASASAMASAMXAMAMX
13
+
MASXAXAMXXSAMMAAXMSMMXMAMXXMMMAAMMMSXMMSXMXAAXXMSAMMSSMMSMMMMAMASAMAXMASXMMMSXAXXMMMSMMMAXAAXXSSMSASMMSAMXXMAMAMXSSMSMSMAMAXXSXSASXMSSMXSAMM
14
+
SXMXMSSSMMMASMSMSMAAMASXMMXSASMMXXAMXXASASMMXMAMAAXAMAMAXAASXMMXMMSMXXAXMSXMAXXSSSXAXAAXMMMMMMXAXMMMXAAMAMMMXMAMAMXAMAXAAMASAMASAMXMAMMXSASA
15
+
MMMXMXXAXAMAMMAAAMSMMAXAASASAXXXSMSSSMAMXMAMXXASXSMMSMMXSMMXAXSXMAXAMMMXXMAMSAMXAAMSSSMMXAAAAXSAMXXAASMXAASMASXMSSMAMAMMXSAAAMAMAMSMAXSAXAMM
16
+
SASASMXMMSXSXSMSMMXSMXXXMMASAXSXMAXAAMMMSSMMMXASXMXMAAXMXMMMXMSAMXSXSASMASAMMSSMMMMAAAXMSSSSMXXAMXMAXXXMSMSAAMAMAMAMMMMXXMMSSMMXAMXXAXMASXSM
17
+
MASMMAMSAMMMMAMMXSAMXSMSAMXMMMAAMAMXMAMAMAAAAMSMXSASMXMAAAXSAMXAMAAMSAMSAMXSAMMASAMXSSMMMAMMXXMSMMXMSSMMXAMMXSAMMSAAAAMXAAMAXASXSMSMMSMAMAAX
18
+
MMMMMSMMAMXAAMMAAMMXAMMAAAXAXSSXMAMXMAMASMMMXMAAXSASAMSSMSASASXMMMSXMAMXXMMMMXMAMAXAMXAXXSAAASAAAXXXAAMAMAMAAXAMXSASMXSASXMSSMMAMASAMSMMMSXM
19
+
SAAMAMAMAMSSSXMMXSSMSSSSSMSSXAAMSXSXSASASAMAMSMSMMMMXAAXAXMSAMASXSMMXSMSMSXSSSMMXMMXSSSMAXMXSXMMAMXMSXMASMMMXSAMAXAXMASMMMMASAMXMAMAMXAXAMXA
20
+
SSSMASXMMXMAMXMMAMXAAAAMMAAXAASMSXAAXAMASMMAXAMAAMSAMMMMSMMMXSAMXMAAMXAMAAXMAAXAAMMXMAMMAMMXXAXMAXSAAXSXSXXAASAMAMSMMMXXMXMMSMMSMXSXMSXMXMMS
21
+
XAMMAMAMXMMSMMSMAXMMMSMMSMMXMAMAXXMSMSMMMXXMMSSSSMMXMAAAMAXXMMMSXMMMSMAMSMMMSMMSXXASMAMMASMMMAMSSMASMXSAXXMMMXXXMXMXXAMMSASMMMAXMXMXAMXSAMXA
22
+
MMXMXSAMMXAXAXMSMSXXAAAAAMSMMXMAMXXAAMASMSXSAAXXAAMAMSSSSSMSXAAXMSMXAMXMAMAMXAMASXXMMMSMMMAMMSMMAMMAXAMAMSXSSMSSMMMASAXASMXAAMXSXAMXMAMXASMS
23
+
AXMSMSXXAMXSMMMMXAMMMSMMMSAASAMMMSSMSSXMAAAMXSMXSSMAMMAMMAASXMMSAAXSXSSSSSSMMAMASXAXXASXSSMXAMAXAMXAMMMSMMASXAAXAASAMXMMXXSSMMSMMXSAMSMSMMMA
24
+
SMAAAMASXMMSMMXMMMMXAAXASMMMMASXAAAXAXAMSMMMAAAXXAMXXMAMSMMMAXSMMMMMSAAAAAXAXSMMSMMMSAMAXXXMSSMSSSMMSAAXAMSMMMMXSMSASXXSXMMXAXMAAXXASMAAXASM
25
+
XMSMSMAMAAAMMSASAAAMSSSXSAMXSAMMMSSMMSMMAMAXSXSXSAMAXSAMXMMSSMXAAXASMMMMMSMMXMAXMASASAMSMMSAMXXMXAAASMSSMMASAAXAXASAMAMMASMXSMSMMSSMMMSMSMSX
26
+
MXXMAXASMMSSXMASMMMAMXMAMXMAMAMXAAXMMAAXMSAXMSMASMMSASAXSMAAXAMXMSXXSMXSAAMMAMAMXMMXSAMXMAXMASMSMMMMSMXAMAMXSMSXMAMXMXASMMSAAAMXAXXASAMXAASA
27
+
MMSXMMMXMAAXMMXMMMSSMMMAMSMSMSMMSSSSSSMMXSXSMAMAMXAXASMMSMMSSSMSMAXMXSAMXSASASXSSXMASMMSXMMSMMAMXSAXXMXMAXXMAXSAMAMMAMXXSAMXMMMMMSSMMAXSMMMS
28
+
MASMSASXMMMSSMAAAAMAAXSSMSAAAAXXAAMAAAMSXMASMXMASMMMMMAAMAMMXXMASMAMAMMSMXAMAMAAXXSASAXMASMASMMMASXXAXMSMSSSMAXMXSMSAXMAMXMSMSXXMAMASXMASAAX
29
+
MXXAXAXMXAAMASXXMSSSMMMMAXSMSMSAMXMMMMMSAMAMAMAMXXAASAMXXAMMSSSMSXAMAMXAAMXMSMMMMXMAMXMSXASAMXSMAMMSSMXAAMAAXAXSAMXSASMSMAXAAMSAXASMMASAMMSM
30
+
MAMSMSMSXMXSAMXASMMMAMAMMMMXXXAMXAMAMAXSAMASAMSSSSSSSMAMSMSAAAAAMXMSASXMSMSAXXXXMAMXXSMXSXMMSMSMSXMAMASMSMSMMSAMXSXMAMAMSSXMXMXXMAXXXAMASAXM
31
+
MASAAMAAXSAMXSSXMASMMMAMXAMAXMMMSMXAMSXSAMAXAMXAAAXMXMAXAMXMMMMMMSXXMAXMMMSASXSMSMMMMSAMAXMAAAXAAMMMXMXXAMXMAXXMASAMMMXMAXXMSSMMASXMMSSXMASX
32
+
MXSMMMMMXMASAXAMSAMAASMMSASXSAXAAAMSXMASMMSMSSMMMMMMXSSSXSMMSSMXXSAMXMSMAAMAMAXAAMSSMXAMMSASMSMSMAASMSMMSSSMMSAMXXAMXSSMAMXSASAMXXAXAAMAMAXA
33
+
XMXMAXXAXSAMMXSAMAMXMMAAXAAASMMSXSXXAMAMXXMAAAMSAMASMAXAMMMXAAMSAXSAMXSMMSSSMMMSMAAAMSMMXMAXAXAXMSMMAAAXMAXAXSXXAMSMMAAMMMXXAXMMAMSMMMSAMASM
34
+
MAASXXMMXMAXSXMXMASMMMMMMXMAMMAXXMAMSMXMAAMMMSXMASAXMMMMMAAMSSMSAXXXMXMAXAAMXAAMXMMSMAAASMMMSMAMAXAMSSSMMMMSMMMSMMXAMSXMASMMSMAMXSXXXXSXXAXX
35
+
AMXMSXAMMMSMXMSMSASAXAXXMMMMSMMSSMAMMMMSMSXAAMMSMMXSAAASXXXXAAXMMMSMMASAMMSMMMMXAMAMXMXMMAAAMMXMAMXMXAMXMXMAAAAXXASXMAMSXSAAAMAMXAXXSAMXMXSM
36
+
XXAAMSSMAAMXAAAAMXSMMSAMXAAXAAASASXMAAMAAAXMMSAXAAAXXMSSMAXMSSMSAMXASMSMSMMMSMMMSMAXAXSASXMSSXSMMSXSXMSAMSSSSMMXMXSAXXAMAMMSSSMMSMSMSXSASAAX
37
+
MSMSMAMXMSSSXSMSSMMXMMXMSSSSMSMSAMXSSXSMSMMXAMXSMMSXXXAXMSMMXMASMSSXMAXMAMAAAAMAXMMMAXMAMAAAMXMAXXMMAXSASMMMXMXSAAXMMMSMAMXAXAMMAAAASAAASXSM
38
+
XAAXMMSXMAXXAXMAMAMMMXMXAXMXAMXMAMXAMXSXXXSAMXMXMAMMAMMMXAMMAMAMXXXASXMSMSMXSXMXSAXMSMMASMMMSMSSMMMSXMSSMASMMAAMMSMMSAAMSSMASMMSMSMSMSMAMAXX
39
+
MMMMAAMMXSMMSMMASAMAAASMMSSMXMMMAMXAXXSASAMXMASASASAAMAAXMMSASMXSAMMMAAXMAMXMXSXMAMSAMSAXAXMAXAMSAMMAMXXSAMAMMXSAXXAMXXSAMAAMXAXAMMXXXXAMMMS
40
+
MASMMMMXAXMAMASASXSMSXSAMAMXMMMSSMSMMXMAMMMSSMSAMXSXMMXSSXASXSMMMMSSSMMXXAMASAMXMAMMAXMXSSMMSMMSMSXMAMMMMXSXMAMMMXMSXSXMMSSMMXSSXMASMSMMMXAX
41
+
MAXAMXSMAXMAMMAMXASAMXSXMAMSXSAAAMAAXAMXMXAAAMMXMMMAMSAMXMMMAXAXSAMMAXAMSSXSAMXASXSMXMXAXAAAAAXXAAMASXMAMXSXMASAMSAXASXAXAXAXXMXMMXMASASMMMS
42
+
MSSMMAMMMMSSSMASMMMAMXXASMMSAMMXSASMMMSSSMMSSMAXMASAMMXMXMMSMSMMMASXSMXXAMXXAMXXSASAASMSSSMMSMMMMMSAMASASMXASXXAXSAMAMSSMMSXMSSSMMAMSMAMAAXX
43
+
XAAXMASASMMAAXSMMSMSMMSMMSAMXMAMAAAAAASMXMMMAMASMMMMSAMXMAAAXAAXSAMAXAXMMMAMAMMSMAMSMMAXAXXMAMMAMXMASXSAAASAMMMSMMAMMMMXXXMASAAAXMASMMASXMMM
44
+
ASMMSXSXMAMSMMMAMXSAAMASMMMSXXAMMMMSMMSAASASXMASMASAXMASMMSXSXSMMXMSMSMMXMMSMMMXMAMXXMSMXMASMMXSMMSAMMMMMMMAMAXXASXMSAMXMMMXMMSMMMXXAXAXAMXM
45
+
MXXAXXMASMMXSASAMXSSXSASXAXMASXSXMMXXSMMMSASAMAMXAMXSSXXAAXASAMXSAMAXAASMXXAMAMASMSMSXXAMAMAAMAXAMSAMXAMXMSSMMSSMMMMSASMSASXSAMAMSMMSMSSMMAM
46
+
MSSMMXSASAASMMSSMAMAXMAXMMSXXMXAAMAAMXXAXMAMXMSSMXSAMXMSMMMAMAMXSASMSSSMAMSASASMXMAASAMSASXSAMAMAMMASMASMXAXAAXASAAXSAMXMMAMMXXAMASAXAMXXSAS
47
+
XAAAAAMXSMMSSXXMMXSXMASMSXMASMMSSMMSSMSSSSXSAXXMXAMXXAMASAMXMAMMSAMXMMAMSXXASAMXSMMMMAMXSMAXAMMSMMSAMMXMAMXSMSSMMSAMMMSXSAASXMSSMMMXSAMAASAS
48
+
MSSMMSSMXXAMAXMXXAXAMXXAXASMAAXAMMXAAAMAXAASMMSMXMMSSMSASMMMSMSAMMSXMSAMXMMXMXMXAAXAMXMXXXAMASAAAMMASXMMSAMXXAAAXMXSXAXMASXSXAMAAXXAXAMXMMAM
49
+
AXAXMXAXSMSSMSMMMMSMMMXXSAMSMMMSSSSSMMMMMMMMXAAXXAAAAAMXMAMAAMMXMAMAXXMXAMAXMASXSMMSSMMXSMSSXMXSMMMAMAAAMXXXASXMMMAMMSMMAMMMASMAMMMMSSMMXSAS
50
+
SMSMSXMMMAMXXSAMAAAXAMSAMXAXXMAMXMAAMXAXXSAMMSSMSMMSMMMXSAMMXSAMXAXMMSMSAMXAXXMAMAAMAAAXXAXMASAMMSMMSMMSSSMMMMSAAMAMAMAMASASAMXXMAXAAAAAXSAM
51
+
XAXASASAMSMMMSAMSSXSAMASXMAXXMAXSMSMMSMSXSASAMAMXXXAXAXXMAXMAMASXMSAAAXMMMXSMXMAMMMSSSMXMSMMMMXSAAAXXXXAAAXSAAMMSMMXXXAMAXAMXXMXSXXMSXMMXMAM
52
+
MAMAMSMXSAAAASAMAMAMMSMXXXMASMXSAAAXXMASXXXMMSXMSMMXSSSSSSSMMSXMAAAMMMSSSSMAAASASAXXAAXAXXMASMMMXSSMMMMMSMMSMXSXMMSAXXSMXMXXXAXAASXXAMMMASXM
53
+
MXMAMASXSXXMXSAMAMXMXAMMASMMSASAMSMSSSMXASXSAMXMASAMXAAAAAAMAMXSMMMSXXAAAASMSMSSSXSMMXSXMAXASXAXXMAMAXAXAAXXMASAMAMMSAXAMSAMMAMSAMXMMASMXMMM
54
+
MSSXSASXMAXSXSXMAMXXXAXSASAAMMMMMAXSAAMAMAAMAMXXAMMAMMMMMMMMAXXSAMAMXSXMSAMXXMXMMMXAMAMAMSMMSMSMAMSXMXSXXAMXXAMAMXAAMXMAAMASAXMMMSXASAMXAAAX
55
+
MXXXMAMAMAXSAMXSXXMXSSMMASMMXAMXSXMMSMMAXMSXMMSMSXSSXXAAXSASXSASXMXSAMXXMASMSMAXAAXMMAXAAAAXXAASMMAASAMASMXMMXSAMSMXSXMAMSAMMSSXMAXMMMSSSMMA
56
+
XMXMASMMMXMMAMXXAASXXXAMAMAMSMSMMAAMMXXXMXXAMXAAAASAMSMSSMAMAAMMXMMMXSMXSAMAXMASXSSSSSSMXSSMMSMAMMXAMAMMASAXXMXMAMXASASAXMASAXAMAMMXAMXAAASX
57
+
SAXASXAXMAASXMMMXMMAAXXMMXXMAXAAMXSMMSSSMASMMSMSMMMAMAMMMMAMAMXMAMSSXAAAMMMSMMAMAAAAAAAAAXAMAAMMXSAMSMMSAMMMSAMXSAMXMAMMXMMMXMXXAMXXMMSMSMMA
58
+
XXAXAMXMSSXMASAMASXMMMSAMSSMSSSXSAMAMXASMAMMASAXMASXMASMASASAXXSAAAMSMXMXSXMXMSSMMMMMMMMMXAASXSAAMAMXMAMAMAAMAMAMAAMMSMMASAAMSASXXSAXAXXAAXS
59
+
MMSSSMSXAXAMASASMMAMMXMAMAAAAAMXMXSAMMMMMSSMAMMMMXAXSAXMAMXSXMXAMMXXXMAXXAASXXXAMXMASXMASMMMMASAMSSMMMAXSAMXSMMSXSMSAXAMAAMMSAASAASXMAXXXMXM
60
+
SXAAAAAMSSMMAXMMMSAMMXSMMSSMMMMXSXSXMAXMXMAMMSMXMAMXMAMMMMXSAMXXXMXMASXSMMMMMSSMMXMASASMMASMMAMAMAMAAXASAXXXMASMAMSMASXMXSXXXMMMMMMXMASMAMAS
61
+
AMMSMXMAMAXMXMSAMMXMMAMMMMAMXXSMMASMSSSMASXMAMXAXSXMSXSAXSAMAMASMMMXAMXMXAMAAAAXAAMMSXMXSMMMMSXXMAMSMSSMMMSMSXMMAMAMMXMXAMXMMXXSXAXMAAAMAMAS
62
+
MXXXMAXMMAMXSXMASMSMMASAXSAMXAMAMAMMAAAXAMMMASMMXXAMAASAMMASAMAXAAAMSSMMXSSMMSMMSASASXMXSAMAAMXSMMXAMXAAXAXAXMAMSSMMMAMMSSMAAXXMAMXSMXXMXMXS
63
+
XXSASXSSMSSXMXSAMXAASASXXAMXXMSSMMSMMMMMMXASAMMMAMMMMXMMMSAMAMSSMMMSAAAASMXXMAXAAMMMMAMAXAXMMSXMASXMSSSMMXMAMAXMAMAAMXSAMAASMMSMXAAXMAXMAAAX
64
+
MMSASAAAAAXMSAMASXXMMAXMXMSASXAXAAMASXXMASMMMSSMMSSMMSAAAMASXMAAMMSMMXMMSXAXSSMMMXAAMMMAXSMSASAMAMAAXMAMSAMXSMXMAXMMSAMXSXMAAASXAMASXAAAXMMS
65
+
MAMXMMSMMMSAMXSAMAMSSSXSAAAMAMXSAMXASXXMASAAAAMAAAAAAXXMXSAMMSXMMXAAXSAMXMAMMXMAXMSSSSMMMMAMASAMASMMMXSASXSAXMASMXSAMASXMMMMMMMAMSAAMMSXSAXX
66
+
MXSXSXAXAMAXXXMAXAAXAAAAMSMMMSXMAAMXSXXMASXMMSSMMSMMMSMMMMASASAXXSXSMAMSSMMXSAMMXMAAMMASAMXMMMXMMXXMASMMMXMMMSMSAXXAMSXMAAXAXXSMMMXSXAAAMAMX
67
+
AMAXMXMSSSMSMMMSXSSMMMMMXAASXMASMMSXMMMSAMAAXXXXXMAXMAMAAXMMASAMXMMXMXMAXMAMXASAXXMXMMASMSMSMMXSMSSSSXXAMMXSAMMMXMSAMXASMMSXMXSXSXMAAMMSMMXX
68
+
MMMXSAXMAAAAAAMMAMXMXXSXSSSMASMMMAMAAAMMMSXMAMMAMSMMSSSSSSMMAMMMAAAAMAMXSMMSSMMMSSXAXMAXXMAAXXAASAAXMAXAMSAMXSXMXAMXMSAMXASXSMMMMXXMXXAMASMA
69
+
XAAAXMMMMMSMSSSMSMASMASXXXAXAMXAMAXMXMMAMAAMXAAMXSAAAXMXMAMMAXAXXMMAMSXXSAAXAXAMXMASXSMMMMSMSMXSMMSMMMMMAMXSAMAMMMSAMXSMMXXMAAAAMXSXMAXSSMAX
70
+
SMMSMXAAXMAXXXXAMXAMMAMXASXMSMSSSSSXSXSMSSXMASXSXSMMSXSMSAMSMMSAMXXSAMXASAMXMSXSAMXMAXAASXMAXXMMXSAMXASAAXASASASAAMASAMXMMMAXSMSAAMASMXMXASX
71
+
XAXMASXSMAMMSMMXMMSMMASXMMSMMAAAAAMAXMMMAXXMXXASAMXXMAMAMSMXMAXXMAMXASAMXAXXXAMMAMAMXMSASAMMMSSSSSXMMASMSMMMMAAMMSMASXSAAAAMXAMXMXXMAMAMXSMX
72
+
MAMMMMAAMXAXAAXAXAMASMAXMASMMMMSMMMMSASMMSSMAMSMSMAXMAMXAMMAMAMXXSAMXMXMXMMAMMMSAMXXXMMMSMMMXMAMAMMSMXMAMAXAAMXXXXMAMAMXSXSXMMMMMSMSASAXSAMX
73
+
MMSXMMSMMSASMSSSMASXMAAXMASMAMXXAXAAMXMAXAAXXMMAMSMSSXMMSXSAMASMMMXMXMASXXSMMSASASMSMXAAXXASXMAMAXAAMAMXXMSSXXAASMMAAAXXXAMMAMXAXAAMAMAXSASM
74
+
XMAAXAMAMXMSXAAXMXMAAMMSMSMMAMSSMMMSSMSXMXSMXMMMMAXAMXXAAAXMSASAAAAMAMXSMAMMAMASAMXAMSAMASXSASXSMSSMASXMXMAXAMXMMXSXSASAMAMXXASMSMSMSMSMSAMA
75
+
XAMMMAXAMAAMMMMMSXSMMMAXXAMMSMMAAMAMAXMAMAXAMXAAMXMSSMMMXSXXMMSMSMMXASAMMMMMASMMMMSSXXAXXMASAMMXMAXXXMASXMAXXSAMSAMXMASMSAMASXXMAAAXMXXAMXMX
76
+
MMSSXMSMMSMMASXMXASMSMXSMXXAXMXSMMAXSMSAMMXXAMXXSSMAAXMAAXMSMASAMASMMMASXMAXMXAXXXAXMXMXXXXMASAAMSSSMSXMMMMXASAXXAXXMXMXSXSMMMASMSMXSAMXMMAM
77
+
XAAMAXAMAAASASAXMXMASAXAAMMSSMAMASXMXAMASAAXSSXXAMMSMMMMXSAMMASASASASXMMASMSSSMMMMXMXXMASXMSXAAXMXAAASMAMASMAMMMMAMXSXMXMASAASAMXAAAAASAMXAM
78
+
MMMSXMAMSMMMASAMSMMXMXMMSMAAAMASAMXASMMAMMSMMAMMAMAMAAXAAMAMXAXXMASMMAAMMMAAAAXAXMASMMMAMXAAXMASXMMMMMAXMAMMMMSMASXMAXMASXMMMMASMMXMSAAXXMMS
79
+
XMXMAMXMXXMMXMAMAASAMXSXMMSSSMAMAXMMMSMXMMAAMAMSAMASAMXMSXMMMSMMMAMMSSMMSMMMMMXSASMMAAMMSMMMSXXMXMXMMMSXMAXSAAAAMXAXMMXASASXXSAMXMMXXXMSMSMS
80
+
MXAMSMAXMAMXSSXMSSMAMAAAMAAMXMSSMMSMAXSXXXSMMSXSXSXAXMAXXAASAMAAMMAAXXMAMMXMAXXMAXXSSMSMAAMSXMAMMXMSAAAXSAAMMMXXXXMMXSMMMAAAMMXMAXMAXMXAAAAX
81
+
SSMSMMSASAMXMAMMXMMSSMMSMSMMSXMAMAMMMMMMSMAAXXAMXMAXAASASXMMSSSMSSMXSMMASXSMMMSMAMMXMASMMSSMAMAMAAASMSSMMMSXSASMSMXMASAMMSMMMSMXMAMXXAXMSMSM
82
+
XASAMXMAAASXMSSSSMMXAAXAAXXMXASAMXMAAAMAAMSMMMAMMMMSSSMAAXMXXMAAAMMMMXMSAMXAAAAMMXMAMMMAMMMMSMAMSSXXMAAMXAAAMAMAAXXSASAMAAAXSAAASXSAASXMMXAA
83
+
SMMMSAMMMMAAXMAXAASXSMMMMMAMMAMXSXSSSSSSSXXXASAMAXXAXXMXMSMSSMMMMXASAAXAAASXMSMMXAMMSXMAMMAAMXAMXXMAMSMMMSSXMAMMMMXMMMAMSMSXSMXMSASAMMAASMSS
84
+
AXAASASAAMSMMMMSSMMAXAAXASAMXSMASAMXAMAAMASMMSASXSMMXSAAXAMAMXSASAMXASMSAMXXXXXSSMMMAMSMSMMMSMSMSASXMXAMAMXAMMSAAAMSXSAMMXXAMXSAMMMASXMMMAAM
85
+
MMMMXXMXXMASAXXAMAMSMSASMXSMMXAXMASMMMMMMAMXMXXMMXASASMSXSMSXMMASAXXXMAMXSMXSAXMASAMAXAMMMMSXAAAXAMMAMAMSSSXMAXXMXAAXMASXMMAMSAXMASAMXASMMMX
86
+
XMSMSSSMMSASMSMMSSMAAMMMXMAXAMMMSSXMXAMXASXMMSXMXSXMASAMAXAMXSMMMMMSSSMSAMXMMMMSAMXMMXMXAAMXMMMSMMAXMSSMXAXMXMSAMMMSAAAMAXMAMXMXSXXAMXMXAXAS
87
+
XSAAXAAAAMMMMXAXAASMSMSAASXMMMAMXMASXXSAAMAAASAMAMXMXMASXMAMAXAAAXXAAAAMMMAMAMXMASAMSASXSSSMAMMXAMAXMAAXMMMSAMAMXXMAMMAMAMSMMXXMMMSMMMMSSMAM
88
+
MSMSMSMMMSSMSMSMSXMXXAMSMSXAASMSMSAMXAMXXMXMAXAMSSSMXMXMASAMXSXMSSMMXMMMMMMMAMASXMAXAAMAMAMMAMXMAMAXMMSMASAMASMSAMSAMSXMXXAXMSSMAAAMMXAAXMAM
89
+
AMAMAXXXAAAMAAAAXXMSMMMMMSMSMSAAXMASMSMAMSMMXSAMXMAMMSMMMMMSMMMAMMMSAAAXSASXXMAMMXSXMSMAMAMMXSSXSMSXXXMMMMASAMXMAMSAMAASXSXMAAAMXSSSXMMSXSSS
90
+
MMAMXMMMMMSMMMMMMMMXAMXAASMMAMMMMMSMXMAMMAXAMXXMASAMMASAMMAMAAAXXSAMMMMXMASAMMSMMAXAMMMXSXSMSMMAMAMXMASAMSXMXSAMAMSAMSMXAMAMMSSMMMMAXMAMASMM
91
+
XSMSSSMMSAMXXXSSMMSSSMSMMSAMSMXSAMXMXMAMSSMMMAMSAXAMSASMXSASMMSMXMXXASMMSAMAMAXAMASXMAMXMMAXMAMAMAMXAMMXMXAAMSASAMSXMMAMSSMMAAMMAAXMAMMSXMAS
92
+
AXAMXXAAMAMSSXMAAAAXAAAXAMAMMMMMAMAMMMMMXXAAMAMMXXAMMAMMASAXXMAMXSSSMSAAMXMXMAXAMXSAMASAMSMMMAMXSXMMSSMASXMMMSAMMXMAMMAMAAXMMSSSSSSXSAASASAM
93
+
MMMMMSMMXAMXXASXMMXMMMMMXSMMMAASASASMSASASMMSASXSAMSMSMMXSAMSSMSAMXAMSMMSMMSMSSMSAMXSMSXMAMASASXAAAAAAMMMMSAMMAMXAXMASASMMMMSXAAAXAAMMXXAMMS
94
+
MAAAAAMMMSSMSXMXXXSMSAXXAAAASMMSASAMASASXAXASASAMSMAAAAXAMAMXAAMMSSSMSAAXAXSAXAAAMMMMAMMSXSAAMAMMMMMMSAMSASASXMAMMMSXSASMMMXAXMMSSMXMSSMAXMX
95
+
SSMSSSXSAAAAXMSAMXAXAASMMSSMSMMMMMMMMMAMMMSXSAMXMAMMMMXMMSAMXMMMAMAAASMMSSMMAMMMMXAMSMSASAMXXSAMXAMMMMASMASXMASMXSASMMAMAASMMXSAAAXSXAXMMMMM
96
+
MMAAXAAMMSMMMXSXAXMASMMMXAXXXXMAMAAMMMMMAXMAMMMXSSMSASAAMMASXMXMMSMMMMMAMAXMAXSSXMXXAAMXMXXSMMAMSASAAMSMMMMMMMMAAMAMXMSMSMSAXAMMXMMMMXXAMAAA
97
+
AMXMSMMMXAXAXAXXXAXAMAAXMASXMMSMSSSMXAMMSAMSMMMAMAASASMSMMMMAAXSMMXXAXMASMSSSSXXAMAMMSMSAMXMASAMXAXMMSXMAMXSASMMMMAMAAXAXMSAMXSAASMMAMSXSASX
98
+
XXAXAMXXSMMMMMSMSMMMSMMMMMMXMAAMMMAASAMAXXXAAAMXSMMMAMMMMASMMMMSAMASMXSASAAAXAMXAMAAMMMMAAAXMMAMMSMSMXMSMSAXAXSAMXXASAMXMASASAMMXMAMMXAAXAAM
99
+
MSMMMSXMXXMSAMAMAXMASXMAXAXXMSSSMMMMMAMMSMSSSMXASMSMXMAMSAXAAMAXAMMSMAMAMAMXMAASXSSSMAASXSMSXSSMAAAXMAMAAMMSMSAMXASXMXSASAMXMASMSSMMSMMMMXMA
100
+
MAXXAMMMAAXASXSSSMMASASMSMXSAAAAXSMXSXMXMAXMAMMASAAMXSAMMSSSMMSSXMXXMAMSMSMAAXAAAXMAXMMSXAMAMAXMSMMMMMMMMMXAXMAMXMMXMMXMASXMMXXAAMAXSAMXSAXM
101
+
SASMAMSMMSMXMMMAXXMAXMMAAASMMMSMMSMAXSMAMSMXAXMAMXAMAMXXAAMASAMAMSXSMMSAAAMMSSMMXMSAMMMMXXMASMMMMAAAXAXMASXMMSASAMXAXAMSAMSAXAMMMSSMSAMAXAMX
102
+
MASXMAAXAAMASMMAMXMSSMMMMMMAAMAXAMMMXMMASAMMAMMXSSSMXSAMMMSAMXMAMMAAASXMSMSMXMASMAMASMAMXXXAMMAAMMSMSXSAAXAAAXXXXMXAXSMSAAASMXSMAAAMSXMXSMSS
103
+
XMXAMSSSSMSASAMMXAAAAASMSMSMMSAMXSASASMMSAMSSMSSMAMMAXMXSXMXSAMMXMMMMMAMAAAMMXMSAMSAMMAMMSMSSSSXSAAXXAAMASMMMSSXSMSSXXASMXSXMAXMMSMMMMSXAAAX
104
+
MMMXMXAAMXMXXMSASMMMSMMAMAAXXMASXSASASAXMMMMAAXAMAMMMSMXSAMAXMASMMSAXXSMMSXMXSXXMAMXSSMSAAAXAAAMMMMSMXMMASAXMXMAMAAXAMAXAXXAMSMMXMXSAAXSMMMS
105
+
AXMASMMXMMSSMXXMAMXAAAMSMMMXXXAMXSXMAMMSAXSSMMMASXSXMSAAMAMXSXAAAASXSMXXXMAMSMSAMXAAXAMMXSMMMMXMASXSXMXSASMMSAMAMMMSXMSMMMXAMAAXAMASMSXMMAMA
106
+
XSMMXXMMMXAASAMXMMSSSMMAMXSAMSSXMSAMXMXMXMXXAMSXSAAAMXMASXMMMXAMMMMASMXMXMAMAAAMXSXMMXMAXMAASASMAXXXAXXMASMASAMXMAAMAMMAMASXMSMMXSAXMMAMXMXA
107
+
MSASMMXAXMSMMXMAXXAAMASXSAMAMAMMMSAMXSASAMXSXMMAMMMSXMXMAMAASASMXMMXMMAXASASMSMMAAAXXSMSSSMMSASMMXSSMMMMAMMMSAMSSMMSAMMXMMMAAAMAMMMXMSAMMSMX
108
+
ASAMXAXSSXMASMSSSMMSMAMAMMMAMASXAXXMASASASAXAMMXMSAMASXMAMXMAAXAAXSMMSSMXSASAMAMXSAMAAAMXXXAMAMAAAXXSASMAMXAMAMAAAASMSMSMSSMSMMMSAMAAXAMXAAM
109
+
XMAMMSMAAMSAMAAAAXXXMAMMMXSXSASMMSXSAMXMAMXMMMAAAMAXAMXMASMXMAMSXMSAMAAAMMXMMSAMAXAMXMXMASMMMSSMMMSASXSSXSAXSMMSSMMMXAMXAMAXMAMMSASXSMMSSMSX
110
+
MSAMAAMMMMMSSSMSMMMMSXSAMAAAMASAAAMMXSSSSXSXMAXMSSSMSSXMMSAASXMMMXSSMMMMSAAXAMMSMXXMAMXMMSAMXXAXAXMXMAXAMMMMXMMAMMXSSMSMMMMXMAMXMXMAAAXAAMAX
111
+
XSAMSXSAXSAAXAAXXSAAXASMSSSXMASMMSMXMAXAAAMASMSMAAMAMXMXMSMMXAAMXAMXSXAAXXMSMSMXMAMXASXMASMMMMMMMMMAMSMMMAMSAXMXXSAMMAXMXSXSXXXAXMMSSMMSSMAS
112
+
ASAMXXXASMMXSXMMASAMSAMXAMAXMASMAAASMMMMMMMAMAAMMMMAMMMSMMXXSSMAMMSAMSMSMMMXXAMAMAMSAMAMASXMAAXAXXXAXASMMAMMXXMXMMASMMXMASXSAXSMSAMAMAAXXMAS
113
+
MMXXXMSMMAAMMXXMAMAXMMMMSSMSMMSMMXAXAAAXAAMASXSMXSSSMSAXAXSAXASAAXMAXXMAMAMXSAXAXAMXAMXMASAMSXSAASMMSAMSMSMMSSXMASAMAXAMAXAMXMAAXAMXMSMMAMAS
114
+
XAXSMAAMMXMAAASMXSAMXSAMXAXSAMXMAXSSMSAMMXMMXAAAAAAXAMMSXMMMSAMMSAXMMXXAXMSAMMSSSSMSSMXSASMXAAMXMXAAMMMSMXAMXAASXMMSAAXMMSXSASMMMSXMAMASXMAS
115
+
MMSMASMXXAXMXMXAAXASASASXSMSAMAMMSMAXMASMSSSMSMMMSMMSMXXMAAAAXXAAAASASXSSMMASAAAAAAXMAXMASXMMMMAXMMMMXXMASXMMSMMAMMXMASMXAMMASMMMAASASAMXMAX
116
+
MXAXMAMXSMSAMXMMMSMMASAMXXAXAMXAMMXMMMMAAAAXMAMXXXXAAMXSAXASMSASMXMMASMMAMSAMXSMXMMMASXMAMMXAASXSXAXMXXMXMXSXAXSXMAAXMAMMXSMAMAAMMAMAMXMXMMM
117
+
SSSSXSXMAAAMAAMAXXAMAMMMMMAMSMSSSMASASASMMMMSMSSXAMSSSMMSXAAAXMAMAXMAMASAMXXMAXXXSSSMAMSXSAMSXMAMXMMSMASAXXXXMMMMSSSSMAMXSXMASMMSXAMXMAMAAAA
118
+
XAXMAMSAMXMSSXSAXXMMXSMMASAMAAAXAXMSASAXMSSMSXAMAMXMAMAAXMMMXMXXXMMMMAMXXMASMASXAMAAXMMMAMXXMAMXMMSAAAMSASXSMSAAAMAAXXASXMAMAAAXMMMMAMAMXXAS
119
+
MAMAASAMXSXAMAMXSMMAXAASASAXXMMXSMMMMMXMASAASMAXAMXXAMSMMAXAMSMSASMSMSXSAMXXMASXMMXMMXAMAXMXMAAXMAMMXSAMAMXSASMMSSMSMSMSAMAMSSMASXMSSSSSMSAA
120
+
MXASXSASAXMASMAMAAMMSSMMXSMMSASXAMSSSMSAXSMMMSASMXSMXXAASAMXSAAMAMAAAAXAMXSXMXSASXSSXSASAMXMSASMMSSMSXMMAMXMAMAXAAXMASAMXSMMAAAAAAAAXAAAAXAM
121
+
MXMMASAMXMAXAAAAXXMAAAMMMXMASAMSMMAAAAMSXMXXAMXXAASAMSSMMSMXMMSMSMXMMMSXMASMMAMAMAAXMMAMXAMXMSAAXMAMSAXSXSASASAMSSMSSXAXAAXMSMMMSMMMSMMMMXAX
122
+
XMMMMMMMAASAMSSSSMMMSXXXXXMXMAMMXMMSMMMMMMAMXSSMMMMAMMAMAAXXMXAXMASXXAAAMAMAMXMSMMMMXAAMXSAMXMXSMSSMSXMXMSMSAMMXXMAXMMMMMSSXXXMAXXXXAXMMSSMM
123
+
MAXSSXMSXSMMXMAAAXXXMMSMSMXXSAMXXMXMAXXAAMXSAAMMXXMSMMAMMSMMSMSMSMAMMMSXMSMSAMXXAXMSSMXSAMXMXSAMXMXAMMXAMMAMMMSXXMSMSMMAXAXAMXMMSMMXMMMAAAAX
124
+
ASMXSAAXMXMASMMSMMXMAXAAMSAXMXMASXMXMASMMSAMMSMMXSXXASMMXAXMAAAAAAAXAXMMMXAAMMMSMMSAMAMMXMAXAMMXXMMSMMSSSMAMAXXAXXAAXMASXXMSMXSAAAASMSMMSSSM
125
+
MXMMSMMSXSMAMSAXAMXMSSMMMXXSMAMAMAMSSMSAAMXMMMAMASMAMMAASAXMAXMSMSMSMXMAAMXMMAXAAXMAMSMAAMMMMSSMSMAAAXSAMXMMAMXMMSMSMMAXAMXAXAMSSSMMAAMAMAMA
126
+
ASAMXMASMMMSSMSSSSSMAAMSMMMAMAMAMAMMAXXMXMMMAXXMAMMAMAXMMASXSMAXAAAAASXSMSMSSXSMSXSXMAMSMSASAAAXXMSSSMMAMXXMMSAXMXXAAMXSAMXMMMMMXAMMXMMMMMMA
127
+
XSAMAMAXAXMMAAASAAAMSSMAAAAMSAXSXSMXMSMSAMSSMXAMXSMXMXSMXXMAMXAMSMSMSMAAXMAMXAXXMASMSXMAXMAMMSMSAMAAMASXMASXMSASXMMSSMMAMMAXAAAMSMMSMMMXASXS
128
+
ASAMXMAXSMMSMMMMMSMMMAXSSMMXMAXXAMSMXAMXASXAAASXAMASXMMAXMAMXAXAXMXXMMSMMMMMXXSSMMMXMXAMMMSMMAXSAMMSMXAMMAXMAMAMXAAAAAXXMSXMXXXXAMXAAXASXSAM
129
+
XSAMXMMMMAXSXSSXXAMAMXAMXAASMMSMAMASMASXMMXMMMXAMMAMAASMXXMMXSSSXMMXMAMXMSAMXXMAMSXMAMXAMMXASMXSAMXXMMMAMASXXMMMSMMSSSMMASXSASXMSAMMSMMXMMAM
130
+
MSAMMAMASXMXAAMXMSMMSMMSMSMSAAXMXMAMXAMXMAMXAXAMXMSSSMMMMSMMAMAMAAAAMXSAASASMXSAMMAMAASXSMSMMXMSXMXXAAXXSASMASMAMAMAMXAXAXAMASMAAMAMMXMAAMXM
131
+
ASMMAXSASAMMSMMSMASAAXXAAAASMMMSMMMSAMXAMASMMMMMXSAMXMAXAAAMXSMSXMSXXAMXMMXAAXAASAMXMXMAAASMSMMMAMASMMSXMAMMAMMAMMMSMMSMMSMMAMMSMXSXMASXMXAX
132
+
XXMASXMXSAMMAXAAXMASMSAMXMXMASXMAXAXAMSSXXXAMASAMXMXASMMSSSMAMXMMMAAMSAMXMSSSMMXMAMXSAMXMAMAXXASAMXXAAMAMAMMXSXMXSAMAAXMXSXAMXAXXAMMSMMAMSXM
133
+
AAXXAMMASXSSMMSSXSAAXMAXXXAAXMASAMSSSMAMMSSXMASAASXMXSAAAMAMSMAMAMMXMAAAXAAAXMXSSMMASASAMSMXMSXSMXSXMMMXMAMMMSAAXMASMMXSAMASXMASMXXMAMMAXMAM
134
+
SXMASAMASAMAAAAAAMSMSAMXSSMXSXXMAMMAMMXMAMAXMMSMMSAXMSMMMSXMAAMMSSXASXMMMMXSMMAAAAMMSAMXSXSAASAMMASMAAXXMXSAAXMMMMMMAMSMMSAMAMSXMAXSMXSMXMAA
135
+
XMAAAXMASMSSMMMMMMMXSAMXAXMASMSSSMMAMSMMSSMXXMXMXSAMAMXMASASMMXAAMXXMAAXXMAMAMXSSMMMMMMXMASMAMAMMASASMSMSASMSSXMASASAMAAAMASXMXAMSXMXXAMXSXM
136
+
MAMXXXSXSXMMXAMASXMASAMXMXSAXAMAAXMAMMMAMAXSMMMMMMSAMXAXMXXAXAMSSSSSSSMMAMAMSMMXMASAAAMAMXMMASAMMMSAXAXXMAMAAXMXMSASXSMMMSAMXSMMMXAMASASMMSM
137
+
ASMMSASAMMMMSXSASAXXXMAXXMMAMSMSMSSSMSMSXMMMAAXMAAAMMXMSMSMMMMMAAMAXAXMSASXSAMMASXMMSMSMSMXSASASXXMAMXMMMSMMMSSMMMXMAXXAXMASAXXXAMAMXSAMMAAX
138
+
MXAASAMAMAAXMXMASMMMSAMXMSSSMAMMAMAMASAMASMSSMSSMXMMSAAXAASAAMMMSMMMASXMASXAAXMASAXAMXAAMAXMMSAMXAMMMASAAXASAMXASXSMSMSMSSMMMMXMSSSMXMAMMSSX
139
+
XSMMMASMMSSXSAMXMAAMASXXMAAASXMMSMAMMMASAMXAASAXXXSASMMMSMSMSSXXAMXMXMASXMASMMMASXMASXMMMXSAAMAMSMAAAASMXSAMSSSMMASAAAAMMAXMAMXAXAAMAMAMXAXX
140
+
AXXXSXMAXXMXSSSMSSMSXMSSMMSMMMXXXAMXSMXMXMMSSMSMSAMXSAMXXXXMMMMAMXXXSSXMXSAMXXMXMXAXXMASXMSMMSMMSXSAMMSXMMMSXMAXMAMXMSMXSAMSXSXSMSMMXSASMASX
+136
2024/day_4/src/main.rs
+136
2024/day_4/src/main.rs
···
1
+
#![feature(test)]
2
+
3
+
extern crate test;
4
+
5
+
use std::fs;
6
+
7
+
fn get_char(grid: &Vec<Vec<char>>, (y, x): (usize, usize)) -> char {
8
+
let mut c = '.';
9
+
// println!("{x}, {y}");
10
+
if y < grid.len() && x < grid[y].len() {
11
+
c = grid[y][x];
12
+
}
13
+
14
+
c
15
+
}
16
+
17
+
fn check_surround(grid: &Vec<Vec<char>>, (x, y): (usize, usize)) -> usize {
18
+
let mut n = String::from("X");
19
+
let mut ne = String::from("X");
20
+
let mut e = String::from("X");
21
+
let mut se = String::from("X");
22
+
let mut s = String::from("X");
23
+
let mut sw = String::from("X");
24
+
let mut w = String::from("X");
25
+
let mut nw = String::from("X");
26
+
27
+
28
+
for diff in 1..4 {
29
+
n.push(get_char(grid, (y.checked_sub(diff).unwrap_or(grid.len()),x))); // y-, x
30
+
ne.push(get_char(grid, (y.checked_sub(diff).unwrap_or(grid.len()), x+diff))); // y-, x+
31
+
e.push(get_char(grid, (y,x+diff))); // y. x+
32
+
se.push(get_char(grid, (y+diff, x+diff))); // y+, x+
33
+
s.push(get_char(grid, (y+diff, x))); // y+, x
34
+
sw.push(get_char(grid, (y+diff, x.checked_sub(diff).unwrap_or(grid[y].len())))); // y+. x-
35
+
w.push(get_char(grid, (y, x.checked_sub(diff).unwrap_or(grid[y].len())))); // y, x-
36
+
nw.push(get_char(grid, (y.checked_sub(diff).unwrap_or(grid.len()), x.checked_sub(diff).unwrap_or(grid[y].len())))); // y-, x+
37
+
}
38
+
39
+
// println!("({x},{y}): {n}:{ne}:{e}:{se}:{s}:{sw}:{w}:{nw}");
40
+
let count = [n, ne, e, se, s, sw, w, nw].iter().filter(|s| **s == String::from("XMAS")).count();
41
+
42
+
count
43
+
}
44
+
45
+
fn check_middle(grid: &Vec<Vec<char>>, (x, y): (usize, usize)) -> bool {
46
+
let neg_y = y.checked_sub(1).unwrap_or(grid.len());
47
+
let neg_x = x.checked_sub(1).unwrap_or(grid[y].len());
48
+
49
+
let nesw = format!("{}A{}", get_char(grid, (neg_y, neg_x)), get_char(grid, (y+1, x+1)));
50
+
let nwse = format!("{}A{}", get_char(grid, (neg_y, x+1)), get_char(grid, (y+1, neg_x)));
51
+
52
+
let check = (nesw == "MAS" || nesw.chars().rev().collect::<String>() == "MAS") && (nwse == "MAS" || nwse.chars().rev().collect::<String>() == "MAS");
53
+
// println!("({x},{y}): {nesw} / {nwse} = {check}");
54
+
55
+
check
56
+
}
57
+
58
+
fn part_1(input: &Vec<Vec<char>>) -> usize {
59
+
let mut count: usize = 0;
60
+
61
+
for (y, line) in input.clone().iter().enumerate() {
62
+
for (x, letter) in line.iter().enumerate() {
63
+
if letter == &'X' {
64
+
count += check_surround(input, (x,y));
65
+
}
66
+
}
67
+
}
68
+
69
+
println!("Part 1: {count}");
70
+
71
+
count
72
+
}
73
+
74
+
fn part_2(input: &Vec<Vec<char>>) -> usize {
75
+
let mut count: usize = 0;
76
+
77
+
for (y, line) in input.clone().iter().enumerate() {
78
+
for (x, letter) in line.iter().enumerate() {
79
+
if letter == &'A' {
80
+
count += if check_middle(input, (x,y)) {1} else {0};
81
+
}
82
+
}
83
+
}
84
+
85
+
println!("Part 2: {count}");
86
+
87
+
count
88
+
}
89
+
90
+
fn parse_input(input: &str) -> Option<Vec<Vec<char>>> {
91
+
Some(input.lines().map(|l| l.chars().collect::<Vec<char>>()).collect::<Vec<Vec<char>>>())
92
+
}
93
+
94
+
fn main() {
95
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
96
+
97
+
let input = parse_input(file.as_str()).unwrap();
98
+
part_1(&input);
99
+
part_2(&input);
100
+
}
101
+
102
+
#[test]
103
+
fn test_main() {
104
+
let file = String::from("MMMSXXMASM\nMSAMXMSMSA\nAMXSXMAAMM\nMSAMASMSMX\nXMASAMXAMM\nXXAMMXXAMA\nSMSMSASXSS\nSAXAMASAAA\nMAMMMXMMMM\nMXMXAXMASX");
105
+
let input = parse_input(file.as_str()).unwrap();
106
+
part_1(&input);
107
+
part_2(&input);
108
+
}
109
+
110
+
#[bench]
111
+
fn full(b: &mut test::Bencher) {
112
+
b.iter(|| main());
113
+
}
114
+
115
+
#[bench]
116
+
fn input_only(b: &mut test::Bencher) {
117
+
let input = fs::read_to_string("./input.txt").expect("Couldn't read file");
118
+
119
+
b.iter(|| parse_input(input.as_str()));
120
+
}
121
+
122
+
#[bench]
123
+
fn part_one(b: &mut test::Bencher) {
124
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
125
+
126
+
let input = parse_input(file.as_str()).unwrap();
127
+
b.iter(|| part_1(&input));
128
+
}
129
+
130
+
#[bench]
131
+
fn part_two(b: &mut test::Bencher) {
132
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
133
+
134
+
let input = parse_input(file.as_str()).unwrap();
135
+
b.iter(|| part_2(&input));
136
+
}
+1
2024/day_5/.gitignore
+1
2024/day_5/.gitignore
···
1
+
/target
+7
2024/day_5/Cargo.lock
+7
2024/day_5/Cargo.lock
+6
2024/day_5/Cargo.toml
+6
2024/day_5/Cargo.toml
+1366
2024/day_5/input.txt
+1366
2024/day_5/input.txt
···
1
+
48|39
2
+
39|84
3
+
39|23
4
+
95|51
5
+
95|76
6
+
95|61
7
+
14|52
8
+
14|49
9
+
14|39
10
+
14|53
11
+
85|19
12
+
85|25
13
+
85|61
14
+
85|35
15
+
85|58
16
+
74|86
17
+
74|55
18
+
74|49
19
+
74|18
20
+
74|83
21
+
74|47
22
+
45|49
23
+
45|76
24
+
45|86
25
+
45|22
26
+
45|35
27
+
45|18
28
+
45|37
29
+
52|58
30
+
52|16
31
+
52|23
32
+
52|12
33
+
52|31
34
+
52|27
35
+
52|46
36
+
52|15
37
+
49|71
38
+
49|44
39
+
49|54
40
+
49|91
41
+
49|58
42
+
49|25
43
+
49|52
44
+
49|84
45
+
49|46
46
+
86|26
47
+
86|95
48
+
86|52
49
+
86|51
50
+
86|48
51
+
86|91
52
+
86|55
53
+
86|22
54
+
86|11
55
+
86|37
56
+
69|18
57
+
69|86
58
+
69|98
59
+
69|34
60
+
69|79
61
+
69|95
62
+
69|22
63
+
69|27
64
+
69|15
65
+
69|65
66
+
69|37
67
+
66|83
68
+
66|65
69
+
66|18
70
+
66|92
71
+
66|48
72
+
66|32
73
+
66|16
74
+
66|47
75
+
66|22
76
+
66|95
77
+
66|37
78
+
66|49
79
+
15|22
80
+
15|83
81
+
15|37
82
+
15|49
83
+
15|65
84
+
15|85
85
+
15|31
86
+
15|95
87
+
15|79
88
+
15|47
89
+
15|74
90
+
15|16
91
+
15|86
92
+
71|16
93
+
71|66
94
+
71|92
95
+
71|84
96
+
71|15
97
+
71|54
98
+
71|25
99
+
71|53
100
+
71|31
101
+
71|98
102
+
71|46
103
+
71|69
104
+
71|74
105
+
71|58
106
+
79|49
107
+
79|34
108
+
79|86
109
+
79|26
110
+
79|18
111
+
79|14
112
+
79|22
113
+
79|91
114
+
79|77
115
+
79|48
116
+
79|37
117
+
79|52
118
+
79|95
119
+
79|35
120
+
79|74
121
+
76|39
122
+
76|84
123
+
76|94
124
+
76|77
125
+
76|12
126
+
76|24
127
+
76|46
128
+
76|69
129
+
76|15
130
+
76|53
131
+
76|23
132
+
76|19
133
+
76|52
134
+
76|11
135
+
76|66
136
+
76|25
137
+
19|94
138
+
19|79
139
+
19|71
140
+
19|92
141
+
19|66
142
+
19|16
143
+
19|53
144
+
19|45
145
+
19|69
146
+
19|31
147
+
19|24
148
+
19|25
149
+
19|12
150
+
19|54
151
+
19|84
152
+
19|58
153
+
19|98
154
+
11|25
155
+
11|27
156
+
11|84
157
+
11|12
158
+
11|24
159
+
11|66
160
+
11|19
161
+
11|51
162
+
11|69
163
+
11|16
164
+
11|53
165
+
11|94
166
+
11|58
167
+
11|44
168
+
11|23
169
+
11|39
170
+
11|35
171
+
11|52
172
+
92|37
173
+
92|91
174
+
92|31
175
+
92|48
176
+
92|76
177
+
92|14
178
+
92|34
179
+
92|55
180
+
92|32
181
+
92|85
182
+
92|86
183
+
92|98
184
+
92|83
185
+
92|49
186
+
92|18
187
+
92|26
188
+
92|95
189
+
92|11
190
+
92|74
191
+
23|16
192
+
23|18
193
+
23|86
194
+
23|74
195
+
23|92
196
+
23|66
197
+
23|79
198
+
23|55
199
+
23|45
200
+
23|47
201
+
23|26
202
+
23|37
203
+
23|15
204
+
23|24
205
+
23|12
206
+
23|98
207
+
23|34
208
+
23|48
209
+
23|65
210
+
23|27
211
+
37|51
212
+
37|61
213
+
37|26
214
+
37|47
215
+
37|49
216
+
37|84
217
+
37|52
218
+
37|34
219
+
37|55
220
+
37|39
221
+
37|14
222
+
37|19
223
+
37|77
224
+
37|35
225
+
37|58
226
+
37|91
227
+
37|83
228
+
37|76
229
+
37|85
230
+
37|11
231
+
37|32
232
+
55|44
233
+
55|19
234
+
55|52
235
+
55|39
236
+
55|84
237
+
55|54
238
+
55|32
239
+
55|47
240
+
55|71
241
+
55|51
242
+
55|83
243
+
55|35
244
+
55|91
245
+
55|85
246
+
55|76
247
+
55|11
248
+
55|58
249
+
55|61
250
+
55|53
251
+
55|49
252
+
55|25
253
+
55|77
254
+
27|48
255
+
27|18
256
+
27|65
257
+
27|34
258
+
27|74
259
+
27|37
260
+
27|47
261
+
27|98
262
+
27|55
263
+
27|83
264
+
27|79
265
+
27|16
266
+
27|86
267
+
27|85
268
+
27|45
269
+
27|66
270
+
27|22
271
+
27|49
272
+
27|15
273
+
27|26
274
+
27|14
275
+
27|92
276
+
27|95
277
+
51|16
278
+
51|84
279
+
51|54
280
+
51|77
281
+
51|27
282
+
51|94
283
+
51|66
284
+
51|23
285
+
51|19
286
+
51|25
287
+
51|71
288
+
51|65
289
+
51|15
290
+
51|52
291
+
51|39
292
+
51|44
293
+
51|46
294
+
51|24
295
+
51|12
296
+
51|31
297
+
51|92
298
+
51|69
299
+
51|58
300
+
51|53
301
+
83|32
302
+
83|52
303
+
83|35
304
+
83|76
305
+
83|94
306
+
83|44
307
+
83|84
308
+
83|14
309
+
83|71
310
+
83|77
311
+
83|61
312
+
83|12
313
+
83|85
314
+
83|23
315
+
83|39
316
+
83|51
317
+
83|19
318
+
83|54
319
+
83|25
320
+
83|49
321
+
83|11
322
+
83|53
323
+
83|58
324
+
83|91
325
+
94|66
326
+
94|15
327
+
94|74
328
+
94|12
329
+
94|55
330
+
94|86
331
+
94|16
332
+
94|69
333
+
94|26
334
+
94|45
335
+
94|34
336
+
94|65
337
+
94|98
338
+
94|18
339
+
94|23
340
+
94|48
341
+
94|46
342
+
94|92
343
+
94|37
344
+
94|31
345
+
94|22
346
+
94|27
347
+
94|24
348
+
94|79
349
+
54|15
350
+
54|26
351
+
54|92
352
+
54|46
353
+
54|69
354
+
54|22
355
+
54|23
356
+
54|66
357
+
54|24
358
+
54|74
359
+
54|31
360
+
54|37
361
+
54|16
362
+
54|48
363
+
54|34
364
+
54|94
365
+
54|65
366
+
54|79
367
+
54|45
368
+
54|18
369
+
54|12
370
+
54|27
371
+
54|86
372
+
54|98
373
+
58|23
374
+
58|31
375
+
58|48
376
+
58|25
377
+
58|79
378
+
58|65
379
+
58|15
380
+
58|24
381
+
58|16
382
+
58|54
383
+
58|86
384
+
58|22
385
+
58|94
386
+
58|46
387
+
58|27
388
+
58|12
389
+
58|45
390
+
58|69
391
+
58|92
392
+
58|74
393
+
58|66
394
+
58|44
395
+
58|98
396
+
58|18
397
+
61|65
398
+
61|46
399
+
61|54
400
+
61|19
401
+
61|77
402
+
61|52
403
+
61|39
404
+
61|25
405
+
61|66
406
+
61|12
407
+
61|24
408
+
61|94
409
+
61|44
410
+
61|51
411
+
61|27
412
+
61|15
413
+
61|69
414
+
61|71
415
+
61|23
416
+
61|84
417
+
61|58
418
+
61|92
419
+
61|16
420
+
61|53
421
+
77|53
422
+
77|84
423
+
77|24
424
+
77|58
425
+
77|65
426
+
77|12
427
+
77|31
428
+
77|92
429
+
77|46
430
+
77|23
431
+
77|66
432
+
77|27
433
+
77|25
434
+
77|39
435
+
77|19
436
+
77|71
437
+
77|16
438
+
77|45
439
+
77|52
440
+
77|94
441
+
77|69
442
+
77|44
443
+
77|54
444
+
77|15
445
+
32|35
446
+
32|61
447
+
32|51
448
+
32|71
449
+
32|91
450
+
32|53
451
+
32|46
452
+
32|39
453
+
32|52
454
+
32|11
455
+
32|23
456
+
32|77
457
+
32|76
458
+
32|12
459
+
32|27
460
+
32|54
461
+
32|94
462
+
32|19
463
+
32|58
464
+
32|44
465
+
32|25
466
+
32|24
467
+
32|69
468
+
32|84
469
+
31|85
470
+
31|79
471
+
31|35
472
+
31|91
473
+
31|86
474
+
31|18
475
+
31|76
476
+
31|98
477
+
31|55
478
+
31|45
479
+
31|95
480
+
31|11
481
+
31|49
482
+
31|22
483
+
31|14
484
+
31|74
485
+
31|34
486
+
31|32
487
+
31|26
488
+
31|48
489
+
31|83
490
+
31|61
491
+
31|37
492
+
31|47
493
+
34|26
494
+
34|77
495
+
34|85
496
+
34|47
497
+
34|61
498
+
34|52
499
+
34|19
500
+
34|11
501
+
34|58
502
+
34|91
503
+
34|35
504
+
34|95
505
+
34|39
506
+
34|25
507
+
34|14
508
+
34|53
509
+
34|71
510
+
34|84
511
+
34|76
512
+
34|51
513
+
34|83
514
+
34|55
515
+
34|49
516
+
34|32
517
+
46|22
518
+
46|26
519
+
46|98
520
+
46|27
521
+
46|45
522
+
46|15
523
+
46|83
524
+
46|86
525
+
46|24
526
+
46|18
527
+
46|65
528
+
46|79
529
+
46|34
530
+
46|16
531
+
46|55
532
+
46|74
533
+
46|95
534
+
46|66
535
+
46|92
536
+
46|37
537
+
46|47
538
+
46|48
539
+
46|69
540
+
46|31
541
+
26|53
542
+
26|95
543
+
26|35
544
+
26|47
545
+
26|19
546
+
26|76
547
+
26|83
548
+
26|55
549
+
26|11
550
+
26|51
551
+
26|77
552
+
26|52
553
+
26|39
554
+
26|71
555
+
26|91
556
+
26|44
557
+
26|32
558
+
26|84
559
+
26|85
560
+
26|14
561
+
26|49
562
+
26|61
563
+
26|25
564
+
26|58
565
+
91|24
566
+
91|23
567
+
91|94
568
+
91|69
569
+
91|46
570
+
91|27
571
+
91|76
572
+
91|58
573
+
91|53
574
+
91|11
575
+
91|19
576
+
91|39
577
+
91|52
578
+
91|61
579
+
91|84
580
+
91|51
581
+
91|25
582
+
91|54
583
+
91|77
584
+
91|35
585
+
91|44
586
+
91|12
587
+
91|15
588
+
91|71
589
+
53|48
590
+
53|69
591
+
53|44
592
+
53|94
593
+
53|92
594
+
53|66
595
+
53|79
596
+
53|98
597
+
53|31
598
+
53|27
599
+
53|45
600
+
53|15
601
+
53|16
602
+
53|22
603
+
53|12
604
+
53|86
605
+
53|54
606
+
53|24
607
+
53|58
608
+
53|23
609
+
53|74
610
+
53|46
611
+
53|65
612
+
53|25
613
+
12|74
614
+
12|16
615
+
12|65
616
+
12|66
617
+
12|95
618
+
12|31
619
+
12|34
620
+
12|37
621
+
12|47
622
+
12|24
623
+
12|98
624
+
12|92
625
+
12|15
626
+
12|22
627
+
12|69
628
+
12|86
629
+
12|27
630
+
12|46
631
+
12|55
632
+
12|26
633
+
12|45
634
+
12|18
635
+
12|79
636
+
12|48
637
+
24|34
638
+
24|15
639
+
24|26
640
+
24|27
641
+
24|95
642
+
24|55
643
+
24|37
644
+
24|14
645
+
24|74
646
+
24|48
647
+
24|31
648
+
24|66
649
+
24|45
650
+
24|98
651
+
24|18
652
+
24|86
653
+
24|92
654
+
24|16
655
+
24|65
656
+
24|47
657
+
24|83
658
+
24|79
659
+
24|22
660
+
24|85
661
+
84|54
662
+
84|98
663
+
84|53
664
+
84|46
665
+
84|58
666
+
84|23
667
+
84|22
668
+
84|12
669
+
84|16
670
+
84|94
671
+
84|45
672
+
84|66
673
+
84|65
674
+
84|31
675
+
84|86
676
+
84|79
677
+
84|25
678
+
84|24
679
+
84|69
680
+
84|15
681
+
84|74
682
+
84|27
683
+
84|92
684
+
84|44
685
+
18|53
686
+
18|35
687
+
18|55
688
+
18|77
689
+
18|85
690
+
18|37
691
+
18|83
692
+
18|26
693
+
18|52
694
+
18|14
695
+
18|39
696
+
18|51
697
+
18|19
698
+
18|71
699
+
18|11
700
+
18|84
701
+
18|91
702
+
18|49
703
+
18|32
704
+
18|34
705
+
18|76
706
+
18|95
707
+
18|61
708
+
18|47
709
+
25|65
710
+
25|12
711
+
25|94
712
+
25|37
713
+
25|45
714
+
25|24
715
+
25|92
716
+
25|66
717
+
25|79
718
+
25|74
719
+
25|22
720
+
25|86
721
+
25|98
722
+
25|18
723
+
25|44
724
+
25|48
725
+
25|23
726
+
25|27
727
+
25|16
728
+
25|69
729
+
25|31
730
+
25|46
731
+
25|54
732
+
25|15
733
+
98|83
734
+
98|11
735
+
98|22
736
+
98|49
737
+
98|37
738
+
98|61
739
+
98|85
740
+
98|79
741
+
98|95
742
+
98|32
743
+
98|35
744
+
98|34
745
+
98|48
746
+
98|76
747
+
98|77
748
+
98|91
749
+
98|47
750
+
98|74
751
+
98|86
752
+
98|26
753
+
98|51
754
+
98|14
755
+
98|18
756
+
98|55
757
+
22|76
758
+
22|61
759
+
22|47
760
+
22|35
761
+
22|85
762
+
22|77
763
+
22|51
764
+
22|95
765
+
22|26
766
+
22|14
767
+
22|37
768
+
22|71
769
+
22|83
770
+
22|32
771
+
22|55
772
+
22|39
773
+
22|52
774
+
22|49
775
+
22|91
776
+
22|19
777
+
22|18
778
+
22|34
779
+
22|11
780
+
22|48
781
+
47|95
782
+
47|11
783
+
47|14
784
+
47|51
785
+
47|49
786
+
47|54
787
+
47|39
788
+
47|94
789
+
47|85
790
+
47|44
791
+
47|61
792
+
47|71
793
+
47|58
794
+
47|83
795
+
47|19
796
+
47|32
797
+
47|77
798
+
47|25
799
+
47|84
800
+
47|53
801
+
47|76
802
+
47|52
803
+
47|35
804
+
47|91
805
+
35|54
806
+
35|27
807
+
35|77
808
+
35|84
809
+
35|71
810
+
35|46
811
+
35|12
812
+
35|16
813
+
35|51
814
+
35|39
815
+
35|52
816
+
35|61
817
+
35|15
818
+
35|92
819
+
35|94
820
+
35|53
821
+
35|66
822
+
35|58
823
+
35|44
824
+
35|19
825
+
35|25
826
+
35|24
827
+
35|23
828
+
35|69
829
+
65|45
830
+
65|86
831
+
65|95
832
+
65|83
833
+
65|31
834
+
65|11
835
+
65|35
836
+
65|34
837
+
65|18
838
+
65|74
839
+
65|32
840
+
65|91
841
+
65|26
842
+
65|22
843
+
65|49
844
+
65|37
845
+
65|14
846
+
65|79
847
+
65|55
848
+
65|85
849
+
65|76
850
+
65|47
851
+
65|98
852
+
65|48
853
+
44|74
854
+
44|16
855
+
44|86
856
+
44|27
857
+
44|48
858
+
44|24
859
+
44|94
860
+
44|15
861
+
44|65
862
+
44|69
863
+
44|66
864
+
44|12
865
+
44|22
866
+
44|34
867
+
44|23
868
+
44|79
869
+
44|92
870
+
44|98
871
+
44|31
872
+
44|37
873
+
44|18
874
+
44|54
875
+
44|45
876
+
44|46
877
+
16|18
878
+
16|55
879
+
16|92
880
+
16|22
881
+
16|79
882
+
16|98
883
+
16|26
884
+
16|74
885
+
16|45
886
+
16|86
887
+
16|76
888
+
16|31
889
+
16|47
890
+
16|32
891
+
16|83
892
+
16|91
893
+
16|48
894
+
16|49
895
+
16|85
896
+
16|34
897
+
16|65
898
+
16|14
899
+
16|95
900
+
16|37
901
+
48|71
902
+
48|61
903
+
48|52
904
+
48|95
905
+
48|76
906
+
48|37
907
+
48|91
908
+
48|51
909
+
48|77
910
+
48|84
911
+
48|34
912
+
48|49
913
+
48|18
914
+
48|83
915
+
48|11
916
+
48|47
917
+
48|26
918
+
48|35
919
+
48|32
920
+
48|55
921
+
48|14
922
+
48|85
923
+
48|19
924
+
39|15
925
+
39|65
926
+
39|79
927
+
39|19
928
+
39|69
929
+
39|53
930
+
39|44
931
+
39|31
932
+
39|45
933
+
39|54
934
+
39|46
935
+
39|92
936
+
39|98
937
+
39|16
938
+
39|24
939
+
39|58
940
+
39|94
941
+
39|25
942
+
39|71
943
+
39|66
944
+
39|12
945
+
39|27
946
+
95|58
947
+
95|11
948
+
95|39
949
+
95|44
950
+
95|19
951
+
95|94
952
+
95|35
953
+
95|83
954
+
95|71
955
+
95|91
956
+
95|54
957
+
95|77
958
+
95|53
959
+
95|52
960
+
95|14
961
+
95|84
962
+
95|49
963
+
95|85
964
+
95|32
965
+
95|23
966
+
95|25
967
+
14|35
968
+
14|76
969
+
14|94
970
+
14|25
971
+
14|46
972
+
14|58
973
+
14|84
974
+
14|23
975
+
14|11
976
+
14|71
977
+
14|12
978
+
14|77
979
+
14|32
980
+
14|19
981
+
14|61
982
+
14|44
983
+
14|54
984
+
14|85
985
+
14|91
986
+
14|51
987
+
85|53
988
+
85|49
989
+
85|76
990
+
85|71
991
+
85|44
992
+
85|94
993
+
85|11
994
+
85|12
995
+
85|39
996
+
85|91
997
+
85|77
998
+
85|52
999
+
85|54
1000
+
85|69
1001
+
85|46
1002
+
85|23
1003
+
85|51
1004
+
85|84
1005
+
85|32
1006
+
74|61
1007
+
74|95
1008
+
74|26
1009
+
74|91
1010
+
74|48
1011
+
74|14
1012
+
74|37
1013
+
74|52
1014
+
74|34
1015
+
74|39
1016
+
74|32
1017
+
74|77
1018
+
74|22
1019
+
74|51
1020
+
74|76
1021
+
74|35
1022
+
74|11
1023
+
74|85
1024
+
45|83
1025
+
45|91
1026
+
45|11
1027
+
45|51
1028
+
45|79
1029
+
45|34
1030
+
45|47
1031
+
45|98
1032
+
45|55
1033
+
45|14
1034
+
45|74
1035
+
45|48
1036
+
45|26
1037
+
45|61
1038
+
45|32
1039
+
45|85
1040
+
45|95
1041
+
52|19
1042
+
52|98
1043
+
52|54
1044
+
52|71
1045
+
52|45
1046
+
52|25
1047
+
52|65
1048
+
52|92
1049
+
52|53
1050
+
52|66
1051
+
52|39
1052
+
52|84
1053
+
52|94
1054
+
52|69
1055
+
52|24
1056
+
52|44
1057
+
49|23
1058
+
49|11
1059
+
49|39
1060
+
49|51
1061
+
49|53
1062
+
49|35
1063
+
49|61
1064
+
49|24
1065
+
49|19
1066
+
49|94
1067
+
49|12
1068
+
49|77
1069
+
49|32
1070
+
49|69
1071
+
49|76
1072
+
86|49
1073
+
86|14
1074
+
86|83
1075
+
86|32
1076
+
86|76
1077
+
86|85
1078
+
86|61
1079
+
86|77
1080
+
86|18
1081
+
86|19
1082
+
86|34
1083
+
86|35
1084
+
86|47
1085
+
86|39
1086
+
69|92
1087
+
69|16
1088
+
69|83
1089
+
69|66
1090
+
69|48
1091
+
69|24
1092
+
69|26
1093
+
69|47
1094
+
69|14
1095
+
69|45
1096
+
69|55
1097
+
69|74
1098
+
69|31
1099
+
66|26
1100
+
66|79
1101
+
66|91
1102
+
66|31
1103
+
66|34
1104
+
66|85
1105
+
66|45
1106
+
66|98
1107
+
66|86
1108
+
66|14
1109
+
66|55
1110
+
66|74
1111
+
15|45
1112
+
15|14
1113
+
15|26
1114
+
15|32
1115
+
15|18
1116
+
15|98
1117
+
15|48
1118
+
15|34
1119
+
15|66
1120
+
15|92
1121
+
15|55
1122
+
71|45
1123
+
71|24
1124
+
71|44
1125
+
71|86
1126
+
71|12
1127
+
71|79
1128
+
71|23
1129
+
71|65
1130
+
71|94
1131
+
71|27
1132
+
79|85
1133
+
79|55
1134
+
79|11
1135
+
79|83
1136
+
79|61
1137
+
79|51
1138
+
79|76
1139
+
79|47
1140
+
79|32
1141
+
76|51
1142
+
76|27
1143
+
76|44
1144
+
76|35
1145
+
76|54
1146
+
76|58
1147
+
76|61
1148
+
76|71
1149
+
19|65
1150
+
19|23
1151
+
19|46
1152
+
19|15
1153
+
19|27
1154
+
19|74
1155
+
19|44
1156
+
11|61
1157
+
11|15
1158
+
11|77
1159
+
11|71
1160
+
11|54
1161
+
11|46
1162
+
92|47
1163
+
92|22
1164
+
92|79
1165
+
92|45
1166
+
92|65
1167
+
23|46
1168
+
23|22
1169
+
23|69
1170
+
23|31
1171
+
37|95
1172
+
37|53
1173
+
37|71
1174
+
55|95
1175
+
55|14
1176
+
27|31
1177
+
1178
+
61,58,51,32,12,14,71
1179
+
58,25,54,14,12,94,32,76,39
1180
+
35,53,26,77,14,71,25,76,85,55,51,49,95
1181
+
32,91,76,11,35,61,51,77,52,19,71,84,53,58,25,44,54,94,23,12,46,69,24
1182
+
18,37,26,47,83,85,49,32,76,35,61,77,52,19,71
1183
+
39,19,84,53,58,25,54,12,69,66,31
1184
+
61,52,71,84,44,66,92
1185
+
71,84,44,46,45
1186
+
32,91,76,35,51,77,52,71,84,53,58,25,44,54,94,23,12
1187
+
48,18,37,34,26,55,47,95,83,49,32,91,11,35,61,77,52,39,71
1188
+
25,54,12,46,79,74,18
1189
+
94,65,44,39,46,66,52,15,54,71,84,92,12,77,23,27,31,16,25,58,19,69,53
1190
+
19,71,53,25,44,54,94,23,46,69,24,15,66,16,65,31,79
1191
+
49,76,11,35,77,52,39,71,54,23,12,46,69
1192
+
69,58,19,71,35,61,16,46,54
1193
+
54,16,35,94,25,15,51
1194
+
34,26,55,47,95,14,85,49,32,91,76,11,35,61,51,77,52,39,19,71,84,53,58
1195
+
76,54,77,24,46,12,27,35,53,52,61,39,58,69,94,71,91,23,51
1196
+
14,27,83,85,37,65,16,18,79,22,48,66,86,92,47
1197
+
19,52,61,58,44,84,51
1198
+
27,15,66,16,92,31,98,79,74,86,18,37,26,55,85
1199
+
94,46,27,66,65,45,98,74,86,48,18,37,34
1200
+
66,46,53,52,77,35,16,27,61
1201
+
18,37,34,55,47,95,83,14,85,49,32,91,76,11,35,61,51,77,39,71,84
1202
+
61,51,77,52,39,19,71,84,53,58,25,54,94,23,12,46,69,24,27,15,66,16,92
1203
+
98,74,86,22,48,18,37,34,26,55,47,95,83,14,85,49,32,91,76,11,51
1204
+
49,32,51,39,84,53,69
1205
+
46,15,66,65,45,98,86,48,18,34,55,47,95
1206
+
25,94,23,12,66,16,92,31,79,86,22,48,18
1207
+
32,91,76,51,77,52,39,19,53,58,25,54,94,23,12,69,24
1208
+
34,26,55,47,83,14,76,35,61,51,77,39,19,84,53
1209
+
34,18,95,74,35,37,47,52,76,32,22,48,51,86,77,85,11,55,83,14,26
1210
+
25,44,54,23,46,69,27,16,92,31,45,98,22,48,18
1211
+
91,58,11,76,26,49,19,95,14,61,39
1212
+
48,18,37,34,55,47,95,14,85,49,32,91,76,35,61,51,77,52,39,19,71
1213
+
31,66,27,79,23,86,22,92,15,44,54,94,16,37,12,18,45
1214
+
16,24,66,53,12,77,19,65,15,51,27,94,23,52,39,46,58,69,92,84,71,54,25
1215
+
44,54,94,12,46,24,27,15,92,31,86,22,37
1216
+
39,71,53,54,15,45,98
1217
+
69,53,44,54,77,58,27,39,61,25,12,94,23,51,35,84,71,15,46,66,16,19,52
1218
+
94,46,69,31,66,84,86,58,98,16,24
1219
+
55,47,95,49,76,51,19,71,84,58,44
1220
+
12,46,69,16,92,65,31,45,98,79,74,86,22,48,18,37,34,26,47
1221
+
52,11,77,58,27,35,39,24,44,19,46,23,54,53,71,76,12
1222
+
71,66,94,15,84,46,61,52,11,19,53,23,51,69,27,54,58,12,39,44,24
1223
+
79,86,22,18,37,47,83,14,91,76,51
1224
+
79,48,47,95,11
1225
+
12,24,46,34,66,74,86,98,69,37,45,92,26,55,47,18,65,22,16
1226
+
71,65,54,15,39,69,98,23,46,58,94,24,45
1227
+
79,74,86,83,14
1228
+
35,19,84,69,27
1229
+
54,46,66,31,98,48,18,37,34
1230
+
18,65,34,14,55,66,24
1231
+
94,46,27,65,98,22,26
1232
+
66,69,45,46,79,23,86,92,58,94,84,53,24,31,44,54,16,12,65,27,98
1233
+
27,66,92,65,31,98,86,18,26,55,95,83,85
1234
+
86,34,79,83,66,55,22,16,32
1235
+
85,49,32,76,11,77,52,39,84,53,25,54,94,12,46
1236
+
74,47,31,22,92,18,79,37,48,14,16,85,98,83,34,45,65,95,66,27,86
1237
+
86,22,18,37,34,26,47,95,83,85,49,32,11,35,61,77,39
1238
+
79,55,95,49,91
1239
+
54,94,23,12,46,69,24,27,15,66,16,65,31,45,98,79,74,86,22,48,18,37,34
1240
+
27,53,58,92,69,79,94
1241
+
83,14,85,49,32,91,76,11,35,61,51,77,52,39,19,71,84,53,58,44,54,94,23
1242
+
23,12,46,69,24,27,15,66,16,92,65,31,98,79,74,86,22,48,18,37,34,26,55
1243
+
53,54,19,85,46,91,84,71,44,52,23,51,77,76,39,32,25,94,49,11,61
1244
+
32,35,55,22,74
1245
+
35,61,51,77,39,19,71,84,53,58,25,44,54,94,23,12,46,69,24,27,15,66,16
1246
+
95,74,11,49,85,83,45,34,32,61,37,35,14,55,18,79,26,22,98,86,91,47,48
1247
+
66,31,45,98,22,48,47,95,83,14,85
1248
+
61,51,77,52,39,19,71,84,53,58,25,54,94,23,12,46,69,27,15,16,92
1249
+
85,49,91,35,61,77,52,39,19,71,84,53,58,25,94,12,46
1250
+
47,26,79,65,34,37,74,83,98,22,45,55,18,16,66,69,15,86,95
1251
+
61,51,46,23,12,25,85,58,52,39,54,19,76,91,94,32,35
1252
+
48,37,95,85,32,91,76,51,71
1253
+
84,58,25,44,54,94,23,12,46,69,24,27,15,66,16,92,65,31,98,79,86
1254
+
77,54,14,35,49,84,76,51,11,44,94,95,52,71,19
1255
+
69,24,27,15,66,16,92,65,31,45,98,79,74,22,48,18,37,34,26,55,47,95,83
1256
+
61,71,53,44,46,24,66
1257
+
66,16,45,18,55,47,83,85,32
1258
+
69,24,27,66,98,79,86,22,48,18,37,34,26,55,47,95,83
1259
+
85,19,71,84,44,11,53,47,77,49,76,54,14,91,25
1260
+
11,83,61,77,51,35,58,94,95
1261
+
49,32,91,76,11,35,61,51,77,52,39,19,84,58,25,44,94,23,12,46,69
1262
+
25,44,54,94,23,12,24,27,15,66,16,92,65,31,79,74,86,22,18
1263
+
71,49,48,95,76,83,34,47,37
1264
+
14,49,32,91,61,77,52,19,84,58,44
1265
+
45,44,79,53,16,23,15,58,92,31,66,22,98,74,25,24,46,69,65,86,54,27,94
1266
+
11,61,52,53,58,94,66
1267
+
77,84,54,69,71,76,24,23,94,11,44,27,91,12,61,53,35,19,39,46,25
1268
+
92,65,31,45,74,86,48,18,37,34,26,55,47,95,83,14,85,91,76
1269
+
46,24,15,66,16,92,98,79,86,18,34,26,55
1270
+
11,35,61,51,77,52,39,19,71,53,58,25,44,54,94,23,12,69,24,15,66
1271
+
49,76,39,53,58
1272
+
71,84,53,58,25,44,54,94,23,12,69,24,27,15,66,16,92,65,31,45,98,79,74
1273
+
14,25,47,32,54,19,85,95,58
1274
+
53,12,25,19,15,54,52,31,44,39,69
1275
+
32,91,76,35,61,51,77,52,39,19,84,58,25,44,54,94,23,12,46,69,24
1276
+
55,83,91,49,86,22,76,37,32,14,39,47,34
1277
+
94,23,12,46,69,24,27,66,16,92,65,31,45,98,79,74,86,22,48,18,37,34,26
1278
+
55,83,49,32,35,39,19
1279
+
19,16,92,46,31,69,44,52,39,12,71,45,53,15,84,66,58
1280
+
71,84,35,53,58,11,91,61,51,83,25,14,47,77,32,76,44,55,95,52,19,49,39
1281
+
24,27,65,31,45,98,22,48,18,34,26,55,47,95,14
1282
+
46,23,58,31,98,12,92,24,45,54,71,94,19,16,53,25,39,44,69
1283
+
92,65,98,18,47,83,14,85,76
1284
+
26,32,34,83,49,91,52,85,47,11,51,76,74,35,48
1285
+
65,45,98,79,74,22,48,18,55,47,95,83,14,85,49,32,91,76,11
1286
+
47,39,26,22,49,34,76
1287
+
77,52,84,54,23,46,27,16,31
1288
+
15,66,16,92,65,31,98,74,86,48,18,37,34,55,47
1289
+
92,55,48,18,27,45,65,24,66,83,69
1290
+
22,18,37,95,85,49,32,35,61,77,19
1291
+
49,91,77,71,58,25,54,94,69
1292
+
39,51,85,77,49,19,61,18,22,37,14,34,11
1293
+
47,85,32,91,76,52,39,19,71,84,53,44,54
1294
+
76,35,61,52,39,71,53,58,25,94,12,46,24,27,15
1295
+
61,51,84,25,46,35,76,32,52,12,23,69,19,94,58,11,39,53,24,54,77,44,91
1296
+
31,45,66,49,79,95,26,98,65,48,14,55,22,74,92
1297
+
92,46,48,26,66
1298
+
25,44,94,12,65,31,79,22,18
1299
+
45,98,79,55,14,34,26,83,74,15,86,92,85,49,18,66,65,16,22
1300
+
25,32,53,58,94,23,19,54,71,11,39,77,52,84,69,76,49
1301
+
52,39,84,53,25,44,12,24,15,66,16,92,65,31,45
1302
+
52,39,19,58,44,54,94,23,12,69,24,15,66,16,92,31,45
1303
+
95,66,47,26,18,83,32,45,85,98,86,37,55
1304
+
31,45,86,48,37,26,95,83,14,85,32,76,35
1305
+
94,24,92,58,19,54,69,16,84,53,27,51,77,12,15,61,39,25,52,23,71,66,44
1306
+
44,54,94,23,12,46,69,24,66,92,31,98,79
1307
+
66,16,92,65,45,98,79,74,86,22,48,18,37,26,55,47,95,83,14,49,32
1308
+
98,18,47,14,85,49,51
1309
+
55,85,91,11,84
1310
+
32,91,11,35,51,77,52,39,19,84,58,54,94,23,69
1311
+
83,84,11,26,77,34,14,85,71,52,18
1312
+
32,49,91,76,83,94,71,19,23,61,58
1313
+
44,69,16,98,65,58,12,84,94,25,79,27,31,54,46,24,86,66,74,45,92
1314
+
65,94,15,12,45,74,23,58,16,84,86,31,69,24,98,92,66
1315
+
61,51,77,52,19,71,84,53,25,44,94,23,12,46,69,24,27,15,66
1316
+
79,34,55,61,98,45,47,74,83,49,76,11,32
1317
+
86,22,48,18,37,83,85,32,91,76,11,35,61,51,77,52,39
1318
+
65,45,86,55,95,85,32,76,11
1319
+
15,66,16,92,31,45,98,79,74,86,22,48,18,37,34,26,95,83,14,85,49
1320
+
54,58,53,16,71,15,98,69,94,65,46,31,66,25,92,84,44,24,19,23,27
1321
+
26,61,37,14,71,51,19,76,91
1322
+
15,92,79,74,86,22,48,26,55,83,14,85,49
1323
+
26,74,83,76,49,31,47,35,37,95,86
1324
+
71,83,95,34,19,39,14,51,85,49,52,61,32,48,55
1325
+
69,15,66,92,79,74,37,34,55,47,95
1326
+
47,51,19,39,35,85,84,91,26,71,49,55,25,11,52
1327
+
26,14,76,32,37,95,86,35,55,79,83,11,91,47,34,22,31,98,85,45,48
1328
+
35,53,19,32,91,46,12,25,11,61,54,51,71
1329
+
98,79,74,86,22,18,37,34,26,55,47,95,83,85,49,32,91,11,51
1330
+
79,22,34,47,32,11,77
1331
+
31,69,45,95,83,16,55,65,98,22,26,37,74
1332
+
74,86,22,37,34,26,55,95,85,32,91,76,11,77,52
1333
+
39,19,71,53,25,44,54,46,69,24,27,66,16,65,31,45,98
1334
+
47,51,11,77,58,85,52
1335
+
45,48,37,83,49,32,91
1336
+
85,26,77,95,19,18,51,34,55,52,91,32,11,84,39
1337
+
79,45,18,94,48,74,16,12,92,98,37,26,27,23,69,46,34,86,31
1338
+
48,34,14,45,86,98,18,85,47,22,55,76,79,32,31,91,35,83,37
1339
+
76,77,52,71,44
1340
+
26,55,47,95,83,14,85,49,32,91,76,11,35,61,51,77,52,39,19,71,84,58,25
1341
+
45,98,79,86,48,18,34,26,47,95,85,91,61
1342
+
24,44,19,71,15,12,27,51,52,92,84
1343
+
69,24,27,65,98,22,48,18,55,47,83
1344
+
61,34,11,74,91,51,48,55,52,86,37,85,14,49,95,76,22
1345
+
71,46,27,15,66,92,79
1346
+
58,46,16,31,27,54,53,66,12,23,71,52,84,25,44,94,77
1347
+
61,77,39,19,71,84,25,44,54,94,24,27,15,66,16
1348
+
51,52,15,12,24,66,54,35,46,16,69,84,53
1349
+
74,86,22,48,18,34,26,55,47,95,83,14,85,49,32,91,76,11,35,61,51,77,52
1350
+
34,26,47,14,32,76,35,39,71
1351
+
37,26,47,83,85,49,76,11,35,61,51,77,53
1352
+
66,24,98,86,15
1353
+
91,76,35,61,51,52,39,19,53,58,54,94,23,46,27
1354
+
16,92,45,74,86,22,18,37,34,26,55,85,49,32,91
1355
+
12,74,58,79,23,31,22,25,86
1356
+
98,79,22,48,18,14,85,49,32,76,11,61,51
1357
+
34,26,55,47,95,83,14,85,49,32,91,76,11,35,61,51,52,39,19,71,84,53,58
1358
+
51,52,39,58,25,44,54,12,46,69,24,66,16,92,65
1359
+
24,44,58,12,46,92,22,79,86,74,54,65,23
1360
+
86,22,18,26,95,32,91,76,51
1361
+
71,54,69,24,15,66,16,31,45,98,74
1362
+
15,92,65,31,45,98,79,74,86,22,48,18,34,26,55,95,14,85,49
1363
+
53,44,54,94,23,12,46,69,24,27,15,66,92,98,74,86,22
1364
+
16,92,65,31,45,98,22,18,37,34,55,95,83,14,32
1365
+
34,47,95,83,14,85,49,91,76,11,35,51,77,52,19,71,84,53,58
1366
+
55,45,76,37,35,83,31
+166
2024/day_5/src/main.rs
+166
2024/day_5/src/main.rs
···
1
+
#![feature(test)]
2
+
3
+
extern crate test;
4
+
5
+
use std::fs;
6
+
7
+
#[derive(Debug)]
8
+
enum Input {
9
+
Rule(String, String),
10
+
Update(String),
11
+
None
12
+
}
13
+
14
+
impl Input {
15
+
fn is_rule(&self) -> bool {
16
+
match *self {
17
+
Input::Rule(_, _) => true,
18
+
_ => false
19
+
}
20
+
}
21
+
22
+
fn is_none(&self) -> bool {
23
+
match *self {
24
+
Input::None => true,
25
+
_ => false
26
+
}
27
+
}
28
+
}
29
+
30
+
fn part_1(input: &Vec<Input>) {
31
+
let rules = input.iter().filter(|i| i.is_rule()).collect::<Vec<&Input>>();
32
+
33
+
let mut sum: usize = 0;
34
+
35
+
for item in input {
36
+
match item {
37
+
Input::Update(update) => {
38
+
let mut c = true;
39
+
for rule in rules.clone() {
40
+
match rule {
41
+
Input::Rule(before, after) => {
42
+
if update.find(before).is_some() && update.find(after).is_some() {
43
+
let i_b = update.find(before).unwrap();
44
+
let i_a = update.find(after).unwrap();
45
+
46
+
if i_b > i_a {
47
+
c = false;
48
+
}
49
+
}
50
+
},
51
+
_ => ()
52
+
}
53
+
};
54
+
55
+
if c {
56
+
let sp = update.split(',').collect::<Vec<&str>>();
57
+
sum += sp[sp.len() / 2].parse::<usize>().unwrap();
58
+
}
59
+
},
60
+
_ => ()
61
+
}
62
+
}
63
+
64
+
println!("Part 1: {sum}")
65
+
66
+
}
67
+
68
+
fn part_2(input: &Vec<Input>) {
69
+
let rules = input.iter().filter(|i| i.is_rule()).collect::<Vec<&Input>>();
70
+
71
+
let mut sum: usize = 0;
72
+
73
+
for item in input {
74
+
match item {
75
+
Input::Update(update) => {
76
+
let mut updated = update.split(',').collect::<Vec<&str>>();
77
+
let mut c = true;
78
+
for _ in 0..2 {
79
+
for rule in rules.clone() {
80
+
match rule {
81
+
Input::Rule(before, after) => {
82
+
if update.find(before).is_some() && update.find(after).is_some() {
83
+
let b_idx = updated.iter().position(|i| *i == before).unwrap_or(usize::MAX);
84
+
let a_idx = updated.iter().position(|i| *i == after).unwrap_or(usize::MAX);
85
+
86
+
if b_idx > a_idx {
87
+
updated = [&updated[0..a_idx], [updated[b_idx]].as_slice(), &updated[a_idx..b_idx], &updated[b_idx+1..]].concat().to_vec();
88
+
c = false;
89
+
}
90
+
}
91
+
},
92
+
_ => ()
93
+
}
94
+
};
95
+
}
96
+
97
+
if !c {
98
+
sum += updated[updated.len() / 2].parse::<usize>().unwrap();
99
+
}
100
+
},
101
+
_ => ()
102
+
}
103
+
}
104
+
105
+
println!("Part 2: {sum}")
106
+
}
107
+
108
+
fn parse_input(input: &str) -> Option<Vec<Input>> {
109
+
Some(input.lines().map(|line| {
110
+
if line.find('|').is_some() {
111
+
let mut s = line.split('|');
112
+
Input::Rule(s.next().unwrap().to_string(), s.next().unwrap().to_string())
113
+
} else {
114
+
if !line.is_empty() {
115
+
Input::Update(line.to_string())
116
+
} else {
117
+
Input::None
118
+
}
119
+
}
120
+
}).filter(|i| !i.is_none()).collect())
121
+
}
122
+
123
+
fn main() {
124
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
125
+
126
+
let input = parse_input(file.as_str()).unwrap();
127
+
part_1(&input);
128
+
part_2(&input);
129
+
}
130
+
131
+
#[test]
132
+
fn test_main() {
133
+
let file = fs::read_to_string("./text_input.txt").expect("Couldn't read file");
134
+
135
+
let input = parse_input(file.as_str()).unwrap();
136
+
part_1(&input);
137
+
part_2(&input);
138
+
}
139
+
140
+
#[bench]
141
+
fn full(b: &mut test::Bencher) {
142
+
b.iter(|| main());
143
+
}
144
+
145
+
#[bench]
146
+
fn input_only(b: &mut test::Bencher) {
147
+
let input = fs::read_to_string("./input.txt").expect("Couldn't read file");
148
+
149
+
b.iter(|| parse_input(input.as_str()));
150
+
}
151
+
152
+
#[bench]
153
+
fn part_one(b: &mut test::Bencher) {
154
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
155
+
156
+
let input = parse_input(file.as_str()).unwrap();
157
+
b.iter(|| part_1(&input));
158
+
}
159
+
160
+
#[bench]
161
+
fn part_two(b: &mut test::Bencher) {
162
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
163
+
164
+
let input = parse_input(file.as_str()).unwrap();
165
+
b.iter(|| part_2(&input));
166
+
}
+28
2024/day_5/text_input.txt
+28
2024/day_5/text_input.txt
···
1
+
47|53
2
+
97|13
3
+
97|61
4
+
97|47
5
+
75|29
6
+
61|13
7
+
75|53
8
+
29|13
9
+
97|29
10
+
53|29
11
+
61|53
12
+
97|53
13
+
61|29
14
+
47|13
15
+
75|47
16
+
97|75
17
+
47|61
18
+
75|61
19
+
47|29
20
+
75|13
21
+
53|13
22
+
23
+
75,47,61,53,29
24
+
97,61,53,29,13
25
+
75,29,13
26
+
75,97,47,61,53
27
+
61,13,29
28
+
97,13,75,29,47
+1
2024/day_6/.gitignore
+1
2024/day_6/.gitignore
···
1
+
/target
+7
2024/day_6/Cargo.lock
+7
2024/day_6/Cargo.lock
+6
2024/day_6/Cargo.toml
+6
2024/day_6/Cargo.toml
+130
2024/day_6/input.txt
+130
2024/day_6/input.txt
···
1
+
........#.............................................#.........#..............#.......#....................#....................#
2
+
......................#........#........................#.............##............................#.#.............#..........#..
3
+
....#..................................#..................#.........#....#..............#..#......................#........#...#..
4
+
.....#...#...............#................#..........................#......#.....................#.......................#.......
5
+
......................................................##.#....#..................................................................#
6
+
#....#....................#..................................#.....................................#......................#.......
7
+
.......#...........................#.......................#......#...#.................................................#...#.....
8
+
....................##..........................#................#..........................#.#..................#....#.........#.
9
+
#..................................#...............#...............#.........................#............##......................
10
+
.............................#....................................#...............#.........#..........#.......................#..
11
+
.................................#............###.......#............##......#...............................#...............#.#..
12
+
.#..........................................#.......#.......................##..#........#........#...............#...............
13
+
......#...#............#.#..............#...................#..........................................................##.........
14
+
#................##....................................................................#........#.................#...#...........
15
+
...#..........#..........................##......#....#..............................#......................................#.....
16
+
..............................##.#..........................................................#..............................#......
17
+
......#...........#....#..................#............#....................................................................#.....
18
+
.....................#........................#.......................................................#...........................
19
+
...................#.#..........................................................................................#.#...............
20
+
.........................................##.........................................................#.......#...###......#........
21
+
...............................................................##.......................#..........................#..............
22
+
...#...........#.................#..............#......#.....#..........................#....................#....#...............
23
+
.................................#................#................#..............................................#.......##.....#
24
+
........#..........................#................#.......................#...................#.................................
25
+
.............................#.............................#..........#.........................#........#........................
26
+
....#................#.#................#...........................................................#...#....#......#......#......
27
+
........#..............................#...............................#.................#........................................
28
+
...........................................#..#........#...#...........#..#.............#.........................................
29
+
.#.................#.#................................#................#.#..................................#........#............
30
+
.......#..........................................#.................................................................#.............
31
+
...................#....................................................#..#...............................................#......
32
+
...#.#........#...#.....#.....................................................................................................#...
33
+
......#.........................#......................#.............#.....................#......................................
34
+
..........................#............#.................................#..#..........#........#......................#..........
35
+
...#..#......#.......................#........................#...................................................................
36
+
............#...........#................#..............#.........................................................................
37
+
.#........#....#.........................................#........................................#...............................
38
+
...#......................##.........#.......#.#...........#................................................#...#.................
39
+
...........#......#.........#....#.....#.......................................................#.............#....................
40
+
.............#...#..............................................#.........#.....##....................#...#.........#.............
41
+
...............#................................#..........................................#.....#.#.........................#...#
42
+
................#.....#..#.............#..............#..............#.......#....................................................
43
+
......#.........................................................................................................#.........##......
44
+
..#...........................#.#...........................................#..#.....#............................................
45
+
...#...#..................#..................................#.........#...................#..................................#...
46
+
............#..#.....................#.........................................#.......#..................................#.......
47
+
...#.......................................................................#.............................#........................
48
+
......#..................#....................................#......##...........................................................
49
+
.#...............#.....#..........................................................................................#...............
50
+
...#.............#.........................#.....................#...#..........#....#............................#...............
51
+
...#............................#.......#...........#.........#........#.....#...........#...................................#....
52
+
.....................#...................#................................#...............................#......#.........#..##..
53
+
.............#........................................................................................#........................##.
54
+
.....#.......#.......#............................................................................................................
55
+
............................................#................................................................#..............#.....
56
+
....#..#......................................................#...................................................#...............
57
+
.................................#...##..................#.................................................#....#.................
58
+
........#...................................#...#..........................................................#......................
59
+
........................#........##...........#.......#........#...................................#..............................
60
+
...........#...#...................................................#..............#......#...............#.#..................#...
61
+
........#.............................................#...........................................................................
62
+
........#................#......#..........#..#........#.#.......#...#........................#..#......................#.......#.
63
+
.......#..........................................................................................................#.....#.....#...
64
+
......................##....................#.....#.................#...........#.......................#.##..........#......#....
65
+
....................................##....................................................................#.................#.....
66
+
..#.................................#.#...........#............................................#....#.............................
67
+
#...................................#...........................................#............#.........#...............#..........
68
+
.......................#.............................................................#..........#...#.............#.....#.........
69
+
#..................#.#.............................................................................#.................#............
70
+
.....................#......#.......#...........#..........................................^...............................#......
71
+
................................#......................#.#.....#..............#..................#....#.#......#....#.............
72
+
............................................................................#........#.....................................#......
73
+
.............#......................................................#...................................#......##..#....#.........
74
+
...............#.................#...................#...............#............................................................
75
+
..............#...........#..#...........................................#...................................#..........#.........
76
+
..........#...........................#...................#..............#...#.......#..........#...................#.............
77
+
.............#.#..................................#....#..#............#.....................#................#...#.....#.........
78
+
...................#..........................................................#............##.....................................
79
+
...........................................#............#........................................................................#
80
+
..#..............................#....#...........................................................................................
81
+
..#..#............#...........................#...#...........#............#.....#.................#..............................
82
+
....#...................#.........#...............................................................................................
83
+
.......#..........................#....................................##........#.................##...#.#........#..#...........
84
+
.#........................#....#.......#.....#...................#.............................................#..................
85
+
..#...............................................................#................................................#..............
86
+
.....#........................................#...................................................................................
87
+
..........................................#..........................................................#............................
88
+
....................###.........................#............................#...#...........#............#.......................
89
+
.....#.....#...............#........#.#....#...................#...........#........#...........#.................................
90
+
................................................................................................#...##............................
91
+
......................#............#.........................#.......................#.....#...........#...#.#....................
92
+
............................#....................#..................#..............#..................................#...........
93
+
...........................#...................................#..............................................................#...
94
+
..................#................#.....................#...................#........#..............#............................
95
+
............#.............#.....................#..................#.........#......................#............#............#...
96
+
....#..........................#...............................................................................................#..
97
+
................#.....................................#.............................#...........#........................#........
98
+
#.##...........#.........................................#...............#..........................................#.#...........
99
+
........................................#..............#.....................#............#.....#.................................
100
+
.......#....##..#..#.....#........................................................................................................
101
+
....##.............#..............................#...............................................................................
102
+
.....#........................#.........#..#......#........#......................#.......#..............#..........#.......#.....
103
+
..#....#.........................#.#....................#..#.......#.............#..................#........#..................#.
104
+
..........##....#........................................................................#........................................
105
+
........#......#................................................................................................#................#
106
+
.....#.......#...#.............#....................................#..#........................#...#..............#....#.........
107
+
.............#...................................................##...#...........................................................
108
+
..............#.............................................#.............#................#.............#..............#.........
109
+
..#....#..........#.....#......#......................#................................#...............................#..........
110
+
.................................................................................##......#...........................#.....#......
111
+
..#....#..........#.......#.........................................#...............#..#............................#........#....
112
+
...........#........#.#....................#........#.....................................#..................#....................
113
+
.......#............#................#...........#.............#......#.........#...........................#.....................
114
+
#.#....#.#...............#....#.....#.......................#...............................#...................##...#............
115
+
.................##...#.................................................................#...........................#.............
116
+
.....#........................................#.........#...................................................#.....................
117
+
....................#.....................#................................................#...##.....................#...........
118
+
...............#...............................................................#....#.............................................
119
+
.................#................#...#.....................................#......#....................#...............#.#.......
120
+
...................#............................................#..#....#..#........#...............................#.........#...
121
+
..#........#...............#..................#.....#..................#.....................................#........##...#......
122
+
.....#.....#....#.....#................#.#.....................##.............................................................#...
123
+
................#............#......#......#.......................................................#....................#........#
124
+
........#..............#..#......................................................................##.....##........................
125
+
.........#.............................#.........#.......................................#..........................#.##..........
126
+
.#...................#........................................................#....#......................................#.......
127
+
....#..........#.....#.........................................................................................#..................
128
+
.......#.............................#............#.........................#....#....#........#......#.....#.......#.............
129
+
..#.......#........................#........................#.....................................................................
130
+
........................#...............................#.#.............#................................#..................#.....
+166
2024/day_6/src/main.rs
+166
2024/day_6/src/main.rs
···
1
+
#![feature(test)]
2
+
3
+
extern crate test;
4
+
5
+
use std::fs;
6
+
7
+
fn walk_guard(mut grid: Vec<Vec<char>>) -> (Vec<Vec<char>>, bool) {
8
+
println!("walking");
9
+
let mut x: i32 = -1;
10
+
let y = grid.iter().position(|line| {
11
+
let t = line.iter().position(|c| *c == '<' || *c == '>' || *c == 'v' || *c == '^');
12
+
if t.is_some() {
13
+
x = t.unwrap().try_into().unwrap();
14
+
true
15
+
} else {
16
+
false
17
+
}
18
+
});
19
+
20
+
if y.is_none() {
21
+
return (grid, true)
22
+
}
23
+
24
+
let real_x: usize = x.try_into().unwrap();
25
+
let real_y: usize = y.unwrap();
26
+
27
+
match grid[real_y][real_x] {
28
+
'^' => {
29
+
if real_y.checked_sub(1).is_some() {
30
+
let ahead = grid[real_y-1][real_x];
31
+
if ahead == '.' {
32
+
grid[real_y-1][real_x] = '^';
33
+
grid[real_y][real_x] = 'X';
34
+
} else {
35
+
grid[real_y][real_x] = '>';
36
+
}
37
+
} else {
38
+
grid[real_y][real_x] = 'X';
39
+
}
40
+
},
41
+
'>' => {
42
+
if (real_x + 1) < grid[real_y].len() {
43
+
let ahead = grid[real_y][real_x+1];
44
+
if ahead == '.' {
45
+
grid[real_y][real_x+1] = '>';
46
+
grid[real_y][real_x] = 'X';
47
+
} else {
48
+
grid[real_y][real_x] = 'v';
49
+
}
50
+
} else {
51
+
grid[real_y][real_x] = 'X';
52
+
}
53
+
},
54
+
'v' => {
55
+
if (real_y + 1) < grid.len() {
56
+
let ahead = grid[real_y+1][real_x];
57
+
if ahead == '.' {
58
+
grid[real_y+1][real_x] = 'v';
59
+
grid[real_y][real_x] = 'X';
60
+
} else {
61
+
grid[real_y][real_x] = '<';
62
+
}
63
+
} else {
64
+
grid[real_y][real_x] = 'X';
65
+
}
66
+
},
67
+
'<' => {
68
+
if real_x.checked_sub(1).is_some() {
69
+
let ahead = grid[real_y][real_x-1];
70
+
if ahead == '.' {
71
+
grid[real_y][real_x-1] = '<';
72
+
grid[real_y][real_x] = 'X';
73
+
} else {
74
+
grid[real_y][real_x] = '^';
75
+
}
76
+
} else {
77
+
grid[real_y][real_x] = 'X';
78
+
}
79
+
},
80
+
_ => {}
81
+
};
82
+
(grid, false)
83
+
}
84
+
85
+
fn part_1(input: &Vec<Vec<char>>) {
86
+
let mut grid = input.to_vec();
87
+
let mut c = false;
88
+
89
+
while !c {
90
+
(grid, c) = walk_guard(grid);
91
+
for line in &grid {
92
+
println!("{:?}", line);
93
+
}
94
+
}
95
+
96
+
let mut sum: usize = 0;
97
+
for line in grid {
98
+
for c in line {
99
+
if c == 'X' {
100
+
sum += 1;
101
+
}
102
+
}
103
+
}
104
+
105
+
println!("Part 1: {sum}")
106
+
}
107
+
108
+
fn part_2(input: &Vec<Vec<char>>) {
109
+
110
+
}
111
+
112
+
fn parse_input(input: &str) -> Option<Vec<Vec<char>>> {
113
+
Some(
114
+
input.lines().map(
115
+
|line|
116
+
line.chars().collect()
117
+
).collect()
118
+
)
119
+
}
120
+
121
+
fn main() {
122
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
123
+
124
+
let input = parse_input(file.as_str()).unwrap();
125
+
part_1(&input);
126
+
part_2(&input);
127
+
}
128
+
129
+
#[test]
130
+
fn test_main() {
131
+
let file = fs::read_to_string("./test_input.txt").expect("Couldn't read file");
132
+
133
+
let input = parse_input(file.as_str()).unwrap();
134
+
135
+
println!("{:?}", input);
136
+
part_1(&input);
137
+
part_2(&input);
138
+
}
139
+
140
+
#[bench]
141
+
fn full(b: &mut test::Bencher) {
142
+
b.iter(|| main());
143
+
}
144
+
145
+
#[bench]
146
+
fn input_only(b: &mut test::Bencher) {
147
+
let input = fs::read_to_string("./input.txt").expect("Couldn't read file");
148
+
149
+
b.iter(|| parse_input(input.as_str()));
150
+
}
151
+
152
+
#[bench]
153
+
fn part_one(b: &mut test::Bencher) {
154
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
155
+
156
+
let input = parse_input(file.as_str()).unwrap();
157
+
b.iter(|| part_1(&input));
158
+
}
159
+
160
+
#[bench]
161
+
fn part_two(b: &mut test::Bencher) {
162
+
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
163
+
164
+
let input = parse_input(file.as_str()).unwrap();
165
+
b.iter(|| part_2(&input));
166
+
}
+10
2024/day_6/test_input.txt
+10
2024/day_6/test_input.txt
+100
2024/flake.lock
+100
2024/flake.lock
···
1
+
{
2
+
"nodes": {
3
+
"fenix": {
4
+
"inputs": {
5
+
"nixpkgs": [
6
+
"nixpkgs"
7
+
],
8
+
"rust-analyzer-src": "rust-analyzer-src"
9
+
},
10
+
"locked": {
11
+
"lastModified": 1732689334,
12
+
"narHash": "sha256-yKI1KiZ0+bvDvfPTQ1ZT3oP/nIu3jPYm4dnbRd6hYg4=",
13
+
"owner": "nix-community",
14
+
"repo": "fenix",
15
+
"rev": "a8a983027ca02b363dfc82fbe3f7d9548a8d3dce",
16
+
"type": "github"
17
+
},
18
+
"original": {
19
+
"owner": "nix-community",
20
+
"repo": "fenix",
21
+
"type": "github"
22
+
}
23
+
},
24
+
"flake-utils": {
25
+
"inputs": {
26
+
"systems": "systems"
27
+
},
28
+
"locked": {
29
+
"lastModified": 1731533236,
30
+
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
31
+
"owner": "numtide",
32
+
"repo": "flake-utils",
33
+
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
34
+
"type": "github"
35
+
},
36
+
"original": {
37
+
"owner": "numtide",
38
+
"repo": "flake-utils",
39
+
"type": "github"
40
+
}
41
+
},
42
+
"nixpkgs": {
43
+
"locked": {
44
+
"lastModified": 1733064805,
45
+
"narHash": "sha256-7NbtSLfZO0q7MXPl5hzA0sbVJt6pWxxtGWbaVUDDmjs=",
46
+
"owner": "NixOS",
47
+
"repo": "nixpkgs",
48
+
"rev": "31d66ae40417bb13765b0ad75dd200400e98de84",
49
+
"type": "github"
50
+
},
51
+
"original": {
52
+
"owner": "NixOS",
53
+
"ref": "nixpkgs-unstable",
54
+
"repo": "nixpkgs",
55
+
"type": "github"
56
+
}
57
+
},
58
+
"root": {
59
+
"inputs": {
60
+
"fenix": "fenix",
61
+
"flake-utils": "flake-utils",
62
+
"nixpkgs": "nixpkgs"
63
+
}
64
+
},
65
+
"rust-analyzer-src": {
66
+
"flake": false,
67
+
"locked": {
68
+
"lastModified": 1732633904,
69
+
"narHash": "sha256-7VKcoLug9nbAN2txqVksWHHJplqK9Ou8dXjIZAIYSGc=",
70
+
"owner": "rust-lang",
71
+
"repo": "rust-analyzer",
72
+
"rev": "8d5e91c94f80c257ce6dbdfba7bd63a5e8a03fa6",
73
+
"type": "github"
74
+
},
75
+
"original": {
76
+
"owner": "rust-lang",
77
+
"ref": "nightly",
78
+
"repo": "rust-analyzer",
79
+
"type": "github"
80
+
}
81
+
},
82
+
"systems": {
83
+
"locked": {
84
+
"lastModified": 1681028828,
85
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
86
+
"owner": "nix-systems",
87
+
"repo": "default",
88
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
89
+
"type": "github"
90
+
},
91
+
"original": {
92
+
"owner": "nix-systems",
93
+
"repo": "default",
94
+
"type": "github"
95
+
}
96
+
}
97
+
},
98
+
"root": "root",
99
+
"version": 7
100
+
}
+35
2024/flake.nix
+35
2024/flake.nix
···
1
+
{
2
+
description = "A basic flake with a shell";
3
+
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
4
+
inputs.flake-utils.url = "github:numtide/flake-utils";
5
+
inputs.fenix = {
6
+
url = "github:nix-community/fenix";
7
+
inputs.nixpkgs.follows = "nixpkgs";
8
+
};
9
+
10
+
outputs = { nixpkgs, flake-utils, fenix, ... }:
11
+
flake-utils.lib.eachDefaultSystem (system:
12
+
let
13
+
pkgs = import nixpkgs {
14
+
inherit system;
15
+
overlays = [ fenix.overlays.default ];
16
+
};
17
+
in
18
+
{
19
+
devShells.default = pkgs.mkShell {
20
+
packages = [
21
+
(pkgs.fenix.complete.withComponents [
22
+
"cargo"
23
+
"clippy"
24
+
"rust-src"
25
+
"rustc"
26
+
"rustfmt"
27
+
"rust-analyzer"
28
+
])
29
+
pkgs.bacon
30
+
pkgs.pkg-config
31
+
pkgs.openssl
32
+
];
33
+
};
34
+
});
35
+
}
+768
2025/Cargo.lock
+768
2025/Cargo.lock
···
1
+
# This file is automatically @generated by Cargo.
2
+
# It is not intended for manual editing.
3
+
version = 4
4
+
5
+
[[package]]
6
+
name = "aho-corasick"
7
+
version = "1.1.4"
8
+
source = "registry+https://github.com/rust-lang/crates.io-index"
9
+
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
10
+
dependencies = [
11
+
"memchr",
12
+
]
13
+
14
+
[[package]]
15
+
name = "alloca"
16
+
version = "0.4.0"
17
+
source = "registry+https://github.com/rust-lang/crates.io-index"
18
+
checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4"
19
+
dependencies = [
20
+
"cc",
21
+
]
22
+
23
+
[[package]]
24
+
name = "anes"
25
+
version = "0.1.6"
26
+
source = "registry+https://github.com/rust-lang/crates.io-index"
27
+
checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
28
+
29
+
[[package]]
30
+
name = "anstream"
31
+
version = "0.6.21"
32
+
source = "registry+https://github.com/rust-lang/crates.io-index"
33
+
checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
34
+
dependencies = [
35
+
"anstyle",
36
+
"anstyle-parse",
37
+
"anstyle-query",
38
+
"anstyle-wincon",
39
+
"colorchoice",
40
+
"is_terminal_polyfill",
41
+
"utf8parse",
42
+
]
43
+
44
+
[[package]]
45
+
name = "anstyle"
46
+
version = "1.0.13"
47
+
source = "registry+https://github.com/rust-lang/crates.io-index"
48
+
checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
49
+
50
+
[[package]]
51
+
name = "anstyle-parse"
52
+
version = "0.2.7"
53
+
source = "registry+https://github.com/rust-lang/crates.io-index"
54
+
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
55
+
dependencies = [
56
+
"utf8parse",
57
+
]
58
+
59
+
[[package]]
60
+
name = "anstyle-query"
61
+
version = "1.1.5"
62
+
source = "registry+https://github.com/rust-lang/crates.io-index"
63
+
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
64
+
dependencies = [
65
+
"windows-sys",
66
+
]
67
+
68
+
[[package]]
69
+
name = "anstyle-wincon"
70
+
version = "3.0.11"
71
+
source = "registry+https://github.com/rust-lang/crates.io-index"
72
+
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
73
+
dependencies = [
74
+
"anstyle",
75
+
"once_cell_polyfill",
76
+
"windows-sys",
77
+
]
78
+
79
+
[[package]]
80
+
name = "anyhow"
81
+
version = "1.0.100"
82
+
source = "registry+https://github.com/rust-lang/crates.io-index"
83
+
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
84
+
85
+
[[package]]
86
+
name = "aoc2025"
87
+
version = "0.1.0"
88
+
dependencies = [
89
+
"anyhow",
90
+
"atoi_simd",
91
+
"criterion",
92
+
"env_logger",
93
+
"log",
94
+
"memchr",
95
+
]
96
+
97
+
[[package]]
98
+
name = "atoi_simd"
99
+
version = "0.17.0"
100
+
source = "registry+https://github.com/rust-lang/crates.io-index"
101
+
checksum = "8ad17c7c205c2c28b527b9845eeb91cf1b4d008b438f98ce0e628227a822758e"
102
+
dependencies = [
103
+
"debug_unsafe",
104
+
]
105
+
106
+
[[package]]
107
+
name = "autocfg"
108
+
version = "1.5.0"
109
+
source = "registry+https://github.com/rust-lang/crates.io-index"
110
+
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
111
+
112
+
[[package]]
113
+
name = "bumpalo"
114
+
version = "3.19.0"
115
+
source = "registry+https://github.com/rust-lang/crates.io-index"
116
+
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
117
+
118
+
[[package]]
119
+
name = "cast"
120
+
version = "0.3.0"
121
+
source = "registry+https://github.com/rust-lang/crates.io-index"
122
+
checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
123
+
124
+
[[package]]
125
+
name = "cc"
126
+
version = "1.2.48"
127
+
source = "registry+https://github.com/rust-lang/crates.io-index"
128
+
checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a"
129
+
dependencies = [
130
+
"find-msvc-tools",
131
+
"shlex",
132
+
]
133
+
134
+
[[package]]
135
+
name = "cfg-if"
136
+
version = "1.0.4"
137
+
source = "registry+https://github.com/rust-lang/crates.io-index"
138
+
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
139
+
140
+
[[package]]
141
+
name = "ciborium"
142
+
version = "0.2.2"
143
+
source = "registry+https://github.com/rust-lang/crates.io-index"
144
+
checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
145
+
dependencies = [
146
+
"ciborium-io",
147
+
"ciborium-ll",
148
+
"serde",
149
+
]
150
+
151
+
[[package]]
152
+
name = "ciborium-io"
153
+
version = "0.2.2"
154
+
source = "registry+https://github.com/rust-lang/crates.io-index"
155
+
checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
156
+
157
+
[[package]]
158
+
name = "ciborium-ll"
159
+
version = "0.2.2"
160
+
source = "registry+https://github.com/rust-lang/crates.io-index"
161
+
checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
162
+
dependencies = [
163
+
"ciborium-io",
164
+
"half",
165
+
]
166
+
167
+
[[package]]
168
+
name = "clap"
169
+
version = "4.5.53"
170
+
source = "registry+https://github.com/rust-lang/crates.io-index"
171
+
checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8"
172
+
dependencies = [
173
+
"clap_builder",
174
+
]
175
+
176
+
[[package]]
177
+
name = "clap_builder"
178
+
version = "4.5.53"
179
+
source = "registry+https://github.com/rust-lang/crates.io-index"
180
+
checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00"
181
+
dependencies = [
182
+
"anstyle",
183
+
"clap_lex",
184
+
]
185
+
186
+
[[package]]
187
+
name = "clap_lex"
188
+
version = "0.7.6"
189
+
source = "registry+https://github.com/rust-lang/crates.io-index"
190
+
checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
191
+
192
+
[[package]]
193
+
name = "colorchoice"
194
+
version = "1.0.4"
195
+
source = "registry+https://github.com/rust-lang/crates.io-index"
196
+
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
197
+
198
+
[[package]]
199
+
name = "criterion"
200
+
version = "0.8.0"
201
+
source = "registry+https://github.com/rust-lang/crates.io-index"
202
+
checksum = "a0dfe5e9e71bdcf4e4954f7d14da74d1cdb92a3a07686452d1509652684b1aab"
203
+
dependencies = [
204
+
"alloca",
205
+
"anes",
206
+
"cast",
207
+
"ciborium",
208
+
"clap",
209
+
"criterion-plot",
210
+
"itertools",
211
+
"num-traits",
212
+
"oorandom",
213
+
"page_size",
214
+
"plotters",
215
+
"rayon",
216
+
"regex",
217
+
"serde",
218
+
"serde_json",
219
+
"tinytemplate",
220
+
"walkdir",
221
+
]
222
+
223
+
[[package]]
224
+
name = "criterion-plot"
225
+
version = "0.8.0"
226
+
source = "registry+https://github.com/rust-lang/crates.io-index"
227
+
checksum = "5de36c2bee19fba779808f92bf5d9b0fa5a40095c277aba10c458a12b35d21d6"
228
+
dependencies = [
229
+
"cast",
230
+
"itertools",
231
+
]
232
+
233
+
[[package]]
234
+
name = "crossbeam-deque"
235
+
version = "0.8.6"
236
+
source = "registry+https://github.com/rust-lang/crates.io-index"
237
+
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
238
+
dependencies = [
239
+
"crossbeam-epoch",
240
+
"crossbeam-utils",
241
+
]
242
+
243
+
[[package]]
244
+
name = "crossbeam-epoch"
245
+
version = "0.9.18"
246
+
source = "registry+https://github.com/rust-lang/crates.io-index"
247
+
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
248
+
dependencies = [
249
+
"crossbeam-utils",
250
+
]
251
+
252
+
[[package]]
253
+
name = "crossbeam-utils"
254
+
version = "0.8.21"
255
+
source = "registry+https://github.com/rust-lang/crates.io-index"
256
+
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
257
+
258
+
[[package]]
259
+
name = "crunchy"
260
+
version = "0.2.4"
261
+
source = "registry+https://github.com/rust-lang/crates.io-index"
262
+
checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
263
+
264
+
[[package]]
265
+
name = "debug_unsafe"
266
+
version = "0.1.3"
267
+
source = "registry+https://github.com/rust-lang/crates.io-index"
268
+
checksum = "85d3cef41d236720ed453e102153a53e4cc3d2fde848c0078a50cf249e8e3e5b"
269
+
270
+
[[package]]
271
+
name = "either"
272
+
version = "1.15.0"
273
+
source = "registry+https://github.com/rust-lang/crates.io-index"
274
+
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
275
+
276
+
[[package]]
277
+
name = "env_filter"
278
+
version = "0.1.4"
279
+
source = "registry+https://github.com/rust-lang/crates.io-index"
280
+
checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2"
281
+
dependencies = [
282
+
"log",
283
+
"regex",
284
+
]
285
+
286
+
[[package]]
287
+
name = "env_logger"
288
+
version = "0.11.8"
289
+
source = "registry+https://github.com/rust-lang/crates.io-index"
290
+
checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f"
291
+
dependencies = [
292
+
"anstream",
293
+
"anstyle",
294
+
"env_filter",
295
+
"jiff",
296
+
"log",
297
+
]
298
+
299
+
[[package]]
300
+
name = "find-msvc-tools"
301
+
version = "0.1.5"
302
+
source = "registry+https://github.com/rust-lang/crates.io-index"
303
+
checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844"
304
+
305
+
[[package]]
306
+
name = "half"
307
+
version = "2.7.1"
308
+
source = "registry+https://github.com/rust-lang/crates.io-index"
309
+
checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
310
+
dependencies = [
311
+
"cfg-if",
312
+
"crunchy",
313
+
"zerocopy",
314
+
]
315
+
316
+
[[package]]
317
+
name = "is_terminal_polyfill"
318
+
version = "1.70.2"
319
+
source = "registry+https://github.com/rust-lang/crates.io-index"
320
+
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
321
+
322
+
[[package]]
323
+
name = "itertools"
324
+
version = "0.13.0"
325
+
source = "registry+https://github.com/rust-lang/crates.io-index"
326
+
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
327
+
dependencies = [
328
+
"either",
329
+
]
330
+
331
+
[[package]]
332
+
name = "itoa"
333
+
version = "1.0.15"
334
+
source = "registry+https://github.com/rust-lang/crates.io-index"
335
+
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
336
+
337
+
[[package]]
338
+
name = "jiff"
339
+
version = "0.2.16"
340
+
source = "registry+https://github.com/rust-lang/crates.io-index"
341
+
checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35"
342
+
dependencies = [
343
+
"jiff-static",
344
+
"log",
345
+
"portable-atomic",
346
+
"portable-atomic-util",
347
+
"serde_core",
348
+
]
349
+
350
+
[[package]]
351
+
name = "jiff-static"
352
+
version = "0.2.16"
353
+
source = "registry+https://github.com/rust-lang/crates.io-index"
354
+
checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69"
355
+
dependencies = [
356
+
"proc-macro2",
357
+
"quote",
358
+
"syn",
359
+
]
360
+
361
+
[[package]]
362
+
name = "js-sys"
363
+
version = "0.3.83"
364
+
source = "registry+https://github.com/rust-lang/crates.io-index"
365
+
checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8"
366
+
dependencies = [
367
+
"once_cell",
368
+
"wasm-bindgen",
369
+
]
370
+
371
+
[[package]]
372
+
name = "libc"
373
+
version = "0.2.178"
374
+
source = "registry+https://github.com/rust-lang/crates.io-index"
375
+
checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091"
376
+
377
+
[[package]]
378
+
name = "log"
379
+
version = "0.4.29"
380
+
source = "registry+https://github.com/rust-lang/crates.io-index"
381
+
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
382
+
383
+
[[package]]
384
+
name = "memchr"
385
+
version = "2.7.6"
386
+
source = "registry+https://github.com/rust-lang/crates.io-index"
387
+
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
388
+
389
+
[[package]]
390
+
name = "num-traits"
391
+
version = "0.2.19"
392
+
source = "registry+https://github.com/rust-lang/crates.io-index"
393
+
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
394
+
dependencies = [
395
+
"autocfg",
396
+
]
397
+
398
+
[[package]]
399
+
name = "once_cell"
400
+
version = "1.21.3"
401
+
source = "registry+https://github.com/rust-lang/crates.io-index"
402
+
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
403
+
404
+
[[package]]
405
+
name = "once_cell_polyfill"
406
+
version = "1.70.2"
407
+
source = "registry+https://github.com/rust-lang/crates.io-index"
408
+
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
409
+
410
+
[[package]]
411
+
name = "oorandom"
412
+
version = "11.1.5"
413
+
source = "registry+https://github.com/rust-lang/crates.io-index"
414
+
checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
415
+
416
+
[[package]]
417
+
name = "page_size"
418
+
version = "0.6.0"
419
+
source = "registry+https://github.com/rust-lang/crates.io-index"
420
+
checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da"
421
+
dependencies = [
422
+
"libc",
423
+
"winapi",
424
+
]
425
+
426
+
[[package]]
427
+
name = "plotters"
428
+
version = "0.3.7"
429
+
source = "registry+https://github.com/rust-lang/crates.io-index"
430
+
checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747"
431
+
dependencies = [
432
+
"num-traits",
433
+
"plotters-backend",
434
+
"plotters-svg",
435
+
"wasm-bindgen",
436
+
"web-sys",
437
+
]
438
+
439
+
[[package]]
440
+
name = "plotters-backend"
441
+
version = "0.3.7"
442
+
source = "registry+https://github.com/rust-lang/crates.io-index"
443
+
checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"
444
+
445
+
[[package]]
446
+
name = "plotters-svg"
447
+
version = "0.3.7"
448
+
source = "registry+https://github.com/rust-lang/crates.io-index"
449
+
checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"
450
+
dependencies = [
451
+
"plotters-backend",
452
+
]
453
+
454
+
[[package]]
455
+
name = "portable-atomic"
456
+
version = "1.11.1"
457
+
source = "registry+https://github.com/rust-lang/crates.io-index"
458
+
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
459
+
460
+
[[package]]
461
+
name = "portable-atomic-util"
462
+
version = "0.2.4"
463
+
source = "registry+https://github.com/rust-lang/crates.io-index"
464
+
checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507"
465
+
dependencies = [
466
+
"portable-atomic",
467
+
]
468
+
469
+
[[package]]
470
+
name = "proc-macro2"
471
+
version = "1.0.103"
472
+
source = "registry+https://github.com/rust-lang/crates.io-index"
473
+
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
474
+
dependencies = [
475
+
"unicode-ident",
476
+
]
477
+
478
+
[[package]]
479
+
name = "quote"
480
+
version = "1.0.42"
481
+
source = "registry+https://github.com/rust-lang/crates.io-index"
482
+
checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
483
+
dependencies = [
484
+
"proc-macro2",
485
+
]
486
+
487
+
[[package]]
488
+
name = "rayon"
489
+
version = "1.11.0"
490
+
source = "registry+https://github.com/rust-lang/crates.io-index"
491
+
checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
492
+
dependencies = [
493
+
"either",
494
+
"rayon-core",
495
+
]
496
+
497
+
[[package]]
498
+
name = "rayon-core"
499
+
version = "1.13.0"
500
+
source = "registry+https://github.com/rust-lang/crates.io-index"
501
+
checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
502
+
dependencies = [
503
+
"crossbeam-deque",
504
+
"crossbeam-utils",
505
+
]
506
+
507
+
[[package]]
508
+
name = "regex"
509
+
version = "1.12.2"
510
+
source = "registry+https://github.com/rust-lang/crates.io-index"
511
+
checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"
512
+
dependencies = [
513
+
"aho-corasick",
514
+
"memchr",
515
+
"regex-automata",
516
+
"regex-syntax",
517
+
]
518
+
519
+
[[package]]
520
+
name = "regex-automata"
521
+
version = "0.4.13"
522
+
source = "registry+https://github.com/rust-lang/crates.io-index"
523
+
checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
524
+
dependencies = [
525
+
"aho-corasick",
526
+
"memchr",
527
+
"regex-syntax",
528
+
]
529
+
530
+
[[package]]
531
+
name = "regex-syntax"
532
+
version = "0.8.8"
533
+
source = "registry+https://github.com/rust-lang/crates.io-index"
534
+
checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
535
+
536
+
[[package]]
537
+
name = "rustversion"
538
+
version = "1.0.22"
539
+
source = "registry+https://github.com/rust-lang/crates.io-index"
540
+
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
541
+
542
+
[[package]]
543
+
name = "ryu"
544
+
version = "1.0.20"
545
+
source = "registry+https://github.com/rust-lang/crates.io-index"
546
+
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
547
+
548
+
[[package]]
549
+
name = "same-file"
550
+
version = "1.0.6"
551
+
source = "registry+https://github.com/rust-lang/crates.io-index"
552
+
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
553
+
dependencies = [
554
+
"winapi-util",
555
+
]
556
+
557
+
[[package]]
558
+
name = "serde"
559
+
version = "1.0.228"
560
+
source = "registry+https://github.com/rust-lang/crates.io-index"
561
+
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
562
+
dependencies = [
563
+
"serde_core",
564
+
"serde_derive",
565
+
]
566
+
567
+
[[package]]
568
+
name = "serde_core"
569
+
version = "1.0.228"
570
+
source = "registry+https://github.com/rust-lang/crates.io-index"
571
+
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
572
+
dependencies = [
573
+
"serde_derive",
574
+
]
575
+
576
+
[[package]]
577
+
name = "serde_derive"
578
+
version = "1.0.228"
579
+
source = "registry+https://github.com/rust-lang/crates.io-index"
580
+
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
581
+
dependencies = [
582
+
"proc-macro2",
583
+
"quote",
584
+
"syn",
585
+
]
586
+
587
+
[[package]]
588
+
name = "serde_json"
589
+
version = "1.0.145"
590
+
source = "registry+https://github.com/rust-lang/crates.io-index"
591
+
checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
592
+
dependencies = [
593
+
"itoa",
594
+
"memchr",
595
+
"ryu",
596
+
"serde",
597
+
"serde_core",
598
+
]
599
+
600
+
[[package]]
601
+
name = "shlex"
602
+
version = "1.3.0"
603
+
source = "registry+https://github.com/rust-lang/crates.io-index"
604
+
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
605
+
606
+
[[package]]
607
+
name = "syn"
608
+
version = "2.0.111"
609
+
source = "registry+https://github.com/rust-lang/crates.io-index"
610
+
checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
611
+
dependencies = [
612
+
"proc-macro2",
613
+
"quote",
614
+
"unicode-ident",
615
+
]
616
+
617
+
[[package]]
618
+
name = "tinytemplate"
619
+
version = "1.2.1"
620
+
source = "registry+https://github.com/rust-lang/crates.io-index"
621
+
checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
622
+
dependencies = [
623
+
"serde",
624
+
"serde_json",
625
+
]
626
+
627
+
[[package]]
628
+
name = "unicode-ident"
629
+
version = "1.0.22"
630
+
source = "registry+https://github.com/rust-lang/crates.io-index"
631
+
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
632
+
633
+
[[package]]
634
+
name = "utf8parse"
635
+
version = "0.2.2"
636
+
source = "registry+https://github.com/rust-lang/crates.io-index"
637
+
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
638
+
639
+
[[package]]
640
+
name = "walkdir"
641
+
version = "2.5.0"
642
+
source = "registry+https://github.com/rust-lang/crates.io-index"
643
+
checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
644
+
dependencies = [
645
+
"same-file",
646
+
"winapi-util",
647
+
]
648
+
649
+
[[package]]
650
+
name = "wasm-bindgen"
651
+
version = "0.2.106"
652
+
source = "registry+https://github.com/rust-lang/crates.io-index"
653
+
checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd"
654
+
dependencies = [
655
+
"cfg-if",
656
+
"once_cell",
657
+
"rustversion",
658
+
"wasm-bindgen-macro",
659
+
"wasm-bindgen-shared",
660
+
]
661
+
662
+
[[package]]
663
+
name = "wasm-bindgen-macro"
664
+
version = "0.2.106"
665
+
source = "registry+https://github.com/rust-lang/crates.io-index"
666
+
checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3"
667
+
dependencies = [
668
+
"quote",
669
+
"wasm-bindgen-macro-support",
670
+
]
671
+
672
+
[[package]]
673
+
name = "wasm-bindgen-macro-support"
674
+
version = "0.2.106"
675
+
source = "registry+https://github.com/rust-lang/crates.io-index"
676
+
checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40"
677
+
dependencies = [
678
+
"bumpalo",
679
+
"proc-macro2",
680
+
"quote",
681
+
"syn",
682
+
"wasm-bindgen-shared",
683
+
]
684
+
685
+
[[package]]
686
+
name = "wasm-bindgen-shared"
687
+
version = "0.2.106"
688
+
source = "registry+https://github.com/rust-lang/crates.io-index"
689
+
checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4"
690
+
dependencies = [
691
+
"unicode-ident",
692
+
]
693
+
694
+
[[package]]
695
+
name = "web-sys"
696
+
version = "0.3.83"
697
+
source = "registry+https://github.com/rust-lang/crates.io-index"
698
+
checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac"
699
+
dependencies = [
700
+
"js-sys",
701
+
"wasm-bindgen",
702
+
]
703
+
704
+
[[package]]
705
+
name = "winapi"
706
+
version = "0.3.9"
707
+
source = "registry+https://github.com/rust-lang/crates.io-index"
708
+
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
709
+
dependencies = [
710
+
"winapi-i686-pc-windows-gnu",
711
+
"winapi-x86_64-pc-windows-gnu",
712
+
]
713
+
714
+
[[package]]
715
+
name = "winapi-i686-pc-windows-gnu"
716
+
version = "0.4.0"
717
+
source = "registry+https://github.com/rust-lang/crates.io-index"
718
+
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
719
+
720
+
[[package]]
721
+
name = "winapi-util"
722
+
version = "0.1.11"
723
+
source = "registry+https://github.com/rust-lang/crates.io-index"
724
+
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
725
+
dependencies = [
726
+
"windows-sys",
727
+
]
728
+
729
+
[[package]]
730
+
name = "winapi-x86_64-pc-windows-gnu"
731
+
version = "0.4.0"
732
+
source = "registry+https://github.com/rust-lang/crates.io-index"
733
+
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
734
+
735
+
[[package]]
736
+
name = "windows-link"
737
+
version = "0.2.1"
738
+
source = "registry+https://github.com/rust-lang/crates.io-index"
739
+
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
740
+
741
+
[[package]]
742
+
name = "windows-sys"
743
+
version = "0.61.2"
744
+
source = "registry+https://github.com/rust-lang/crates.io-index"
745
+
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
746
+
dependencies = [
747
+
"windows-link",
748
+
]
749
+
750
+
[[package]]
751
+
name = "zerocopy"
752
+
version = "0.8.31"
753
+
source = "registry+https://github.com/rust-lang/crates.io-index"
754
+
checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3"
755
+
dependencies = [
756
+
"zerocopy-derive",
757
+
]
758
+
759
+
[[package]]
760
+
name = "zerocopy-derive"
761
+
version = "0.8.31"
762
+
source = "registry+https://github.com/rust-lang/crates.io-index"
763
+
checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a"
764
+
dependencies = [
765
+
"proc-macro2",
766
+
"quote",
767
+
"syn",
768
+
]
+18
2025/Cargo.toml
+18
2025/Cargo.toml
···
1
+
[package]
2
+
name = "aoc2025"
3
+
version = "0.1.0"
4
+
edition = "2024"
5
+
6
+
[dependencies]
7
+
anyhow = "1.0.100"
8
+
atoi_simd = "0.17.0"
9
+
env_logger = "0.11.8"
10
+
log = "0.4.29"
11
+
memchr = "2.7.6"
12
+
13
+
[dev-dependencies]
14
+
criterion = { version = "0.8.0", features = ["html_reports"] }
15
+
16
+
[[bench]]
17
+
name = "bench"
18
+
harness = false
+42
2025/benches/bench.rs
+42
2025/benches/bench.rs
···
1
+
use aoc2025::days;
2
+
use criterion::{Criterion, criterion_group, criterion_main};
3
+
use std::{hint::black_box, time::Duration};
4
+
5
+
static INPUT: &str = include_str!("../inputs/day2.txt");
6
+
7
+
fn bench_parse(c: &mut Criterion) {
8
+
c.bench_function("parse", |b| {
9
+
b.iter(|| days::two::parse(black_box(INPUT.as_bytes())))
10
+
});
11
+
}
12
+
13
+
fn bench_part_a(c: &mut Criterion) {
14
+
let input = days::two::parse(INPUT.as_bytes());
15
+
c.bench_function("part_a", |b| {
16
+
b.iter(|| days::two::part_a(black_box(input.clone())))
17
+
});
18
+
}
19
+
20
+
fn bench_part_b(c: &mut Criterion) {
21
+
let input = days::two::parse(INPUT.as_bytes());
22
+
c.bench_function("part_b", |b| {
23
+
b.iter(|| days::two::part_b(black_box(input.clone())))
24
+
});
25
+
}
26
+
27
+
fn bench_all(c: &mut Criterion) {
28
+
c.bench_function("main", |b| {
29
+
let input = days::two::parse(INPUT.as_bytes());
30
+
b.iter(|| {
31
+
days::two::part_a(black_box(input.clone()));
32
+
days::two::part_b(black_box(input.clone()));
33
+
})
34
+
});
35
+
}
36
+
37
+
criterion_group! {
38
+
name = benches;
39
+
config = Criterion::default().sample_size(100).measurement_time(Duration::from_secs(30)).plotting_backend(criterion::PlottingBackend::Plotters);
40
+
targets = bench_parse, bench_part_a, bench_part_b, bench_all
41
+
}
42
+
criterion_main!(benches);
+45
2025/nilla.nix
+45
2025/nilla.nix
···
1
+
let
2
+
pins = import ./npins;
3
+
4
+
nilla = import pins.nilla;
5
+
in
6
+
nilla.create ({ config }: {
7
+
config = {
8
+
inputs = {
9
+
fenix = {
10
+
src = pins.fenix;
11
+
};
12
+
13
+
nixpkgs = {
14
+
src = pins.nixpkgs;
15
+
16
+
settings = {
17
+
overlays = [
18
+
config.inputs.fenix.result.overlays.default
19
+
];
20
+
};
21
+
};
22
+
};
23
+
24
+
shells.default = config.shells.rust;
25
+
shells.rust = {
26
+
systems = [ "x86_64-linux" ];
27
+
28
+
shell = { mkShell, fenix, bacon, pkg-config, ... }:
29
+
mkShell {
30
+
packages = [
31
+
(fenix.complete.withComponents [
32
+
"cargo"
33
+
"clippy"
34
+
"rust-src"
35
+
"rustc"
36
+
"rustfmt"
37
+
"rust-analyzer"
38
+
])
39
+
bacon
40
+
pkg-config
41
+
];
42
+
};
43
+
};
44
+
};
45
+
})
+247
2025/npins/default.nix
+247
2025/npins/default.nix
···
1
+
/*
2
+
This file is provided under the MIT licence:
3
+
4
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the โSoftwareโ), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
+
6
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7
+
8
+
THE SOFTWARE IS PROVIDED โAS ISโ, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+
*/
10
+
# Generated by npins. Do not modify; will be overwritten regularly
11
+
let
12
+
# Backwards-compatibly make something that previously didn't take any arguments take some
13
+
# The function must return an attrset, and will unfortunately be eagerly evaluated
14
+
# Same thing, but it catches eval errors on the default argument so that one may still call it with other arguments
15
+
mkFunctor =
16
+
fn:
17
+
let
18
+
e = builtins.tryEval (fn { });
19
+
in
20
+
(if e.success then e.value else { error = fn { }; }) // { __functor = _self: fn; };
21
+
22
+
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295
23
+
range =
24
+
first: last: if first > last then [ ] else builtins.genList (n: first + n) (last - first + 1);
25
+
26
+
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257
27
+
stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1));
28
+
29
+
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269
30
+
stringAsChars = f: s: concatStrings (map f (stringToCharacters s));
31
+
concatStrings = builtins.concatStringsSep "";
32
+
33
+
# If the environment variable NPINS_OVERRIDE_${name} is set, then use
34
+
# the path directly as opposed to the fetched source.
35
+
# (Taken from Niv for compatibility)
36
+
mayOverride =
37
+
name: path:
38
+
let
39
+
envVarName = "NPINS_OVERRIDE_${saneName}";
40
+
saneName = stringAsChars (c: if (builtins.match "[a-zA-Z0-9]" c) == null then "_" else c) name;
41
+
ersatz = builtins.getEnv envVarName;
42
+
in
43
+
if ersatz == "" then
44
+
path
45
+
else
46
+
# this turns the string into an actual Nix path (for both absolute and
47
+
# relative paths)
48
+
builtins.trace "Overriding path of \"${name}\" with \"${ersatz}\" due to set \"${envVarName}\"" (
49
+
if builtins.substring 0 1 ersatz == "/" then
50
+
/. + ersatz
51
+
else
52
+
/. + builtins.getEnv "PWD" + "/${ersatz}"
53
+
);
54
+
55
+
mkSource =
56
+
name: spec:
57
+
{
58
+
pkgs ? null,
59
+
}:
60
+
assert spec ? type;
61
+
let
62
+
# Unify across builtin and pkgs fetchers.
63
+
# `fetchGit` requires a wrapper because of slight API differences.
64
+
fetchers =
65
+
if pkgs == null then
66
+
{
67
+
inherit (builtins) fetchTarball fetchurl;
68
+
# For some fucking reason, fetchGit has a different signature than the other builtin fetchers โฆ
69
+
fetchGit = args: (builtins.fetchGit args).outPath;
70
+
}
71
+
else
72
+
{
73
+
fetchTarball =
74
+
{
75
+
url,
76
+
sha256,
77
+
}:
78
+
pkgs.fetchzip {
79
+
inherit url sha256;
80
+
extension = "tar";
81
+
};
82
+
inherit (pkgs) fetchurl;
83
+
fetchGit =
84
+
{
85
+
url,
86
+
submodules,
87
+
rev,
88
+
name,
89
+
narHash,
90
+
}:
91
+
pkgs.fetchgit {
92
+
inherit url rev name;
93
+
fetchSubmodules = submodules;
94
+
hash = narHash;
95
+
};
96
+
};
97
+
98
+
# Dispatch to the correct code path based on the type
99
+
path =
100
+
if spec.type == "Git" then
101
+
mkGitSource fetchers spec
102
+
else if spec.type == "GitRelease" then
103
+
mkGitSource fetchers spec
104
+
else if spec.type == "PyPi" then
105
+
mkPyPiSource fetchers spec
106
+
else if spec.type == "Channel" then
107
+
mkChannelSource fetchers spec
108
+
else if spec.type == "Tarball" then
109
+
mkTarballSource fetchers spec
110
+
else if spec.type == "Container" then
111
+
mkContainerSource pkgs spec
112
+
else
113
+
builtins.throw "Unknown source type ${spec.type}";
114
+
in
115
+
spec // { outPath = mayOverride name path; };
116
+
117
+
mkGitSource =
118
+
{
119
+
fetchTarball,
120
+
fetchGit,
121
+
...
122
+
}:
123
+
{
124
+
repository,
125
+
revision,
126
+
url ? null,
127
+
submodules,
128
+
hash,
129
+
...
130
+
}:
131
+
assert repository ? type;
132
+
# At the moment, either it is a plain git repository (which has an url), or it is a GitHub/GitLab repository
133
+
# In the latter case, there we will always be an url to the tarball
134
+
if url != null && !submodules then
135
+
fetchTarball {
136
+
inherit url;
137
+
sha256 = hash;
138
+
}
139
+
else
140
+
let
141
+
url =
142
+
if repository.type == "Git" then
143
+
repository.url
144
+
else if repository.type == "GitHub" then
145
+
"https://github.com/${repository.owner}/${repository.repo}.git"
146
+
else if repository.type == "GitLab" then
147
+
"${repository.server}/${repository.repo_path}.git"
148
+
else
149
+
throw "Unrecognized repository type ${repository.type}";
150
+
urlToName =
151
+
url: rev:
152
+
let
153
+
matched = builtins.match "^.*/([^/]*)(\\.git)?$" url;
154
+
155
+
short = builtins.substring 0 7 rev;
156
+
157
+
appendShort = if (builtins.match "[a-f0-9]*" rev) != null then "-${short}" else "";
158
+
in
159
+
"${if matched == null then "source" else builtins.head matched}${appendShort}";
160
+
name = urlToName url revision;
161
+
in
162
+
fetchGit {
163
+
rev = revision;
164
+
narHash = hash;
165
+
166
+
inherit name submodules url;
167
+
};
168
+
169
+
mkPyPiSource =
170
+
{ fetchurl, ... }:
171
+
{
172
+
url,
173
+
hash,
174
+
...
175
+
}:
176
+
fetchurl {
177
+
inherit url;
178
+
sha256 = hash;
179
+
};
180
+
181
+
mkChannelSource =
182
+
{ fetchTarball, ... }:
183
+
{
184
+
url,
185
+
hash,
186
+
...
187
+
}:
188
+
fetchTarball {
189
+
inherit url;
190
+
sha256 = hash;
191
+
};
192
+
193
+
mkTarballSource =
194
+
{ fetchTarball, ... }:
195
+
{
196
+
url,
197
+
locked_url ? url,
198
+
hash,
199
+
...
200
+
}:
201
+
fetchTarball {
202
+
url = locked_url;
203
+
sha256 = hash;
204
+
};
205
+
206
+
mkContainerSource =
207
+
pkgs:
208
+
{
209
+
image_name,
210
+
image_tag,
211
+
image_digest,
212
+
...
213
+
}:
214
+
if pkgs == null then
215
+
builtins.throw "container sources require passing in a Nixpkgs value: https://github.com/andir/npins/blob/master/README.md#using-the-nixpkgs-fetchers"
216
+
else
217
+
pkgs.dockerTools.pullImage {
218
+
imageName = image_name;
219
+
imageDigest = image_digest;
220
+
finalImageTag = image_tag;
221
+
};
222
+
in
223
+
mkFunctor (
224
+
{
225
+
input ? ./sources.json,
226
+
}:
227
+
let
228
+
data =
229
+
if builtins.isPath input then
230
+
# while `readFile` will throw an error anyways if the path doesn't exist,
231
+
# we still need to check beforehand because *our* error can be caught but not the one from the builtin
232
+
# *piegames sighs*
233
+
if builtins.pathExists input then
234
+
builtins.fromJSON (builtins.readFile input)
235
+
else
236
+
throw "Input path ${toString input} does not exist"
237
+
else if builtins.isAttrs input then
238
+
input
239
+
else
240
+
throw "Unsupported input type ${builtins.typeOf input}, must be a path or an attrset";
241
+
version = data.version;
242
+
in
243
+
if version == 7 then
244
+
builtins.mapAttrs (name: spec: mkFunctor (mkSource name spec)) data.pins
245
+
else
246
+
throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`"
247
+
)
+44
2025/npins/sources.json
+44
2025/npins/sources.json
···
1
+
{
2
+
"pins": {
3
+
"fenix": {
4
+
"type": "Git",
5
+
"repository": {
6
+
"type": "GitHub",
7
+
"owner": "nix-community",
8
+
"repo": "fenix"
9
+
},
10
+
"branch": "monthly",
11
+
"submodules": false,
12
+
"revision": "df3c2e78ec13418f85c1f26e77a50f865ec57d38",
13
+
"url": "https://github.com/nix-community/fenix/archive/df3c2e78ec13418f85c1f26e77a50f865ec57d38.tar.gz",
14
+
"hash": "sha256-+oo9W5rz03TjfpNqDSLEQwgKiuBbjrHdORyTHli2RuM="
15
+
},
16
+
"nilla": {
17
+
"type": "Git",
18
+
"repository": {
19
+
"type": "GitHub",
20
+
"owner": "nilla-nix",
21
+
"repo": "nilla"
22
+
},
23
+
"branch": "main",
24
+
"submodules": false,
25
+
"revision": "6d814dafa6f397ac2087333e5515c617faccba6f",
26
+
"url": "https://github.com/nilla-nix/nilla/archive/6d814dafa6f397ac2087333e5515c617faccba6f.tar.gz",
27
+
"hash": "sha256-A4zg3po1tyfh1if+LIllKtUGoWLFSwJSztvH2MG22qU="
28
+
},
29
+
"nixpkgs": {
30
+
"type": "Git",
31
+
"repository": {
32
+
"type": "GitHub",
33
+
"owner": "nixos",
34
+
"repo": "nixpkgs"
35
+
},
36
+
"branch": "nixos-unstable",
37
+
"submodules": false,
38
+
"revision": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c",
39
+
"url": "https://github.com/nixos/nixpkgs/archive/2d293cbfa5a793b4c50d17c05ef9e385b90edf6c.tar.gz",
40
+
"hash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4="
41
+
}
42
+
},
43
+
"version": 7
44
+
}
+79
2025/src/days/one/mod.rs
+79
2025/src/days/one/mod.rs
···
1
+
use atoi_simd::parse as parse_i32;
2
+
3
+
pub fn main() -> anyhow::Result<()> {
4
+
crate::run("Secret Entrance", "inputs/day1.txt", parse, part_a, part_b)
5
+
}
6
+
7
+
fn parse(input: &[u8]) -> Vec<i32> {
8
+
let mut out = Vec::with_capacity(input.iter().filter(|&b| *b == b'\n').count());
9
+
let mut start = 0;
10
+
11
+
while start < input.len() {
12
+
let end = match memchr::memchr(b'\n', &input[start..]) {
13
+
Some(index) => start + index,
14
+
None => input.len(),
15
+
};
16
+
let line = &input[start..end];
17
+
18
+
if !line.is_empty() {
19
+
let mut buf = [0u8; 4];
20
+
let mut len = 0usize;
21
+
let mut seen_digit = false;
22
+
23
+
for &b in line {
24
+
match b {
25
+
b'L' => {
26
+
if len == 0 {
27
+
buf[len] = b'-';
28
+
len += 1;
29
+
}
30
+
}
31
+
b'0'..=b'9' => {
32
+
seen_digit = true;
33
+
buf[len] = b;
34
+
len += 1;
35
+
}
36
+
_ => {
37
+
len = 0;
38
+
break;
39
+
}
40
+
}
41
+
}
42
+
if seen_digit && len > 0 {
43
+
if let Ok(num) = parse_i32(&buf[..len]) {
44
+
out.push(num);
45
+
}
46
+
}
47
+
}
48
+
49
+
start = end + 1;
50
+
}
51
+
52
+
out
53
+
}
54
+
55
+
fn part_a(input: Vec<i32>) -> usize {
56
+
input
57
+
.iter()
58
+
.scan(50, |state, &rotation| {
59
+
*state += rotation;
60
+
Some(*state)
61
+
})
62
+
.filter(|&state| state % 100 == 0)
63
+
.count()
64
+
}
65
+
66
+
fn part_b(input: Vec<i32>) -> usize {
67
+
input
68
+
.iter()
69
+
.scan(50, |state, &rotation| {
70
+
let mut passes = (rotation / 100).abs() as usize;
71
+
let turn = rotation % 100;
72
+
if *state + turn <= 0 && *state != 0 || 99 < *state + turn {
73
+
passes += 1;
74
+
}
75
+
*state = (*state + turn).rem_euclid(100);
76
+
Some(passes)
77
+
})
78
+
.sum()
79
+
}
+105
2025/src/days/two/mod.rs
+105
2025/src/days/two/mod.rs
···
1
+
use atoi_simd::parse as parse_u64;
2
+
3
+
pub fn main() -> anyhow::Result<()> {
4
+
crate::run("Gift Shop", "inputs/day2.txt", parse, part_a, part_b)
5
+
}
6
+
7
+
pub fn parse(input: &[u8]) -> Vec<u64> {
8
+
let mut out = Vec::new();
9
+
let mut start = 0;
10
+
11
+
while start < input.len() {
12
+
let rest = &input[start..];
13
+
let end = memchr::memchr2(b',', b'\n', rest).map_or(input.len(), |i| start + i);
14
+
let range = &input[start..end];
15
+
16
+
let dash = memchr::memchr(b'-', range).expect("invalid input: missing '-'");
17
+
18
+
let min = parse_u64::<u64>(&range[..dash]).expect("invalid input: invalid min");
19
+
let max = parse_u64::<u64>(&range[dash + 1..]).expect("invalid input: invalid max");
20
+
21
+
out.extend(min..=max);
22
+
start = if end == input.len() { end } else { end + 1 };
23
+
}
24
+
25
+
out
26
+
}
27
+
28
+
pub fn part_a(input: Vec<u64>) -> usize {
29
+
input.iter().fold(0, |acc, x| {
30
+
acc + if is_valid_id_a(x.clone()) {
31
+
0
32
+
} else {
33
+
*x as usize
34
+
}
35
+
})
36
+
}
37
+
38
+
fn is_valid_id_a(id: u64) -> bool {
39
+
// invalid ID's are identifiable due to them being made up from some sequences being repeated
40
+
// eg: 11 -> [1, 1] invalid
41
+
// eg: 123123 -> [123, 123] invalid
42
+
// eg: 123456 -> [123456] valid
43
+
let digits = id.ilog10() + 1;
44
+
if digits % 2 == 1 {
45
+
return true;
46
+
}
47
+
48
+
let div = 10u64.pow(digits / 2);
49
+
50
+
let left = id / div;
51
+
let right = id % div;
52
+
left != right
53
+
}
54
+
55
+
fn is_valid_id_b(mut id: u64) -> bool {
56
+
// invalid ID's are identifiable due to them being made up from some sequences being repeated
57
+
// eg: 11 -> [1, 1] invalid
58
+
// eg: 123123 -> [123, 123] invalid
59
+
// eg: 121212 -> [12, 12, 12] invalid
60
+
// eg: 111 -> [1, 1, 1] invalid
61
+
// eg: 123456 -> [123456] valid
62
+
let mut digits = [0u8; 10];
63
+
let mut len = 0;
64
+
65
+
if id == 0 {
66
+
digits[0] = b'0';
67
+
len = 1;
68
+
} else {
69
+
while id > 0 {
70
+
digits[len] = b'0' + (id % 10) as u8;
71
+
len += 1;
72
+
id /= 10;
73
+
}
74
+
digits[..len].reverse();
75
+
}
76
+
77
+
if len < 2 {
78
+
return true;
79
+
}
80
+
81
+
let mut pi = [0usize; 10];
82
+
for i in 1..len {
83
+
let mut j = pi[i - 1];
84
+
while j > 0 && digits[i] != digits[j] {
85
+
j = pi[j - 1];
86
+
}
87
+
if digits[i] == digits[j] {
88
+
j += 1;
89
+
}
90
+
pi[i] = j;
91
+
}
92
+
93
+
let smallest_period = len - pi[len - 1];
94
+
!(smallest_period < len && len % smallest_period == 0)
95
+
}
96
+
97
+
pub fn part_b(input: Vec<u64>) -> usize {
98
+
input.iter().fold(0, |acc, x| {
99
+
acc + if is_valid_id_b(x.clone()) {
100
+
0usize
101
+
} else {
102
+
*x as usize
103
+
}
104
+
})
105
+
}
+63
2025/src/lib.rs
+63
2025/src/lib.rs
···
1
+
pub mod days;
2
+
3
+
use std::{fmt::Display, fs, time::Instant};
4
+
5
+
use anyhow::Result;
6
+
use log::info;
7
+
8
+
pub fn run<T, P, A, B, RA, RB>(
9
+
name: &str,
10
+
input_path: &str,
11
+
parse: P,
12
+
part_a: A,
13
+
part_b: B,
14
+
) -> Result<()>
15
+
where
16
+
T: Clone,
17
+
P: Fn(&[u8]) -> T,
18
+
A: Fn(T) -> RA,
19
+
B: Fn(T) -> RB,
20
+
RA: Display,
21
+
RB: Display,
22
+
{
23
+
let _ = env_logger::try_init();
24
+
let file = &fs::read_to_string(input_path)?;
25
+
let bytes = file.as_bytes();
26
+
let label_parse = format!("{name} Parse");
27
+
let parse_start = Instant::now();
28
+
let input = parse(bytes);
29
+
let parse_elapsed = parse_start.elapsed();
30
+
info!("{label_parse}");
31
+
info!("{}", "-".repeat(label_parse.len()));
32
+
info!("Parse time: {:?}", parse_elapsed);
33
+
34
+
info!("");
35
+
36
+
let label_a = format!("{name} Part A");
37
+
info!("{label_a}");
38
+
info!("{}", "-".repeat(label_a.len()));
39
+
let part_a_start = Instant::now();
40
+
info!("Part A answer: {}", part_a(input.clone()));
41
+
let part_a_elapsed = part_a_start.elapsed();
42
+
info!("Part A time: {:?}", part_a_elapsed);
43
+
44
+
info!("");
45
+
46
+
let label_b = format!("{name} Part B");
47
+
info!("{label_b}");
48
+
info!("{}", "-".repeat(label_b.len()));
49
+
let part_b_start = Instant::now();
50
+
info!("Part B answer: {}", part_b(input.clone()));
51
+
let part_b_elapsed = part_b_start.elapsed();
52
+
info!("Part B time: {:?}", part_b_elapsed);
53
+
54
+
info!("");
55
+
56
+
info!("Challenge time: {:?}", part_a_elapsed + part_b_elapsed);
57
+
info!(
58
+
"Total time: {:?}",
59
+
part_a_elapsed + part_b_elapsed + parse_elapsed
60
+
);
61
+
62
+
Ok(())
63
+
}
+4
2025/src/main.rs
+4
2025/src/main.rs
-1
day_1/.gitignore
-1
day_1/.gitignore
···
1
-
/target
-7
day_1/Cargo.lock
-7
day_1/Cargo.lock
-6
day_1/Cargo.toml
-6
day_1/Cargo.toml
-1000
day_1/input.txt
-1000
day_1/input.txt
···
1
-
77221 93653
2
-
61169 27995
3
-
49546 69782
4
-
11688 41563
5
-
15820 48282
6
-
63235 37517
7
-
28850 68189
8
-
80735 25255
9
-
42616 65322
10
-
55068 99897
11
-
30851 35509
12
-
14907 49013
13
-
64732 92011
14
-
16709 68830
15
-
67643 36207
16
-
44080 23559
17
-
96480 58330
18
-
99450 40186
19
-
21169 63410
20
-
58096 21671
21
-
53828 79572
22
-
47026 44529
23
-
90101 28656
24
-
45773 73412
25
-
71303 85991
26
-
45304 78294
27
-
96528 23559
28
-
19794 17882
29
-
74831 17211
30
-
88912 11644
31
-
98961 80435
32
-
15788 96101
33
-
16350 86995
34
-
96806 19028
35
-
99959 77868
36
-
58887 90255
37
-
42568 25255
38
-
29278 88912
39
-
94028 63269
40
-
42810 21548
41
-
97490 71747
42
-
89051 24477
43
-
73916 31808
44
-
97751 88912
45
-
73608 77868
46
-
62426 13754
47
-
29429 36177
48
-
11070 10894
49
-
78656 85185
50
-
31308 60500
51
-
96166 91114
52
-
36906 85134
53
-
99662 77868
54
-
66402 41563
55
-
37085 14475
56
-
80907 53324
57
-
61650 53324
58
-
84223 63753
59
-
83891 47827
60
-
15973 77536
61
-
68843 40593
62
-
98854 31274
63
-
42426 97404
64
-
25255 67531
65
-
44559 50141
66
-
93909 50674
67
-
28070 32858
68
-
24880 24813
69
-
29338 89795
70
-
64883 77868
71
-
66924 57646
72
-
32984 66502
73
-
32238 39062
74
-
38816 23559
75
-
58770 65322
76
-
74953 91636
77
-
70592 19028
78
-
93111 11644
79
-
31065 23537
80
-
67370 19028
81
-
18314 47412
82
-
71075 74334
83
-
21544 44529
84
-
59137 50980
85
-
20440 80749
86
-
14393 38495
87
-
72130 90255
88
-
43828 68830
89
-
23262 73660
90
-
11923 50980
91
-
47754 14164
92
-
96043 34362
93
-
27162 28090
94
-
20838 50713
95
-
75009 11121
96
-
92099 31274
97
-
22054 38248
98
-
43518 80106
99
-
68189 13153
100
-
50520 12727
101
-
51425 40674
102
-
42998 31053
103
-
52443 33051
104
-
37256 54436
105
-
16648 95555
106
-
81123 17329
107
-
46974 79835
108
-
36328 77868
109
-
76373 23559
110
-
82592 70046
111
-
70600 22417
112
-
27116 89690
113
-
28090 34969
114
-
86348 23559
115
-
53145 50980
116
-
30203 83301
117
-
23347 77681
118
-
76433 26236
119
-
28046 92869
120
-
58920 50980
121
-
25518 28090
122
-
12791 44529
123
-
61967 31808
124
-
98022 53056
125
-
24326 12263
126
-
41095 13121
127
-
24045 82448
128
-
31274 16530
129
-
78021 21589
130
-
63029 19658
131
-
75684 14475
132
-
31258 36493
133
-
40561 48589
134
-
20457 54974
135
-
14783 88465
136
-
39433 23537
137
-
34774 53324
138
-
10455 14329
139
-
26338 74416
140
-
55227 37003
141
-
36963 40380
142
-
31910 68189
143
-
94894 18220
144
-
23166 44111
145
-
48884 46787
146
-
73036 89795
147
-
83519 25205
148
-
50205 93653
149
-
85926 50141
150
-
69194 23559
151
-
25529 11642
152
-
10182 31274
153
-
13638 61987
154
-
83588 19028
155
-
75911 20768
156
-
44692 24325
157
-
43278 94888
158
-
48148 24394
159
-
86205 99327
160
-
82605 58818
161
-
52770 68189
162
-
89068 84917
163
-
66452 83679
164
-
50217 85099
165
-
64914 52073
166
-
76460 78294
167
-
43026 24410
168
-
44179 50980
169
-
47653 90255
170
-
78061 50980
171
-
14475 71478
172
-
77868 37150
173
-
99645 28090
174
-
86267 70055
175
-
58072 68830
176
-
96428 66585
177
-
77501 50141
178
-
52344 93653
179
-
49534 35509
180
-
46925 12437
181
-
40005 87987
182
-
17329 86995
183
-
17585 89795
184
-
32296 59660
185
-
81836 11644
186
-
89435 65322
187
-
55149 59423
188
-
56971 50141
189
-
26342 95142
190
-
57894 56227
191
-
49762 33007
192
-
48949 65641
193
-
40453 53505
194
-
67613 23537
195
-
27110 87987
196
-
25231 63910
197
-
92546 50713
198
-
70074 27554
199
-
39649 93653
200
-
93231 30520
201
-
60008 79179
202
-
18449 47209
203
-
68828 36207
204
-
18908 72254
205
-
55426 44661
206
-
62522 87987
207
-
60923 25255
208
-
85721 68107
209
-
35153 71814
210
-
20053 24813
211
-
24233 22904
212
-
36237 92731
213
-
92077 68189
214
-
30105 50674
215
-
37032 90255
216
-
12745 54116
217
-
41563 53324
218
-
24700 29145
219
-
60226 85335
220
-
50713 64775
221
-
29972 51790
222
-
79176 19794
223
-
40017 96101
224
-
90724 41345
225
-
51608 39176
226
-
46178 50141
227
-
26151 23489
228
-
19569 44529
229
-
34368 86052
230
-
18948 50801
231
-
62091 17329
232
-
89749 38984
233
-
68315 37514
234
-
52396 19794
235
-
14981 14475
236
-
36038 69571
237
-
50048 50980
238
-
60796 41563
239
-
69942 72877
240
-
80976 25234
241
-
56722 90255
242
-
49489 28090
243
-
60768 65557
244
-
70753 85065
245
-
15233 23522
246
-
94697 87600
247
-
40958 41532
248
-
91709 40116
249
-
83586 19028
250
-
88140 24977
251
-
56993 50980
252
-
17980 53324
253
-
12421 97982
254
-
30183 40884
255
-
50452 53324
256
-
91314 90651
257
-
69995 19028
258
-
16588 28090
259
-
22432 98658
260
-
86088 77868
261
-
46361 65322
262
-
97178 75705
263
-
37444 79320
264
-
12275 96101
265
-
47016 16942
266
-
36822 87327
267
-
62082 31274
268
-
68265 64314
269
-
87344 24603
270
-
40642 23559
271
-
87254 38755
272
-
62372 50713
273
-
89026 68830
274
-
88519 96101
275
-
53514 31808
276
-
24686 41563
277
-
23817 68705
278
-
26704 89031
279
-
37908 65322
280
-
22665 35601
281
-
75378 59200
282
-
16797 86995
283
-
55847 68189
284
-
55932 72688
285
-
41470 96101
286
-
43557 17329
287
-
45439 77868
288
-
41230 76226
289
-
25104 92869
290
-
43736 93653
291
-
85938 93653
292
-
74153 54726
293
-
73956 70350
294
-
70419 37102
295
-
81275 64160
296
-
30656 32684
297
-
46218 32617
298
-
67969 31808
299
-
61544 81806
300
-
39376 56568
301
-
14769 60336
302
-
10199 97703
303
-
61064 40091
304
-
75531 30486
305
-
17211 31808
306
-
75184 74633
307
-
24565 61765
308
-
83922 44529
309
-
11644 25255
310
-
71836 14393
311
-
53030 19028
312
-
83437 33190
313
-
33687 54998
314
-
92054 82083
315
-
48250 68533
316
-
10977 34363
317
-
51050 19028
318
-
80898 68276
319
-
26442 68830
320
-
39875 65514
321
-
24976 76417
322
-
31946 23537
323
-
95278 90255
324
-
71678 26450
325
-
49641 28580
326
-
12962 13674
327
-
13598 30362
328
-
40620 21256
329
-
49062 92869
330
-
88449 79529
331
-
80153 94081
332
-
36918 70556
333
-
77902 99228
334
-
41848 99097
335
-
26032 39378
336
-
23830 50980
337
-
49712 78294
338
-
95464 65322
339
-
76971 27393
340
-
67074 22132
341
-
17629 71246
342
-
92019 92869
343
-
20780 96521
344
-
68372 16880
345
-
49710 88060
346
-
94680 52634
347
-
28626 57101
348
-
31808 60809
349
-
25578 28090
350
-
12020 25255
351
-
46008 33046
352
-
27712 36207
353
-
17168 53033
354
-
92923 87987
355
-
94668 65843
356
-
59490 48858
357
-
69085 38485
358
-
28242 14664
359
-
18302 96101
360
-
64047 71241
361
-
62752 73532
362
-
28873 59278
363
-
22206 18029
364
-
57298 85374
365
-
26420 78294
366
-
74055 30817
367
-
74377 45566
368
-
81846 17058
369
-
35184 27305
370
-
72054 89795
371
-
78666 41563
372
-
80545 96101
373
-
69240 51322
374
-
76319 36831
375
-
23617 14475
376
-
53848 93653
377
-
65082 36888
378
-
18802 93491
379
-
63942 23559
380
-
80208 22876
381
-
17018 68830
382
-
78018 51611
383
-
35520 75130
384
-
43479 88543
385
-
18522 96101
386
-
41260 15010
387
-
58041 21675
388
-
96272 68830
389
-
73601 78294
390
-
44788 52104
391
-
67152 89795
392
-
57671 61399
393
-
33841 56764
394
-
41963 53394
395
-
41010 28090
396
-
53937 65322
397
-
75472 76675
398
-
22253 92068
399
-
24277 93653
400
-
62012 14475
401
-
27539 50141
402
-
29180 41637
403
-
27151 35922
404
-
28752 23559
405
-
31602 47673
406
-
80298 50906
407
-
94689 38297
408
-
87987 48139
409
-
51692 61967
410
-
93653 86995
411
-
99694 96638
412
-
50948 11644
413
-
87830 19794
414
-
57579 93403
415
-
60947 72082
416
-
18514 53324
417
-
99194 25255
418
-
57630 93653
419
-
49914 10526
420
-
34613 94340
421
-
32145 16105
422
-
39569 62764
423
-
14118 31274
424
-
38901 19016
425
-
47443 66925
426
-
83812 31274
427
-
61920 50141
428
-
88684 50713
429
-
32305 31808
430
-
58695 50713
431
-
20016 42720
432
-
68955 31976
433
-
96299 99509
434
-
83258 96101
435
-
49424 68830
436
-
97130 14043
437
-
34668 50936
438
-
27567 35509
439
-
57890 65959
440
-
58399 78860
441
-
88934 50980
442
-
70656 66788
443
-
91507 44529
444
-
53671 87987
445
-
75858 71137
446
-
14726 13674
447
-
25416 31274
448
-
90521 50075
449
-
37289 96101
450
-
79415 19028
451
-
21158 25355
452
-
53210 16168
453
-
35192 81526
454
-
67240 23559
455
-
42967 65310
456
-
81598 93094
457
-
12765 36207
458
-
23853 41643
459
-
78439 22984
460
-
13052 50141
461
-
56642 93653
462
-
19028 82791
463
-
89371 36244
464
-
89795 50799
465
-
41542 90489
466
-
49486 72630
467
-
26630 50763
468
-
35019 68830
469
-
62271 78294
470
-
16433 77868
471
-
42466 57338
472
-
63666 39984
473
-
56231 83564
474
-
51132 96101
475
-
33675 74200
476
-
94670 70445
477
-
51236 17822
478
-
52493 64460
479
-
45346 86995
480
-
41620 31274
481
-
80479 88912
482
-
46200 90255
483
-
13789 60686
484
-
98564 76843
485
-
44974 92717
486
-
76047 80674
487
-
60650 89430
488
-
55723 45722
489
-
89426 97853
490
-
33961 98414
491
-
32872 68189
492
-
65322 12029
493
-
29922 36159
494
-
74923 34697
495
-
37065 59688
496
-
66622 23559
497
-
68253 14475
498
-
28664 53324
499
-
62981 25761
500
-
83161 50674
501
-
22849 50980
502
-
11119 76308
503
-
22980 13794
504
-
76171 19411
505
-
96351 28221
506
-
45573 90255
507
-
19850 79146
508
-
97828 90483
509
-
23867 85271
510
-
36353 50141
511
-
46579 87987
512
-
73434 23559
513
-
57169 68189
514
-
68768 41682
515
-
59354 97617
516
-
62181 64641
517
-
34167 53324
518
-
28374 24803
519
-
55863 57352
520
-
25058 33040
521
-
76126 53005
522
-
97283 51641
523
-
25887 29253
524
-
43067 50713
525
-
51616 61868
526
-
97533 16129
527
-
50692 80951
528
-
43173 41626
529
-
93917 76055
530
-
84713 53465
531
-
24130 13599
532
-
56773 50980
533
-
15310 44529
534
-
63375 50141
535
-
75875 93653
536
-
22284 33135
537
-
46294 77836
538
-
29713 14393
539
-
95318 83346
540
-
83264 61967
541
-
39267 47771
542
-
61101 86995
543
-
47882 96101
544
-
24345 70347
545
-
50674 14475
546
-
17296 12880
547
-
52605 11644
548
-
40817 78294
549
-
36207 93653
550
-
16045 96101
551
-
91784 68830
552
-
34583 69934
553
-
71867 28090
554
-
74898 22671
555
-
54609 27206
556
-
33070 26257
557
-
18570 57394
558
-
16766 87036
559
-
62825 21503
560
-
39793 17504
561
-
12038 82452
562
-
37265 12706
563
-
69479 44529
564
-
96101 44260
565
-
49175 50713
566
-
70708 55412
567
-
50136 14475
568
-
27300 96101
569
-
75794 62368
570
-
10277 87990
571
-
30825 87987
572
-
35563 24149
573
-
12505 91890
574
-
11323 14393
575
-
89922 84455
576
-
10927 65359
577
-
50656 71304
578
-
47973 11644
579
-
17156 92869
580
-
98964 96101
581
-
50980 59345
582
-
94733 23559
583
-
22743 26134
584
-
90255 54273
585
-
80006 65322
586
-
10157 92869
587
-
70496 28090
588
-
25569 41226
589
-
79982 92869
590
-
34897 76485
591
-
83357 86388
592
-
26352 79503
593
-
67432 15174
594
-
49155 72153
595
-
36311 86995
596
-
14394 65333
597
-
70928 51667
598
-
67367 23559
599
-
48195 57003
600
-
52001 26154
601
-
63251 21651
602
-
21894 89795
603
-
50774 43252
604
-
85637 36207
605
-
79243 11644
606
-
49512 57954
607
-
22454 15919
608
-
84214 20805
609
-
67121 86995
610
-
49247 78035
611
-
79313 34840
612
-
33168 19814
613
-
48657 92888
614
-
59824 74905
615
-
30088 68830
616
-
74246 90052
617
-
78389 65322
618
-
88418 28090
619
-
93716 62226
620
-
74962 29324
621
-
47309 50980
622
-
93517 14393
623
-
23895 68175
624
-
34548 25255
625
-
32628 84730
626
-
55988 31274
627
-
82578 40953
628
-
51728 16926
629
-
19440 27805
630
-
42922 45159
631
-
52930 41563
632
-
91562 31274
633
-
23559 62680
634
-
92150 26879
635
-
78315 61783
636
-
43601 91325
637
-
87621 17838
638
-
78580 65350
639
-
94778 77868
640
-
68519 83273
641
-
35509 66389
642
-
82288 52439
643
-
65083 19794
644
-
86995 13010
645
-
66618 95850
646
-
18656 70145
647
-
98537 65322
648
-
60842 52161
649
-
68830 10132
650
-
99689 24077
651
-
33740 89795
652
-
45595 53090
653
-
78239 36207
654
-
20185 36207
655
-
87307 69366
656
-
83009 77868
657
-
34685 88642
658
-
13674 28090
659
-
82450 69909
660
-
44812 75146
661
-
54296 92869
662
-
73558 94990
663
-
21422 48229
664
-
49473 10547
665
-
66108 68189
666
-
71169 74202
667
-
78276 40690
668
-
82977 78294
669
-
61842 15634
670
-
31582 95459
671
-
39064 14475
672
-
70204 18593
673
-
71244 87987
674
-
31642 50490
675
-
98413 37109
676
-
61175 50141
677
-
37168 23559
678
-
44093 11032
679
-
18806 40848
680
-
91249 73483
681
-
95812 32572
682
-
93644 68189
683
-
30669 20850
684
-
75404 92869
685
-
53324 50141
686
-
80675 50216
687
-
14897 73401
688
-
34074 29952
689
-
16366 32630
690
-
95656 28090
691
-
73964 58896
692
-
90705 66916
693
-
92869 59662
694
-
99522 78294
695
-
35903 19794
696
-
33033 42610
697
-
55650 50980
698
-
29289 11753
699
-
32302 58345
700
-
76036 57644
701
-
74870 31274
702
-
85035 77868
703
-
79322 25255
704
-
50332 31274
705
-
78294 44529
706
-
93000 53324
707
-
36560 19028
708
-
40041 53525
709
-
70360 89795
710
-
19074 98749
711
-
32829 89603
712
-
61436 71046
713
-
89938 85369
714
-
52708 28090
715
-
83958 53324
716
-
88155 67097
717
-
32730 75527
718
-
64221 23559
719
-
60391 97432
720
-
70047 20185
721
-
12372 73527
722
-
46501 29274
723
-
66552 14746
724
-
56373 51614
725
-
95596 11782
726
-
81196 72623
727
-
32282 60515
728
-
49504 14393
729
-
57642 34348
730
-
95402 87987
731
-
81625 68830
732
-
28527 37199
733
-
71475 31808
734
-
94280 23005
735
-
55623 99355
736
-
46783 29073
737
-
36641 81559
738
-
74788 14535
739
-
87994 78773
740
-
80189 77868
741
-
33263 89795
742
-
23537 23537
743
-
25755 22264
744
-
67413 72800
745
-
74924 73774
746
-
81215 78294
747
-
78206 92869
748
-
36161 50141
749
-
54925 86995
750
-
66305 49951
751
-
42462 28090
752
-
99051 88912
753
-
44954 89795
754
-
88856 28090
755
-
63026 85778
756
-
22651 24813
757
-
39262 14475
758
-
86176 69982
759
-
65395 14393
760
-
12926 78294
761
-
81994 53324
762
-
16933 30191
763
-
46987 19794
764
-
37215 28090
765
-
15340 63748
766
-
40271 86674
767
-
23747 52856
768
-
61156 11644
769
-
65356 56048
770
-
72336 51278
771
-
21864 77868
772
-
99351 13349
773
-
24599 79046
774
-
62281 23361
775
-
81871 53324
776
-
14029 42297
777
-
50141 48720
778
-
46677 43636
779
-
10745 35965
780
-
39344 80864
781
-
38077 50038
782
-
13983 89795
783
-
66663 67877
784
-
64175 19028
785
-
62355 68830
786
-
96823 79443
787
-
46436 44754
788
-
53388 68830
789
-
45987 92723
790
-
87646 11707
791
-
75997 45545
792
-
69968 93653
793
-
30425 44529
794
-
83211 88109
795
-
28725 64932
796
-
47043 89795
797
-
34475 31274
798
-
42302 94895
799
-
66558 92753
800
-
48964 50713
801
-
19546 78294
802
-
51026 89795
803
-
89346 57408
804
-
52993 54676
805
-
29577 38385
806
-
85932 60320
807
-
18030 22556
808
-
65993 19922
809
-
74692 23559
810
-
61588 89795
811
-
50688 69541
812
-
93760 44529
813
-
75094 96101
814
-
68976 86835
815
-
46278 50980
816
-
97836 44529
817
-
17576 32708
818
-
48519 46071
819
-
72647 93653
820
-
54724 34155
821
-
45186 43448
822
-
44529 41828
823
-
90404 86357
824
-
63175 44529
825
-
88381 25963
826
-
32140 23537
827
-
43348 36423
828
-
41733 88912
829
-
84065 98953
830
-
20389 96101
831
-
38749 93788
832
-
37929 35143
833
-
63747 35340
834
-
72249 93653
835
-
98042 59381
836
-
22741 95783
837
-
88124 33425
838
-
16493 44529
839
-
36599 69408
840
-
50436 41563
841
-
67695 86149
842
-
89091 20022
843
-
60708 92607
844
-
28750 68830
845
-
80224 39113
846
-
34580 96101
847
-
79688 34798
848
-
14870 68189
849
-
47719 29252
850
-
57652 33458
851
-
65541 87987
852
-
86435 19794
853
-
95204 81239
854
-
43800 50980
855
-
94063 11644
856
-
24096 36588
857
-
36628 95478
858
-
81443 17329
859
-
61221 57166
860
-
52782 78294
861
-
16740 31274
862
-
68369 45653
863
-
28895 44529
864
-
39222 65582
865
-
97201 77602
866
-
81119 11644
867
-
41083 50141
868
-
72917 25255
869
-
46148 21269
870
-
44495 18020
871
-
99464 90525
872
-
67254 58381
873
-
52750 28135
874
-
63899 55754
875
-
14617 50713
876
-
36962 50713
877
-
41322 73436
878
-
22504 38709
879
-
72577 39875
880
-
67799 68830
881
-
68284 71156
882
-
46011 61967
883
-
50367 31808
884
-
45832 87987
885
-
88775 87987
886
-
32562 26340
887
-
43756 49887
888
-
73444 16547
889
-
67302 92449
890
-
22133 85451
891
-
17768 77868
892
-
69281 39885
893
-
87364 25255
894
-
41209 27363
895
-
37792 77868
896
-
66667 73746
897
-
22195 28090
898
-
65037 37556
899
-
28634 89795
900
-
23901 50674
901
-
40511 95801
902
-
47779 45253
903
-
76489 86807
904
-
77873 66992
905
-
87523 35509
906
-
32876 50980
907
-
62342 50980
908
-
84222 41563
909
-
88205 40382
910
-
78856 20051
911
-
97888 68189
912
-
22233 17329
913
-
35868 81437
914
-
80155 93653
915
-
82730 78294
916
-
12733 19794
917
-
55038 26258
918
-
50682 23250
919
-
42043 74279
920
-
54719 71512
921
-
54474 23991
922
-
61776 25255
923
-
55564 41563
924
-
39404 31274
925
-
94954 14475
926
-
76258 89795
927
-
87689 67995
928
-
65619 59930
929
-
41846 17435
930
-
21990 22185
931
-
60161 53026
932
-
44955 57523
933
-
84178 39875
934
-
32693 87987
935
-
19125 44529
936
-
96731 93653
937
-
98080 44529
938
-
72947 95746
939
-
67285 23344
940
-
78101 77580
941
-
43064 11644
942
-
81350 23483
943
-
46937 11644
944
-
97686 79381
945
-
66339 60744
946
-
39269 50674
947
-
61837 77868
948
-
97647 86995
949
-
44613 93568
950
-
73127 68830
951
-
64048 80370
952
-
15530 87987
953
-
63926 51860
954
-
95853 91981
955
-
26155 28090
956
-
82222 19794
957
-
10035 87445
958
-
16445 93653
959
-
67972 15558
960
-
51780 68830
961
-
52358 31274
962
-
83942 60096
963
-
64899 11955
964
-
56009 96101
965
-
42288 36590
966
-
53349 65322
967
-
76255 50713
968
-
53044 26351
969
-
37184 31274
970
-
24813 19028
971
-
62309 52490
972
-
93607 19028
973
-
27423 45568
974
-
26128 78294
975
-
72691 50141
976
-
42162 60052
977
-
78247 10613
978
-
80209 31808
979
-
38310 93653
980
-
59228 47607
981
-
24897 23559
982
-
55176 37760
983
-
33062 53324
984
-
26521 39170
985
-
93209 68189
986
-
89881 23559
987
-
11418 50980
988
-
16884 78294
989
-
31995 50980
990
-
17858 98671
991
-
49107 96101
992
-
50512 54526
993
-
56890 65322
994
-
76173 65309
995
-
51569 52845
996
-
73919 23537
997
-
62591 16739
998
-
53735 79935
999
-
14454 69804
1000
-
19976 46609
-92
day_1/src/main.rs
-92
day_1/src/main.rs
···
1
-
#![feature(test)]
2
-
3
-
extern crate test;
4
-
5
-
use std::{collections::HashMap, fs};
6
-
7
-
fn part_1(left: &Vec<u32>, right: &Vec<u32>) {
8
-
let mut diff: u32 = 0;
9
-
for (i, l) in left.iter().enumerate() {
10
-
diff += l.abs_diff(right[i]);
11
-
}
12
-
13
-
println!("Part 1: {diff}");
14
-
}
15
-
16
-
#[derive(Debug, Clone, Copy)]
17
-
struct Occurences {
18
-
left: u32,
19
-
right: u32
20
-
}
21
-
22
-
fn part_2(left: &Vec<u32>, right: &Vec<u32>) {
23
-
let mut mapped = HashMap::<u32, Occurences>::new();
24
-
for (_, l) in left.iter().enumerate() {
25
-
let v = &mut mapped.get(l).unwrap_or( &Occurences { left: 0, right: 0 });
26
-
mapped.insert(*l, Occurences { left: v.left + 1, right: v.right });
27
-
}
28
-
for (_, r) in right.iter().enumerate() {
29
-
let v = &mut mapped.get(r).unwrap_or( &Occurences { left: 0, right: 0 });
30
-
mapped.insert(*r, Occurences { left: v.left, right: v.right + 1 });
31
-
}
32
-
33
-
let reduce = mapped.iter().map(
34
-
|(num, occurences)| {
35
-
num*occurences.left*occurences.right
36
-
}
37
-
);
38
-
39
-
let similarity: u32 = reduce.sum();
40
-
41
-
println!("Part 2: {similarity}");
42
-
}
43
-
44
-
fn parse_input() -> Option<(Vec<u32>, Vec<u32>)> {
45
-
let input = fs::read_to_string("./input.txt").expect("Couldn't read file");
46
-
47
-
let (mut left, mut right) = input.lines().map(
48
-
|l| {
49
-
let mut split = l.split_whitespace();
50
-
let left = split.next();
51
-
let right = split.next();
52
-
53
-
(
54
-
left.unwrap().parse::<u32>().unwrap(),
55
-
right.unwrap().parse::<u32>().unwrap()
56
-
)
57
-
}
58
-
).collect::<(Vec<_>, Vec<_>)>();
59
-
60
-
left.sort();
61
-
right.sort();
62
-
63
-
Some((left, right))
64
-
}
65
-
66
-
fn main() {
67
-
let (left, right) = parse_input().unwrap();
68
-
part_1(&left, &right);
69
-
part_2(&left, &right);
70
-
}
71
-
72
-
#[bench]
73
-
fn full(b: &mut test::Bencher) {
74
-
b.iter(|| main());
75
-
}
76
-
77
-
#[bench]
78
-
fn input_only(b: &mut test::Bencher) {
79
-
b.iter(|| parse_input());
80
-
}
81
-
82
-
#[bench]
83
-
fn part_one(b: &mut test::Bencher) {
84
-
let (left, right) = parse_input().unwrap();
85
-
b.iter(|| part_1(&left, &right));
86
-
}
87
-
88
-
#[bench]
89
-
fn part_two(b: &mut test::Bencher) {
90
-
let (left, right) = parse_input().unwrap();
91
-
b.iter(|| part_2(&left, &right));
92
-
}
-1
day_3/.gitignore
-1
day_3/.gitignore
···
1
-
/target
-54
day_3/Cargo.lock
-54
day_3/Cargo.lock
···
1
-
# This file is automatically @generated by Cargo.
2
-
# It is not intended for manual editing.
3
-
version = 4
4
-
5
-
[[package]]
6
-
name = "aho-corasick"
7
-
version = "1.1.3"
8
-
source = "registry+https://github.com/rust-lang/crates.io-index"
9
-
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
10
-
dependencies = [
11
-
"memchr",
12
-
]
13
-
14
-
[[package]]
15
-
name = "day_3"
16
-
version = "0.1.0"
17
-
dependencies = [
18
-
"regex",
19
-
]
20
-
21
-
[[package]]
22
-
name = "memchr"
23
-
version = "2.7.4"
24
-
source = "registry+https://github.com/rust-lang/crates.io-index"
25
-
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
26
-
27
-
[[package]]
28
-
name = "regex"
29
-
version = "1.11.1"
30
-
source = "registry+https://github.com/rust-lang/crates.io-index"
31
-
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
32
-
dependencies = [
33
-
"aho-corasick",
34
-
"memchr",
35
-
"regex-automata",
36
-
"regex-syntax",
37
-
]
38
-
39
-
[[package]]
40
-
name = "regex-automata"
41
-
version = "0.4.9"
42
-
source = "registry+https://github.com/rust-lang/crates.io-index"
43
-
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
44
-
dependencies = [
45
-
"aho-corasick",
46
-
"memchr",
47
-
"regex-syntax",
48
-
]
49
-
50
-
[[package]]
51
-
name = "regex-syntax"
52
-
version = "0.8.5"
53
-
source = "registry+https://github.com/rust-lang/crates.io-index"
54
-
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
-7
day_3/Cargo.toml
-7
day_3/Cargo.toml
-6
day_3/input.txt
-6
day_3/input.txt
···
1
-
<;'mul(234,359)who()-who():where()}%what()(when()mul(260,344)}[$*{&from()?]>mul(87,298)what()&+)who()(!#!when()mul(407,173)who(952,771)how()@!?what()]#mul(763,519)'from()$when()%mul(258,409)<)mul(703,155)who()who()<!!mul(423,685)%<?what()how()!,mul(647,758){'mul(595,333)';mul(228,760)~what()@when()who(617,201){{mul(403,912)when()-}(^[^;mul(513,464)where()mul(154,341),$~#^/ mul(469,16)^mul(328,795) from()what()who()when()from()mul(547,469)how()}<?#(/mul(365,823)where();]^^@{(mul(211,19)from()?-+?;@how()where(921,941)mul(816,990)/#)<when():<:'mul(698,62)&~@)+^&$mul(485,158)why()<when(),how()>when()-^}mul(736,421)^<^@?]#;mul(817,275))do()from()how()@where()<@mul(909,873)]:don't()!}&%why(418,225)}-(#mul(212,255)%} ;!]mul(707,897)how()$mul(837,220)when()(,-:+mul(560,935)mul(932,628)when()$&[mul(860,85)&where(){;*:mul(189,383)#'mul(219,523)(who()mul(950,9)';/mul(388,844):~,mul(66,658)where()what()&$&mul(871,390):-mul(587,687)?what()mul(905,131)]what()/+don't()->when()];<select()-where()mul(926,945)'mul(180,934)!don't()mul(736,865)//%mul(662,142)^+>where()'mul(108,216)@?]:mul(222,569)from(961,743):$&-/when()*where()@mul(669,307)$&]who(719,188)>#how()< mul(902,394)when()-^:mul(949,576)@mul(193,521)mul(319,755)?where()mul(494,883)(,>@where(533,792)/mul(579,616)&+?how()~select()mul(840,737)why()-+select()/how(313,74)//where())mul(895,693)from()<don't()mul(984,889),)}who()mul(233,534): ^&~;/<mul(257,146)'( -#!from()]^mul(870,750);select()-how(155,90)why(315,964)mul(298,2)$,how()!@from() #what()#mul(977,312)$&{!who():+$:mul(544,624)from()/mul(404,459)$:?}(@<@what()mul(607,342)who()@how()who()]mul(182,480)'what():@%>*~#mul(410,170){*{where()~~why()}who()mul(796,85)'+&^-)mul(603,101)who()*who()when()@when()where()%/mul(925,329) who()[& ] mul(788,146):^mul(959,154)#{;select(),:^+(from()mul(763,850)/+?mul!,&'what()from())+mul(241,655)>'^/)>why()who();mul(431,988)$from()mul(289,336) &how()what()mul(225,551)when(465,383)&!?['&when() %do()* when()#mul(677,661)what()?mul(688,941),!what(),who()?(who()mul(954,807)!'why()mul(414,536)'who()mul(614,164)mul(941,169){>:mul(755,577)@;!'^@{+mul(640,716)from()from()!where()where(503,241)(&mul(155,305)>([when())select()who(),>,mul(624,695);,what()[]select()!where()who()$mul(100,414)]where()how()!^:who()do())mul(116,506){<%/mul(922,523);why()&mul(850,674)[>^<$;select()what() mul(671,568))why()~?**[*how()mul(920,910)^^-@what()mul(783,710) ]#who():who()mul(492,190):%<how()mul(432,182)[%?mul(758,818)%+!@~mul(241,233)^mul(557,142)^?where()what()why()mul(400,622)%)$mul(251,504){#>+&+(how()#mul(771,755)~mul(709,707)<$[<~}why()[what()[don't()%(^mul(987,332)-]%+]<}who()!mul(144,70)~;*<:mul(218,330);*}what()who()mul(334,779)[@select()where(631,792),)mul(508,632))%;!what()select())>mul(411,371)(?who()select()>?:mul(526,934)mul(804,300)
2
-
*+!#-select()where()mul(91,61)$'#&who()where()[,)who()mul(995,486)~(from()]mul(395what()[%from()'%mul(3,116)$-;>why()mul(80,100)don't()+<{mul(40,909){,from()-from()}*mul(5,637)~#don't()>{)#?~mul(710,464)mul(574,738)),'mul(529,787)])how()<who()?*/:#mul(989,869)]how(96,728)+?what()where()])mul(725>,':+<{}mul(805,948)#&!do()#>who()()mul(741,273)mul(183,374)@#{~from()+from()-#mul(155,454)^@#%+<[^{where()mul(24,698)^~!what()don't()^mul(807,271){*;#?&^;from()<mul(210,40):why()*^!$/@mul(392,727)!]:;[?>how()mul(95,214)>select()#~why(152,808)] do()mul(242,354){mul(118,780)<where()mul(237 what()/mul(943,660)mul(238,123)<+}#what()&+where()!mul(850,209):'*select()mul(832,641)mul(374,249) {*{>'@ )?mul(6,158)when()how())[#select()^+<mul(757,651),why()}(#!mul(113,873)-%!mul(157,958):don't()}where()where()why()?!mul(596,489)*from() &&mul(699,920)mul(528,834):^how()+$mul(766,867)*#do()&mul(548,545)(/,*$mul(65,784when(360,503)}from()mul(715,419)what()#/mul(629,49)# who():~mul(362,297)<<from()mul(355,704)>}[;how()[who(101,571)why()><mul(840,568)&,&from()don't()when()mul(706,400)}:'mul(745,820)from(){where()?/!~mul(520,697)*#when()mul(428,711)mul@how():who()*@%];mul(516,414)where()-how()]*;mul(669,963)~from()]select()how()(mul(723,742):,what();}& why(274,391)>mul(791,364)who(683,177);mul(590,613)from()when()why()*:mul(440,124)who(82,539)how()-*%' ,when()&mul(566,425)-;*//(how()<*don't()<%?!{%why()$>mul(37,637)(what()(]<':mul(591how()when()$>$:+#mul(919,784)>*}select()} mul(9,439)';{from()mul(774,58)!%':from()mul(382,161)/when()select(){>#%&mul(434,502)^&/(why()}when()why()from()mul(407,807)'<*{#mul(506,544)],+'[mul(288,577;}>+@who()(mul(684,3)>#mul(878,375){ mul(868,218)why(){mul(738from()+!who()&mul(226,71)from():-where(898,603)/$mul(429,484);}(&-,(]mul(373,23)+,mul)!who()where():;select()how()mul(619,655))mul(572,765)</-mul(422,415)select()how()/)how()mul(691,406);% [what()(from()mul(46,308)$where()'!mul(882,592)when()what(736,407)(why()?(< /-mul(42,917)mul(86,993)~~mul(243,489)*+:from()^who(777,604){[mul(54,523)}mul(675,809)}how();who()mul(52,681)${:who()mul(124,290>?;:&why();%(mul(662,820)from()when()+mul(451,488)* /mul(833,260)'mulwho()#]how()from()*@mul(796,371);{{@^<;~mul(82,742),who()[?:'what()do()@}-}mul(466,182),select()$}{^~how()^mul(263,924)?{??mul(979,300)/:*!mul(85,685)>mul(289,416why()?++$%}{mul(519,250)#&/mul(42,521)what()mul(665,935)where()>~<)who()[mul(457,738)-'$mul(459,702)$;~{;+mul(36,315)mul(881,516)*#$~from()why(967,755)mul(569,650when()>~!:*%&don't()}(^who() ~how()mul(84,748)how()mul(362,548)select()/:%mul(30,445%;;/(}who(971,849)<?^mul(688,9)when()mul(848,69),]mul(109,183)mul(764,444)[(]{[^(mul(505,559)%[mul(470,217)$@select()*why()$ mul(374,21)~what()[}who(); @}mul(387,945)how()),mul(990,737)where(),~*mul(947,938)[mul(603,229)#when()who()*select()mul(852,493)mul(537,342)mul(442,380]],$mul(122,335)
3
-
-mul(510,616)mul(235,612><#}who()+?(mul(367,39){};mul(435,762)from()&<?,~select()#where()mul(465,421)'where(608,591)+&when()mul(422,877)$)/#)?{why()(mul(184,55)(select()[&mul(92,651);when()#*[mul(527,555)mul(208,942)({)how()[select()[who()do(){*who()-/$@mul(427,566)where()!&[when() mul(512,215)[select()[where()$how()'where()mul(725,463);#select()don't(),-~+when()%mul(174,734&?mul(929,59)#<what()~$/(mul(184,5)%{}mul(121,138)?where()mul(840,231)}mul(13,563)}?what()why()*>mul(967,363)what()-select()how()!select(),what(){mul(678>what()what()where()mul(32,798)(where(994,20)mul(657,41)when()select(949,914))^mul(790,381)where()mul(854,543)mul(133,378)%how()select()/from()mul(629,798)}mul(371select()do();/where()#''mul(218,299)$^from() ' +why()mul(401,872)!/select()mul(824,807^[mul(992,848)from()%what()when()(-(,mul(453,186)how()who()mul(320,220)who() why()mul(445,909)^>mul(535,611)who()%what()<&mul(760,213){mul(842,923)}'what():when()%where()--do()when()where(732,868)when():why()'why()why(242,296)#from()mulwhen()}{-'>}!why()mul(820,582)~mul(661,206)({don't()select()+when()*:who(544,855)$from()mul(463,28'<](who()mul(851,538)}#]who()who():from()#%mul(320,395)!/when()~$#{+-mul(822,348){)((what()}$mul(396,562)mul(597,851)mul(164,858):!>]mul(421,774)+(mul(302,479)@$mul(393,48 /)}who()@why()+$(mul(94,468))#from()mul(97,244)'?>-how()mul(801,524)+*mul(798,793))!where()~?*mul(803,188) ~when()''mul(276,321(select()do()$&]what()why(224,253)>>$&~mul/*-@'?!mul(273,411)when()-@;why()[when()mul(911,533)!+^how():@from(177,840)@from(951,534)?mul(870,233)from():when()who()where()who()mul(199,165)mul(807,41)what()'~**:mul(487,78)}};mul(392,620)^{why()*<?-when(542,189)mul(531,837)how()]{?mul(798,614)mul(864,588)what(856,979)+~,}select()?&mul(659,85)>who()&(who()~when()#how()!mul(22,783)?select()[&why()select()^mul(671,865)mul(927,45)*#;;how()&mul(519,741)mul(656-what()select()?where()mul(214,386),why()how()mul(924,777)why()%^ &when()what(998,86) [do() -:?how(235,349)%mul(567,616)from()from()mul(665,710)-:*+select()when()[do()[$from()-$%mul(113,895)#-][&when()#where()><do()(!mul(797,837)select()mul(524,378){>%when()mul(914,804)'why(88,694)]]}mul(52,954))why()don't(){[[>@-mul(988,821){],?'how()%:mul(448,457)+ who()?who()mul(62,38)^&>#*?mul(464,719)mul(251,921)mul(82,764)}*#mul(150{+who()+mul(659,141)}select()>why()/mul(270,268)how():mul(523,786);how()+why(685,187)mul(607,577)?(:mul(510+&!&$why()mul(263,702)from(),<^mul(679,458))'/!&do()select()mul(174,946);! :''mul(876,163)%what()/mul(182,358)-+what()^mul(510,134)>select()*who()mul(538,210)from(),how(362,521)@>select()what()who()why()from()mul(525,17)what()(mul(367,947) ?+mul(602,880)^,select():[why()mul(782,143)}]mul(310,79)mul(693,386),mul+~where()];from()?>where()mul(749,859)select() +,^where()mul(611,689)where())!+!!,:mul(486,599)>how()><where()%when()why()>mul(409,246 mul(220,151){select()where()^mul(168,729)>mul(42,222) ;mul(460,16)/({why()}&mul(378,136){@})mul(713,841where()mul(622,542)who()^}#from()mul(975,695)mul?):]mul(65,736)]from()[(,&#who()from()mul(601,954'~*()<;$> mul(332,193)-~when()/[+,/,#!/usr/bin/perl;mul(507@[how()#'where()why()mul(607,129)@where()*'who()~&mul(48,672)
4
-
;[?-+(@when(618,593)@mul(463,743)@&when()&~;<&mul(78,96)^]mul(857,303);~/select(),mul(980,536)who();#$mul(223,620){ -(where()mul(960,194)+! [((who()@%mul(530,458)~[?'from()%){%mul(547,623)%(:from(622,543),mul(484,923)why()who()&)mul(261,937)what()#>where()from()[)'mul(342,883)who()$mul(630,484)what()mul(29,250)]'%}when()~!&>mul(995,972)when()mul(15,702)(~#[where()mul(965,454)/,who()mul(739,675)@%-how()-what()*'%mul(810,99)when();[ #mul(22,38)+don't()~[#who()/mul(17,38) why()mul(778,682)how()@?<when()<%mul(695,791)&+%?-where()>[#~mul(780,237)#what()'mul(338,796)$what(825,687),><</how()<]mul(593,291)-:mul(107,558)&from()select() ,how()*[how()mul(811,501)*~(}[{@/,$mul(588,893)--select() ,*mul(291,200)@mul(380,703);~why()how()where()?-how()[mul(746,5),~-mul(271,992)*$*when()mul(626,216)(how()!<how()' how()mul(648,45) {(,what()where(946,541)}#mul(144,262){-#)when()~^mul(515@where()$ +]mul(357,55)^[)mul(404,638){mul(917,462)why()mul(826,942)what()$;][who()what()how()mul(829,811)~what()~when()-)mul(288,652) /who()mul(326,472),))mul(86,683)$/select()/$}where()-)+mul(561,359) '<)mul(304,38)select()>/+@^mul(885,827)?[ why()^when(364,10)>&mul(852,590)^<when()why()why(),~mul(311,677)*mul(707,282)when()mul(19,241)mul~:>/how()%from(699,716)mul(680,396)[!%}select()when(463,111)~who()#mul(363,227why()@,mul(487,707)how()[{+/what()'[}[mul(975,629)>>++{[$mul(336,79):from()mul(707,55)#)select()*<who();mul(602,976)mul(949,866)what()when()mul(72,693)+/$*(from():where()'{mul(202,519)%'mul(773,650)&}[when(): #(&mul;+/!##?why()mul(369,77)from()}#(,]who()>]mul(992,868))where()mul(106,687): $!where()mul(744,983)how()!mul(313,790)(+))]select()*!>:mul(210,868)+;why(672,934)how()when()why()>%]/mul(108,885)&/{how()mul(159,898),()who(),when()?<#mul(188,958):from(636,533)+&<*[select()how()mul(152,658)who()*;mul(477,718)when(720,25)!who(){&mul(795,952)select(435,575);!/how()select()^select()mul(281,344)from()$<>*:!mul(830,180))(select()how():&mul(397,50)*mul(413,309)where()~,/,mul(796,87)*<~&!(&don't()select()( what(709,443) &who()']mul(445,518)^:mul(655,75){from()mul(377,846)where()mul(321,815)mulfrom()>mul(937,444)where()?}how()mul(112,471)what()>%when()where()who()<$mul(318,492)-what()mul(78,20)select()?mul(851,874)&!#;select():?'^*mul(598,757)mul(326,573){/[%,why();mul(445,682'(who()^+why()why()from()mul(816,284)*%&^'^)>mul(274,211)@*,'^(mul(592,927) ;!~&how()~mul(195,155)mul(896,831)what()()+#who()&*mul(708,134}^who()where()&[mul(138,384)+select()who();where()-?&[mul(767,907)*mul(436,412);[;)-{#(where()mul(987,536)don't()#?mul(616,255)+]:when()when()}#mul(41,533)#^>from()<how(290,301)mul(63,747)what()(+;^,#who()how():mul(249,969)select()+ mul(387,732):+{what()~:!select(67,813)mul(788}!;:*where()<mul(291,542)why()('^&where()]/how()&mul(605,763)-]-why(),@mul(556,282)how()'>!what()mul(151,867);/]select(),mul(754,334)&:mul(97,118)select()mul(593,702)
5
-
&*don't()]select()from()where()[mulwhen()^^/from()&mul(461,659)&mul(643[mul(572,503)mul(588,137){;mul(849,301)who()how()%;why()who()mul(233,687) why()*do()+who(),#how()( -mul(650,3)^+mul(14,551)who()^#? !<from()]mul(912,640)!?where()*%mul(328,45)/how();;where()(mul(843,155)who()what())?%what()what()@mul(923,667)) @how())+who()-mul(503,43)when(530,489)why()from()&select(617,173)what()mul(471,175>~>-mul(628,710)%;why()<('$&:when()mul;why(155,340):^+where()/[%@mul(931,55)%(~:why()from()mul(715,482)!{mul(766,239)how()mul(284,603)>where(897,837)mul(530,610),;-why()<select()/]!mul(389,108)'[~#mul(230,503)^)%~^how()^(&mul(216,268):mul(190,552$</who()!select()]do()}what()mul(144,685)%(don't()/[where(),>^}select()(mul(470,194)from()*,who()!mul(394,768):from()?{$ ;@~mul(571,519) what()[:mul(65,328)where()>~where()< :#mul(490,774)'why()>,@<mul(945,164)?,select()from()]mul(191,618);') #mul(984,94)^^mul(764,343)[!~?%why()-select()mul(802,97)#why()when()~,<?mul(817,989)![>mul(588who()}!-'mul(35,602)+ -%[' how()]:mul(502,722):why()!!mul(332,723)!{ ,[}{^who()don't()&@[when()>'mul(695,738)select()how()do()what(635,547)};>mul(50,148),,,mul(974,330)mul(973,477)+>mul/<how()why()])[+where()mul(727,316)&}#*];(~+do()>when()mul(74,42),how()who():,what(182,526)>mul(301,319)from()*how()#mul(808,632)don't()%- ~mul(671,835)who()}&mul(330,88)){+when()&who()<$who()where()mul(653,324))(select(){/!*select())<mul(933,167)/::?+~*how()mul(266,2):**!)what()mul(491,655)}?mul(949,984)~(,who()%mul(254,681)who()%from()-;from()?%{)do() [{mul(570,36)):^;{-who()<mul(820,352)/,>select()mul(800,74)mul(780>~where()[)/why():+mul(95,301)+#~-]^< mul(453,169))!)-who()}select()!/+mul(514,816)'>,)mul(188,237)'(*><<who()why())how()mul(738,289)what(639,365)$</]~'}what()when()mul(102,510)mul?!/%why()-why()who()where()how()don't()who()who()&',~%*where()mul(790,751)@;]mul(699,591)from(10,889)'from();~?%'mul(501,173)):mul(92,868)~>#@from()$&[mul(896,181)+why()[/}mul(292,818):what(933,189)when()where()+when(),how()mul(325,460)*!'?$}why()mul(868,19)]>do()]]'@-select()+?:,mul(705,664)why() :when(320,386):]where()mul(101,603)from()mul(584,674){*why()mul(527,341)mul(314,923),&*!#don't()from(),&: mul(610,911))(!when(12,857)how()&}/don't(){from(872,604)[]}}$when()from(393,26)mulwhy()why()from():;] }mul(618,762)who()>#' <-@why()#mul(342,769)#'-&<:from():>*mul(995,557)[':&when()&don't()%+}:who(699,463)}?mul(949,652):why()#'what()mul(466,912)how() ~where(){?mul(498,589)-:]}*(<?&mul(922,310)mul(469,882when()who()#{mul(553,266)!;&(%select()?#@how()mul(84,210)from()where():mul(7,362)~?{$~!:why()^mul(770,657)]%#mul(601,370)how()?#mul(81,96);who(){mul(519,362)what()} ##:~>mul(554,92)select();~how()&#mul(296,200)$why()why()don't()mul(718,92)[select()*?:where()mul(868,217)when()'what()]mul(608,255how():*~when()!:%{how(720,870)mul(857,876)+[how()select():[mul(926,987)why()]select()don't()%?,/&][]>^mul(20,520)mul(970,495); ?from(971,165)+@'{>mul(541,168)mul(697,290)/mul(724,20)/@/how()when()select()(]why()do()-(mul(250,857)}~<mul(670,830):mul(37,452)#%</who()@why()mul(258,824)'-^+#}how(683,511)from()who()mul(572,263))(mul(516,90)&# }where(161,891)$?>mul(612,107):>'}+{(@<mul(410,789)'@mul(41,356)
6
-
how()who()from()why()&+'what()+mul(948,970)how()^^ what()what()mul(124,952)#?why()']?when()mul(559where()$/<}#mul(683,315),{*mul(835,821)@%{who()?mul(528,442)#{/+!#>&?mul(264,859):'{;+]who()-mul(671,460)}how()when()[{mul(383,254) !mul(3,918)mul(874,303)!@mul(279,457)why()*>from()do()#/?<mul(522,927)what()[)what()~~how()when()}>mul(567,487)<what()?,][*}mul(390,810)![why()$who()mul(632,35):~ ',mul(741,335)[how()+>]*&don't()(who()}'mul(522,610)when()${{]#'mul(311,306);{^{ '[mul(270,712)@'}%why()#~:^what()do()>mul(6,137);from()-*%,;~<mul(123,497)mul(47,167>how();+ from()[?&how()]do()~who())& &;%why()why()mul(742,979)$}#,what(609,482)^mul(506,252) -:what(362,209) who()mul(399,346)%'&?mul(229,623)!)how()~mul(436,283)!)@how(){?mul(237,965) #>mul(594,38)^-mul(516,90)who(441,355)[+from()/how()mul~%[mul(434,408)where(690,778)when(978,434)>]?what()[mul(907,397)?@do()?@,select()who()-%(]where()mul(36,78)(:+when()select()mul(477,631)[#when()}mul(45,264@who()select()(mul(656,657)]select()how()[))from()mul(444,181)]!+select(36,597){*who()!/ mul(543,648)from()from()from()$when()+-} mul(293,90)who(183,746)mul(872,855how()[!>~from()*?'<mul(449,852)$:why()!+mul(71,240)?@#}:where()+from(){mul(191,72)@&^&({from()mul(981,127)?&how()[}mul(78,213)*&where()when()^what()@&%mul(149,819)@why()from(376,630) when()+don't()(><] mul(664,827)'-from()#*]mul(912,740)'from()when(473,160)mul(459,94);do()?:, ],{mul(322,110)}>where()}when()when()mul(443,449)where()#}~]mul(94,385)where()>do()<*:@##?what()'mul(63,18)[mul(414,464)>do()what(858,375)%}<'^!*mul(855,863)(mul(557,951)select()$what()+?%/ ]mul(805,186)^who()'mul(549,457)mul(604,658)select()!*~mul(508,395)where()+~]^mul(404,113)*)&$-'where()mul(428,314)$($(%$/,?where()mul(33,256)?mul(199,365)&select()when()>what(111,916)from()mul(588,754)(},@-+who()when()mul(828,506)&select(),select()who()#mul(689,772)$-&@+~what()mul(96,741)}?{-where()when(891,721)~do()*#<%who()^&;#how()mul(365,858)*$mul(903,693)who(385,109)what()'%}'mul(27,403)who()mul(874,113)( ,-@@mul(260,787)@why()*from()mul(679,437)?why()from()-what()mul(240,527):,from()>#[$do()}what()]mul(632,184)&)[?when()mul(70,409):[^-where(585,55)]%^mul(779,948)?$}from();[+?mul(964,869)-?^when() [ mul(729,356)how()({>]+ why()how(908,783)from()mul(774,617)!how()')*;]mul(484,579),#select()&why()mul(873,5)(/(@mul(573,802)what()<(<*mul(759,343)?mul(301,853)when()][) don't()?+from()mul(556,868)?$how()@>*when()<:$don't()/<^)/what()!mul(434,251)mul(882,866),mul(744,572)(why(112,504)$-how()mul(154,96)mul(201,94)$[:@&%-,>!mul(188,433)!*?mul(546,999)%&@>*/mul(310,391)-<+{]mul(938,579)+,@%[why()why(75,712)+from():mul(472,593)^mul(733,69)why())mul(961,406)~@$* )-from()mul(932,700): %!mul(382,321)!mul(297,196)where()mul(444,227)what()where())^#who()from()-mul(65,99)$:why()mul(652,486)mul(446,486)mul(970,630)$~]mul(510,304)]*:>how()/}$
-112
day_3/src/main.rs
-112
day_3/src/main.rs
···
1
-
#![feature(test)]
2
-
3
-
extern crate test;
4
-
5
-
use regex::Regex;
6
-
use std::fs;
7
-
8
-
enum Value {
9
-
Flip(bool),
10
-
Mult(usize, usize)
11
-
}
12
-
13
-
fn part_1(input: &Vec<Value>) -> usize {
14
-
let sum = input.iter().map(|v| {
15
-
match v {
16
-
Value::Flip(_) => {
17
-
0
18
-
},
19
-
Value::Mult(a, b) => {
20
-
a*b
21
-
},
22
-
}
23
-
}).sum();
24
-
25
-
println!("Part 1: {sum}");
26
-
27
-
sum
28
-
}
29
-
30
-
fn part_2(input: &Vec<Value>) -> usize {
31
-
let mut enable = true;
32
-
33
-
let mut sum: usize = 0;
34
-
for value in input.iter() {
35
-
match value {
36
-
Value::Flip(b) => {enable = *b},
37
-
Value::Mult(a, b) => {
38
-
if enable {
39
-
sum += a*b
40
-
}
41
-
},
42
-
}
43
-
}
44
-
45
-
println!("Part 2: {sum}");
46
-
47
-
sum
48
-
}
49
-
50
-
fn parse_input(input: &str) -> Option<Vec<Value>> {
51
-
let mul_regex = Regex::new(r"mul\((\d+)\,(\d+)\)|(do\(\))|(don\'t\(\))").unwrap();
52
-
53
-
let caps = mul_regex.captures_iter(input);
54
-
55
-
Some(
56
-
caps
57
-
.map(|cps: regex::Captures<'_>| {
58
-
let t = cps.get(0).map_or("", |m| m.as_str());
59
-
match t {
60
-
"do()" => Value::Flip(true),
61
-
"don't()" => Value::Flip(false),
62
-
_ => Value::Mult(
63
-
cps.get(1)
64
-
.map_or(0, |m|
65
-
m.as_str().parse::<usize>().unwrap()
66
-
),
67
-
cps.get(2)
68
-
.map_or(0, |m|
69
-
m.as_str().parse::<usize>().unwrap()
70
-
)
71
-
)
72
-
}
73
-
})
74
-
.collect::<Vec<Value>>()
75
-
)
76
-
}
77
-
78
-
fn main() {
79
-
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
80
-
81
-
let input = parse_input(file.as_str()).unwrap();
82
-
part_1(&input);
83
-
part_2(&input);
84
-
}
85
-
86
-
#[bench]
87
-
fn full(b: &mut test::Bencher) {
88
-
b.iter(|| main());
89
-
}
90
-
91
-
#[bench]
92
-
fn input_only(b: &mut test::Bencher) {
93
-
let input = fs::read_to_string("./input.txt").expect("Couldn't read file");
94
-
95
-
b.iter(|| parse_input(input.as_str()));
96
-
}
97
-
98
-
#[bench]
99
-
fn part_one(b: &mut test::Bencher) {
100
-
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
101
-
102
-
let input = parse_input(file.as_str()).unwrap();
103
-
b.iter(|| part_1(&input));
104
-
}
105
-
106
-
#[bench]
107
-
fn part_two(b: &mut test::Bencher) {
108
-
let file = fs::read_to_string("./input.txt").expect("Couldn't read file");
109
-
110
-
let input = parse_input(file.as_str()).unwrap();
111
-
b.iter(|| part_2(&input));
112
-
}
-100
flake.lock
-100
flake.lock
···
1
-
{
2
-
"nodes": {
3
-
"fenix": {
4
-
"inputs": {
5
-
"nixpkgs": [
6
-
"nixpkgs"
7
-
],
8
-
"rust-analyzer-src": "rust-analyzer-src"
9
-
},
10
-
"locked": {
11
-
"lastModified": 1732689334,
12
-
"narHash": "sha256-yKI1KiZ0+bvDvfPTQ1ZT3oP/nIu3jPYm4dnbRd6hYg4=",
13
-
"owner": "nix-community",
14
-
"repo": "fenix",
15
-
"rev": "a8a983027ca02b363dfc82fbe3f7d9548a8d3dce",
16
-
"type": "github"
17
-
},
18
-
"original": {
19
-
"owner": "nix-community",
20
-
"repo": "fenix",
21
-
"type": "github"
22
-
}
23
-
},
24
-
"flake-utils": {
25
-
"inputs": {
26
-
"systems": "systems"
27
-
},
28
-
"locked": {
29
-
"lastModified": 1731533236,
30
-
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
31
-
"owner": "numtide",
32
-
"repo": "flake-utils",
33
-
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
34
-
"type": "github"
35
-
},
36
-
"original": {
37
-
"owner": "numtide",
38
-
"repo": "flake-utils",
39
-
"type": "github"
40
-
}
41
-
},
42
-
"nixpkgs": {
43
-
"locked": {
44
-
"lastModified": 1733064805,
45
-
"narHash": "sha256-7NbtSLfZO0q7MXPl5hzA0sbVJt6pWxxtGWbaVUDDmjs=",
46
-
"owner": "NixOS",
47
-
"repo": "nixpkgs",
48
-
"rev": "31d66ae40417bb13765b0ad75dd200400e98de84",
49
-
"type": "github"
50
-
},
51
-
"original": {
52
-
"owner": "NixOS",
53
-
"ref": "nixpkgs-unstable",
54
-
"repo": "nixpkgs",
55
-
"type": "github"
56
-
}
57
-
},
58
-
"root": {
59
-
"inputs": {
60
-
"fenix": "fenix",
61
-
"flake-utils": "flake-utils",
62
-
"nixpkgs": "nixpkgs"
63
-
}
64
-
},
65
-
"rust-analyzer-src": {
66
-
"flake": false,
67
-
"locked": {
68
-
"lastModified": 1732633904,
69
-
"narHash": "sha256-7VKcoLug9nbAN2txqVksWHHJplqK9Ou8dXjIZAIYSGc=",
70
-
"owner": "rust-lang",
71
-
"repo": "rust-analyzer",
72
-
"rev": "8d5e91c94f80c257ce6dbdfba7bd63a5e8a03fa6",
73
-
"type": "github"
74
-
},
75
-
"original": {
76
-
"owner": "rust-lang",
77
-
"ref": "nightly",
78
-
"repo": "rust-analyzer",
79
-
"type": "github"
80
-
}
81
-
},
82
-
"systems": {
83
-
"locked": {
84
-
"lastModified": 1681028828,
85
-
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
86
-
"owner": "nix-systems",
87
-
"repo": "default",
88
-
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
89
-
"type": "github"
90
-
},
91
-
"original": {
92
-
"owner": "nix-systems",
93
-
"repo": "default",
94
-
"type": "github"
95
-
}
96
-
}
97
-
},
98
-
"root": "root",
99
-
"version": 7
100
-
}
-35
flake.nix
-35
flake.nix
···
1
-
{
2
-
description = "A basic flake with a shell";
3
-
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
4
-
inputs.flake-utils.url = "github:numtide/flake-utils";
5
-
inputs.fenix = {
6
-
url = "github:nix-community/fenix";
7
-
inputs.nixpkgs.follows = "nixpkgs";
8
-
};
9
-
10
-
outputs = { nixpkgs, flake-utils, fenix, ... }:
11
-
flake-utils.lib.eachDefaultSystem (system:
12
-
let
13
-
pkgs = import nixpkgs {
14
-
inherit system;
15
-
overlays = [ fenix.overlays.default ];
16
-
};
17
-
in
18
-
{
19
-
devShells.default = pkgs.mkShell {
20
-
packages = [
21
-
(pkgs.fenix.complete.withComponents [
22
-
"cargo"
23
-
"clippy"
24
-
"rust-src"
25
-
"rustc"
26
-
"rustfmt"
27
-
"rust-analyzer"
28
-
])
29
-
pkgs.bacon
30
-
pkgs.pkg-config
31
-
pkgs.openssl
32
-
];
33
-
};
34
-
});
35
-
}