My yearly advent-of-code solutions

Compare changes

Choose any two refs to compare.

+2
.gitignore
···
+
input.txt
+
input_test.txt
+2
2024/.gitignore
···
*.mod
*.out
+
*.txt
+
_build/
+30
2024/day_01.ml
···
+
let filename = "./day_01_input.txt"
+
let try_read ic = try Some (input_line ic) with End_of_file -> None
+
+
let line_to_ints s =
+
Str.split_delim (Str.regexp " ") s |> List.map int_of_string
+
+
let rec read_lines left right ic =
+
match try_read ic with
+
| Some line -> (
+
line_to_ints line |> fun ints ->
+
match ints with
+
| [ a; b ] -> read_lines (a :: left) (b :: right) ic
+
| _ -> failwith "invalid")
+
| None ->
+
close_in ic;
+
(List.sort compare left, List.sort compare right)
+
+
let calc_sum left right =
+
List.map2 ( - ) left right |> List.map abs |> List.fold_left ( + ) 0
+
+
let calc_sim left right =
+
List.map
+
(fun x -> x * (List.filter (fun y -> x == y) right |> List.length))
+
left
+
|> List.fold_left ( + ) 0
+
+
let () =
+
let left, right = open_in filename |> read_lines [] [] in
+
calc_sum left right |> Printf.sprintf "Sum %d" |> print_endline;
+
calc_sim left right |> Printf.sprintf "Part 2 Simularity %d" |> print_endline
-1000
2024/day_01_input.txt
···
-
64430 75582
-
87936 20843
-
98310 72035
-
98142 69076
-
73170 50561
-
65508 20716
-
72642 84718
-
63792 89556
-
88319 66913
-
38149 43160
-
88982 10253
-
34137 95932
-
79589 92389
-
49164 98263
-
49746 92762
-
53896 43420
-
21240 95725
-
88691 37648
-
47697 66763
-
38234 98154
-
74901 20452
-
70760 11404
-
16084 74024
-
77408 32178
-
81054 45709
-
68478 92252
-
52984 55239
-
14952 20843
-
42548 69422
-
21427 20329
-
92508 81533
-
22650 76459
-
48388 81843
-
49540 25697
-
65666 12373
-
45713 16199
-
42419 10468
-
64757 30375
-
58273 43473
-
10576 20540
-
31508 42210
-
21718 52578
-
55862 92252
-
29892 20716
-
35978 50547
-
18953 43473
-
51379 31038
-
16417 83883
-
66023 24679
-
28031 55268
-
69178 45771
-
56463 93602
-
33368 20147
-
16434 43473
-
97551 73418
-
46904 19198
-
25697 60996
-
37363 35781
-
11282 92252
-
35209 72035
-
66763 27103
-
85271 69322
-
33759 94633
-
17008 83883
-
97073 21870
-
24061 55053
-
53095 92252
-
12374 92762
-
25571 51808
-
37178 10953
-
88710 67938
-
64979 48065
-
49734 80760
-
73780 81067
-
55802 37177
-
78442 90493
-
97220 32178
-
39845 25697
-
27359 39117
-
66371 17473
-
50236 82028
-
54937 41865
-
11989 69107
-
61602 78467
-
83376 75395
-
84545 42210
-
24250 55446
-
29247 37936
-
48897 21653
-
89795 26960
-
60748 39097
-
32745 20716
-
66967 43473
-
63073 21718
-
71949 83590
-
30876 83883
-
43640 21718
-
37703 37133
-
19198 43473
-
43605 42609
-
35757 54910
-
20959 23081
-
29302 52984
-
56530 82308
-
95611 42671
-
60818 39516
-
18302 61539
-
25344 25697
-
91669 80760
-
67090 98098
-
44280 59977
-
17423 65400
-
56952 78467
-
23067 72035
-
45925 76133
-
84963 87050
-
29175 32178
-
89724 74826
-
85282 49648
-
86399 77097
-
34615 52896
-
47895 52578
-
68604 72035
-
30689 20716
-
66582 92521
-
72688 76209
-
47389 87846
-
66229 64769
-
32205 70746
-
95885 83814
-
56440 19941
-
87356 21436
-
67641 92252
-
20678 45960
-
31065 75217
-
95705 69076
-
90463 44022
-
51401 36472
-
73186 48543
-
45910 49551
-
26499 84718
-
94815 20415
-
46840 43473
-
47483 94710
-
11870 43473
-
28799 14080
-
24832 79589
-
83929 51875
-
39407 53253
-
73986 62364
-
66614 44738
-
75392 21277
-
70204 55613
-
99686 21718
-
85726 19198
-
47638 92252
-
81669 30026
-
70370 60748
-
53783 11004
-
54371 35046
-
72567 87098
-
87969 32178
-
81067 60748
-
61446 98023
-
76471 92252
-
64431 25697
-
42080 80760
-
14486 13466
-
82716 52984
-
49351 15539
-
36159 15090
-
56913 88064
-
96843 44738
-
66639 89714
-
91239 42210
-
65785 76459
-
49114 86785
-
58894 41438
-
45307 79589
-
38693 80286
-
21963 52722
-
46504 44738
-
22201 84718
-
15556 61539
-
86120 86377
-
21887 81067
-
32242 92762
-
61544 37648
-
29147 73990
-
24239 62852
-
30163 48652
-
95900 83883
-
71487 60590
-
69076 47403
-
68557 70174
-
80423 85726
-
92873 10245
-
59391 87955
-
15416 80760
-
90803 70939
-
25081 81067
-
10323 46564
-
75418 60748
-
92762 43409
-
32178 20716
-
72035 25025
-
30702 11797
-
70262 20843
-
10801 60970
-
69510 56933
-
38295 27487
-
57266 71215
-
39071 92542
-
20540 21718
-
57027 81151
-
77729 90745
-
96980 28442
-
65961 19198
-
55385 82179
-
86139 91952
-
72873 61041
-
95457 44738
-
84209 83883
-
93774 92762
-
67731 14982
-
81176 26473
-
50239 13336
-
74772 81067
-
91982 80690
-
40004 89466
-
52769 72035
-
40693 42210
-
50506 26856
-
71898 68597
-
99210 32178
-
45079 53505
-
17581 94678
-
83211 28309
-
52582 50257
-
62597 92762
-
20716 38593
-
18630 73077
-
20835 30809
-
75099 18088
-
56109 42210
-
31503 72884
-
60392 83711
-
26052 17008
-
49938 20540
-
16604 85679
-
94700 29256
-
52740 69859
-
84337 25174
-
46814 64723
-
68259 34542
-
79927 18036
-
57010 78467
-
73378 90472
-
83131 30214
-
84704 37648
-
36494 40475
-
43734 90827
-
85678 61539
-
65197 81067
-
80121 24363
-
97038 85579
-
59873 72035
-
54928 17827
-
46120 33920
-
68979 32133
-
88690 90929
-
38840 92762
-
66900 67817
-
59182 85839
-
15538 81151
-
60198 54586
-
57452 71692
-
12212 79875
-
62853 67888
-
67754 53532
-
86454 52984
-
94629 92403
-
80986 30351
-
76966 77097
-
78419 92762
-
12343 20540
-
26294 75804
-
18240 23339
-
72971 58631
-
69610 81067
-
96198 31081
-
25389 13525
-
29670 76459
-
39477 79589
-
58028 21718
-
77097 27842
-
95031 78097
-
32844 43989
-
12618 96437
-
82959 43688
-
40438 20716
-
58980 80760
-
26176 39610
-
81464 24846
-
31997 35781
-
82384 83883
-
54010 20844
-
63959 45452
-
43239 16738
-
45375 87524
-
36278 95715
-
96601 80760
-
82935 27550
-
13493 58808
-
17988 92762
-
59523 67650
-
69133 44178
-
59959 77097
-
89068 20843
-
31067 36430
-
55300 23059
-
36759 48277
-
91317 46947
-
58240 85726
-
22368 92356
-
60765 84751
-
72733 26888
-
19688 62073
-
90158 57933
-
11176 28442
-
53051 50769
-
76632 97012
-
98132 80760
-
73098 83281
-
46753 25697
-
44849 15301
-
62899 74187
-
71237 81067
-
56670 20649
-
18624 82808
-
32614 34732
-
98452 76464
-
51626 35781
-
55943 89986
-
59443 72035
-
96628 73132
-
77928 45659
-
76256 74161
-
13944 94048
-
12446 20843
-
70331 46956
-
46097 39097
-
46415 83883
-
29460 44307
-
73685 89046
-
53969 52578
-
82435 40606
-
65769 45167
-
89700 50621
-
80281 43473
-
97402 60748
-
11127 87361
-
50692 60748
-
43989 61539
-
40319 11156
-
85446 71698
-
58820 89274
-
77545 80760
-
34103 37577
-
83858 33573
-
23402 61991
-
82147 48488
-
15719 80760
-
16987 22112
-
41519 29897
-
29178 47932
-
92027 25765
-
92998 92252
-
52103 77097
-
64962 32490
-
81888 29503
-
92252 57018
-
88397 32178
-
13852 89473
-
73603 20540
-
95704 32178
-
36045 46227
-
38834 72035
-
85241 60748
-
94036 77097
-
90984 92762
-
44738 44738
-
48078 76459
-
40832 24578
-
78789 78634
-
42210 92252
-
16967 61124
-
76704 65696
-
69647 51055
-
41412 35781
-
50365 63580
-
33725 79129
-
90837 17116
-
25000 52578
-
55672 81986
-
50507 73820
-
82260 92762
-
58284 33808
-
79462 43473
-
76384 23808
-
49652 81151
-
24386 44424
-
76993 77003
-
11077 79166
-
58255 43047
-
81122 28757
-
63846 30206
-
69361 76459
-
19338 35781
-
28857 37648
-
33643 89353
-
61915 52984
-
54227 18855
-
16162 92252
-
21546 60184
-
15120 61012
-
63185 68250
-
44681 89512
-
25644 80760
-
12963 42210
-
41952 17962
-
46649 89796
-
46412 68405
-
32401 61539
-
81393 20540
-
13678 78467
-
68025 99213
-
27934 35781
-
91794 61539
-
98970 71396
-
18314 69562
-
19908 97620
-
69828 60768
-
89139 36928
-
71402 25697
-
64070 32178
-
55145 38138
-
65851 25697
-
98808 67787
-
57244 21718
-
18541 79589
-
88135 84731
-
77694 61539
-
52608 83313
-
67204 91715
-
47233 39097
-
99317 37648
-
84111 30506
-
71316 39097
-
24604 61539
-
28504 58867
-
64952 35781
-
72718 43275
-
55834 44738
-
30446 92252
-
37415 29159
-
41743 78467
-
26267 59675
-
33658 11262
-
50677 44738
-
71609 78322
-
26047 52977
-
31723 21718
-
44390 72035
-
53788 89828
-
84829 60748
-
57972 32178
-
93241 27703
-
38576 20540
-
44958 84718
-
94256 47639
-
41263 85109
-
75946 67054
-
20333 77097
-
55509 95680
-
39858 40117
-
88032 21718
-
98778 76619
-
89995 18411
-
28456 62071
-
61789 72035
-
78073 70754
-
77073 31065
-
86999 21718
-
42298 40782
-
50995 43473
-
32947 20843
-
40617 22994
-
84633 40716
-
19900 28627
-
17816 68538
-
32530 25156
-
17673 77097
-
38208 77097
-
54880 78467
-
10746 36942
-
36110 23213
-
80179 61360
-
55819 35781
-
28442 79589
-
88289 92066
-
83346 28171
-
37597 74543
-
45978 84718
-
52946 28442
-
64609 92762
-
24593 39097
-
92409 92252
-
60718 60223
-
26498 70229
-
14277 35781
-
90961 79589
-
19915 79965
-
68301 14227
-
56321 80760
-
15922 67051
-
80444 72035
-
49913 39097
-
97519 83883
-
81867 76459
-
72049 32178
-
98003 81151
-
29774 84718
-
83596 92936
-
65711 41869
-
94799 72035
-
52228 74833
-
35681 15295
-
86161 47398
-
99764 44738
-
13342 66763
-
19557 41667
-
85701 24392
-
67265 54679
-
24579 60748
-
99212 72720
-
11279 20540
-
81879 36662
-
42791 12924
-
98914 75630
-
29879 52984
-
87696 69076
-
54212 32065
-
30014 76459
-
43433 64434
-
31827 43749
-
27323 32614
-
47887 78467
-
12778 90971
-
38504 25697
-
11985 12152
-
88281 32178
-
60313 18405
-
84487 44738
-
10753 76459
-
11349 59672
-
58532 69076
-
37463 81151
-
74158 17588
-
47713 16319
-
52617 99026
-
75642 54241
-
86070 84718
-
89264 68926
-
13839 84718
-
16425 22018
-
15973 35781
-
97324 39267
-
74858 93659
-
30114 82028
-
91599 92765
-
47093 37648
-
50285 60748
-
14846 15314
-
89741 83883
-
27133 42151
-
38409 39097
-
34370 60748
-
43982 69423
-
22858 20843
-
57345 34197
-
40807 61764
-
75561 28363
-
14111 34713
-
49442 81067
-
61122 53151
-
97636 25131
-
43772 25697
-
55030 83358
-
52741 23263
-
74578 81559
-
50656 34834
-
62586 23884
-
99380 73924
-
41885 46691
-
95691 23340
-
68929 18409
-
32180 25515
-
27880 69609
-
15658 25697
-
40225 76459
-
54028 95026
-
51248 83206
-
55585 44495
-
34730 36987
-
72713 43473
-
48744 43473
-
50628 44738
-
66099 81067
-
84471 82826
-
74726 43646
-
63777 80760
-
38782 10687
-
62565 32178
-
30082 36088
-
66224 25697
-
17798 39097
-
65148 37648
-
50731 66803
-
60010 16037
-
71057 20540
-
79087 47464
-
63666 37648
-
61860 74023
-
46372 33274
-
40076 97575
-
81205 25697
-
29232 48419
-
91161 25173
-
80675 51474
-
45465 75816
-
80432 80760
-
84712 73906
-
32924 96322
-
27386 25697
-
35781 80760
-
28248 77822
-
33634 48276
-
93878 48409
-
26858 59450
-
63868 42103
-
94063 13352
-
26657 52984
-
65635 92762
-
47508 11445
-
87138 83597
-
33328 62612
-
70031 85726
-
81151 23518
-
42263 32662
-
85424 71871
-
21504 72035
-
76646 90060
-
36770 31991
-
76459 43473
-
58215 44495
-
20418 86232
-
68543 81067
-
71082 52984
-
24484 86494
-
70941 98749
-
71613 24014
-
98938 35781
-
42671 25697
-
11798 25697
-
55015 81601
-
92532 78131
-
10415 43260
-
89920 11599
-
36610 30402
-
11196 46252
-
61243 80760
-
47794 15435
-
10054 40848
-
90743 52578
-
12980 92252
-
43206 92762
-
23376 69724
-
45693 77097
-
79629 70562
-
69524 20540
-
30811 48749
-
76688 51485
-
50584 77097
-
46173 35918
-
22138 92762
-
98933 52984
-
55451 42210
-
97723 34368
-
39097 60748
-
29080 78467
-
58962 78467
-
71265 13782
-
14559 20716
-
14366 20540
-
68344 72035
-
48432 88048
-
38005 43473
-
85989 93533
-
98422 83883
-
20685 80045
-
69814 72035
-
11356 28819
-
39329 20843
-
52898 19198
-
43135 25697
-
20409 25697
-
52446 34899
-
63515 84718
-
19371 20540
-
16430 20540
-
45803 74304
-
66092 33425
-
80760 95646
-
64945 37648
-
43951 78467
-
87271 17766
-
91354 75924
-
32506 37648
-
15452 79052
-
87783 42991
-
90937 75439
-
68208 97868
-
91228 92252
-
35773 92762
-
74252 32178
-
96573 74280
-
29447 31544
-
61206 62085
-
75242 75894
-
76850 77838
-
22095 24247
-
78467 55285
-
27611 20540
-
18974 84363
-
74621 83883
-
19469 19323
-
26785 25697
-
99803 77726
-
96042 21449
-
61772 39950
-
21746 79309
-
44817 14075
-
65817 54251
-
90360 84880
-
40529 83883
-
63336 62916
-
57489 39191
-
41980 76639
-
61947 69076
-
72393 92252
-
72994 20540
-
38393 42671
-
61264 25490
-
28725 27770
-
68461 83883
-
68050 19198
-
97146 44738
-
13195 32178
-
48395 14399
-
55269 12291
-
43616 62312
-
76357 19177
-
50496 55565
-
97083 24002
-
32806 69076
-
71713 47157
-
91635 92762
-
23121 20540
-
27917 92762
-
61595 77858
-
96038 78467
-
51300 30664
-
99332 39795
-
49914 33272
-
87083 54823
-
39253 99039
-
98686 23548
-
63961 20540
-
76429 42671
-
84657 78621
-
18867 58861
-
28534 92703
-
20843 72035
-
40011 42210
-
28716 35781
-
64363 94627
-
41215 39358
-
74285 77374
-
37245 20843
-
53602 35781
-
73935 90042
-
35283 25697
-
84164 92252
-
26264 19198
-
49434 92252
-
67281 76459
-
47315 37648
-
21216 70552
-
57730 44738
-
55530 83883
-
23807 60687
-
79378 65500
-
81270 19442
-
89580 78935
-
81287 76459
-
37987 82563
-
29721 71638
-
76282 93445
-
82973 44738
-
43095 76459
-
57911 42481
-
15665 30034
-
97099 20843
-
77440 61539
-
61564 40937
-
38697 50046
-
91585 71537
-
66058 44507
-
96221 92762
-
80464 31623
-
52031 88911
-
74599 81151
-
44495 81151
-
37781 50336
-
42333 92252
-
25393 37648
-
31875 40879
-
25513 60748
-
52578 20540
-
83883 67476
-
13961 80760
-
86512 72429
-
52957 37648
-
70656 20843
-
32267 78467
-
67751 23702
-
83650 76459
-
11249 44738
-
82052 44240
-
60178 19059
-
78052 80760
-
92063 42210
-
47149 42671
-
82429 61080
-
24749 68627
-
26862 32614
-
77843 56271
-
24471 41563
-
15084 62867
-
15444 43417
-
15492 61539
-
22651 80760
-
62625 21763
-
49448 48757
-
47125 36097
-
45650 21134
-
76382 40592
-
28236 81067
-
24712 28270
-
26908 63823
-
51661 92252
-
33112 54575
-
59018 52984
-
12648 35781
-
47726 76268
-
16833 15099
-
17720 24491
-
64016 31467
-
62900 37648
-
66411 97080
-
47653 32178
-
78845 16864
-
98508 26852
-
83446 10379
-
50837 40936
-
85485 63694
-
41709 37648
-
84178 28689
-
27821 57472
-
89199 43473
-
95089 43852
-
80677 20716
-
84551 20125
-
84718 11853
-
14520 20843
-
61473 92762
-
69357 37320
-
36592 24917
-
88660 35781
-
92407 20540
-
17708 20540
-
27217 12607
-
51540 44495
-
93978 77706
-
83790 34181
-
46160 69737
-
21508 54282
-
20593 84718
-
12368 38902
-
46760 16081
-
46693 75780
-
90007 89913
-
63689 76234
-
98781 92745
-
77580 44738
-
24571 39242
-
37950 98910
-
63333 76587
-
14765 74779
-
41979 55432
-
65602 13148
-
34240 32614
-
40909 22506
-
25236 78757
-
56096 32614
-
85735 39877
-
37637 52969
-
34344 33132
-
53389 47303
-
66490 36750
-
18024 48801
-
45153 91679
-
94052 20540
-
67564 74190
-
54685 84718
-
89848 69076
-
15698 44738
-
67033 35486
-
23435 24004
-
99883 69819
-
32300 68680
-
82028 21625
-
19382 78452
-
40073 37648
-
86881 31642
-
42474 41279
-
59165 80760
-
60370 34541
-
74295 73389
-
98654 42210
-
87697 39399
-
68417 55320
-
32125 87304
-
23153 51288
-
32963 12352
-
18366 57673
-
74792 50327
-
78281 43473
-
41693 49359
-
41188 35781
-
19719 72035
-
44395 72831
-
75495 78467
-
14585 21023
-
94358 23804
-
13464 23423
-
58483 85726
-
44941 69076
-
91349 12344
-
95485 83883
-
58981 65861
-
43473 61539
-
51945 69762
-
40385 44738
-
32646 42174
-
73150 81067
-
12154 37648
-
55441 20843
-
98025 39097
-
15339 38796
-
31543 42210
-
65949 42245
-
31434 32614
-
57312 57203
-
91833 76885
-
23286 52984
-
58987 32178
-
12591 37648
-
37648 32316
-
97542 35781
-
33381 44140
-
69851 92540
-
60076 19198
-
86697 32614
-
25533 96431
-
68777 15175
-
47390 75651
-
94550 80760
-
61539 20843
+50
2024/day_02.ml
···
+
let filename = "./day_02_input.txt"
+
let try_read ic = try Some (input_line ic) with End_of_file -> None
+
+
let is_values_safe a b direction =
+
match direction with
+
| "up" -> a < b && abs (a - b) < 4
+
| "down" -> a > b && abs (a - b) < 4
+
| _ -> false
+
+
let direction a b = if a < b then "up" else "down"
+
+
let is_line_safe list =
+
let a, b = (List.hd list, List.tl list |> List.hd) in
+
let direction = direction a b in
+
List.fold_left
+
(fun (acc, prev) x ->
+
if prev > -1 then (acc && is_values_safe prev x direction, x) else (acc, x))
+
(true, -1) list
+
|> fst
+
+
let is_line_safe_part_2 list =
+
List.mapi
+
(fun i _ -> List.filteri (fun j _ -> j <> i) list |> is_line_safe)
+
list
+
|> List.exists (fun x -> x)
+
+
let calculate_safe_score ic is_line_safe =
+
let rec calculate acc =
+
match try_read ic with
+
| Some line -> (
+
match
+
is_line_safe (String.split_on_char ' ' line |> List.map int_of_string)
+
with
+
| true -> calculate (acc + 1)
+
| false -> calculate acc)
+
| None ->
+
close_in ic;
+
acc
+
in
+
calculate 0
+
+
let () =
+
let ic = open_in filename in
+
calculate_safe_score ic is_line_safe
+
|> Printf.sprintf "Safe %d" |> print_endline;
+
+
let ic = open_in filename in
+
calculate_safe_score ic is_line_safe_part_2
+
|> Printf.sprintf "Part 2 Safe %d"
+
|> print_endline
-1000
2024/day_02_input.txt
···
-
38 41 44 47 50 47
-
75 78 79 82 85 85
-
11 13 16 19 21 25
-
39 40 43 44 50
-
75 77 80 78 80 83 84 87
-
17 20 23 21 22 23 24 22
-
80 82 79 80 82 82
-
50 51 49 52 56
-
78 80 82 83 80 81 82 88
-
43 45 48 50 52 52 55
-
34 35 38 38 41 39
-
51 54 57 60 62 63 63 63
-
24 26 27 30 33 33 34 38
-
24 25 26 26 27 28 33
-
33 35 37 41 44 46
-
55 58 60 63 66 70 71 70
-
90 93 94 98 98
-
63 64 67 69 73 77
-
13 15 18 22 25 28 34
-
60 63 68 70 71 74 76 79
-
76 79 82 89 87
-
63 66 69 71 74 76 82 82
-
55 57 63 64 66 70
-
63 64 67 68 74 75 82
-
47 45 46 47 49
-
22 21 22 24 27 26
-
67 64 65 67 69 72 75 75
-
24 22 24 26 28 31 35
-
50 48 49 52 57
-
69 67 70 71 68 69 70 71
-
38 37 38 39 42 41 38
-
34 32 31 32 32
-
14 13 14 17 19 18 22
-
76 74 77 79 80 83 81 88
-
89 87 87 90 92
-
86 85 87 90 90 92 93 92
-
34 33 34 37 37 37
-
91 88 89 92 92 96
-
84 82 83 86 88 88 95
-
10 8 10 14 16 18
-
67 64 66 68 72 70
-
31 30 32 36 38 38
-
64 61 65 66 69 70 74
-
61 60 61 65 68 75
-
56 53 55 56 63 64
-
37 34 35 36 43 44 42
-
41 39 41 44 50 51 51
-
36 33 34 40 42 43 45 49
-
45 44 45 47 50 57 63
-
84 84 85 87 90 91 92
-
40 40 41 43 46 49 47
-
24 24 25 28 30 30
-
86 86 88 89 91 94 95 99
-
28 28 30 33 35 37 38 43
-
74 74 76 73 76
-
85 85 86 84 82
-
93 93 92 93 96 96
-
70 70 73 72 76
-
49 49 48 49 54
-
12 12 13 15 18 18 21
-
59 59 61 63 66 68 68 66
-
28 28 31 31 31
-
89 89 89 91 95
-
24 24 26 28 28 31 32 39
-
70 70 71 75 78 81 82
-
45 45 48 50 54 51
-
42 42 46 48 50 50
-
12 12 13 17 19 21 24 28
-
4 4 8 11 18
-
18 18 19 24 26
-
45 45 50 52 53 50
-
60 60 62 65 68 74 74
-
49 49 51 58 60 61 64 68
-
21 21 28 29 30 36
-
69 73 76 79 82
-
5 9 11 14 17 18 15
-
4 8 10 12 12
-
62 66 68 69 73
-
2 6 7 9 10 11 13 19
-
54 58 55 58 59 62
-
1 5 7 4 5 3
-
55 59 56 58 61 64 64
-
85 89 86 88 90 93 97
-
79 83 82 84 89
-
40 44 44 45 46
-
19 23 24 24 23
-
28 32 33 33 36 36
-
28 32 32 35 38 42
-
47 51 52 52 53 59
-
29 33 35 37 41 42
-
75 79 83 84 85 88 85
-
41 45 49 51 54 55 55
-
36 40 42 44 48 52
-
16 20 23 25 29 36
-
47 51 54 55 57 62 63
-
87 91 93 99 96
-
15 19 21 26 26
-
37 41 44 49 52 55 59
-
9 13 20 21 28
-
16 22 23 26 29
-
34 41 43 44 47 48 46
-
3 10 12 13 14 14
-
16 23 25 28 31 35
-
18 24 26 28 29 32 37
-
59 66 69 70 73 70 72
-
40 45 46 49 46 49 46
-
14 20 22 24 27 24 24
-
75 82 83 86 84 88
-
14 21 22 24 23 26 29 36
-
1 7 10 10 11 13 14 16
-
2 8 9 12 14 14 12
-
2 9 9 12 13 14 14
-
10 15 17 17 21
-
54 59 60 60 65
-
70 77 79 83 84
-
21 28 32 35 36 38 37
-
26 33 34 38 41 42 43 43
-
4 11 12 16 17 18 21 25
-
25 32 33 35 38 42 45 50
-
19 26 28 29 34 37 40 43
-
39 46 51 53 56 57 55
-
1 8 13 15 15
-
55 62 65 66 71 72 76
-
42 49 56 57 58 59 61 68
-
78 76 75 74 76
-
30 29 27 26 24 23 21 21
-
16 13 11 10 7 3
-
41 40 38 37 34 32 31 25
-
49 46 48 47 44 41
-
71 69 71 69 71
-
6 3 5 2 2
-
94 91 88 86 83 84 82 78
-
35 33 30 33 30 25
-
43 40 38 38 36 35 33
-
34 32 30 29 28 28 27 29
-
61 58 58 55 54 52 52
-
79 77 76 76 73 69
-
81 79 76 73 73 71 66
-
20 19 17 13 10
-
94 92 89 88 86 83 79 81
-
55 54 51 47 47
-
27 26 24 21 17 15 11
-
20 19 18 14 13 10 4
-
50 49 48 47 45 39 36 34
-
82 80 74 71 74
-
93 92 89 88 83 81 81
-
98 95 89 88 85 81
-
28 25 23 20 18 11 9 2
-
6 7 4 2 1
-
52 53 51 49 50
-
7 9 8 7 6 5 4 4
-
89 90 88 86 83 81 77
-
29 32 31 29 28 21
-
68 70 72 69 68 65 64 61
-
85 87 86 85 87 89
-
46 49 48 49 49
-
83 84 82 83 79
-
32 35 33 35 28
-
14 17 16 16 14
-
46 47 47 44 47
-
15 18 16 13 13 13
-
11 13 12 12 11 8 4
-
92 93 92 92 89 82
-
39 41 38 37 33 31
-
12 13 12 8 6 5 3 4
-
70 73 70 67 66 62 59 59
-
17 18 17 16 15 13 9 5
-
39 42 38 35 32 29 27 22
-
54 57 54 49 47
-
51 54 52 50 45 48
-
24 25 24 17 16 16
-
32 34 27 25 21
-
38 39 37 32 27
-
14 14 11 10 7 5 2
-
87 87 86 85 82 81 82
-
50 50 47 44 43 43
-
78 78 76 73 69
-
21 21 20 17 16 13 12 6
-
53 53 56 53 51 49 48 45
-
92 92 95 93 91 89 87 88
-
6 6 7 5 3 1 1
-
98 98 96 98 95 93 92 88
-
15 15 17 14 13 12 9 3
-
38 38 38 35 34 33 31
-
42 42 40 39 39 36 38
-
32 32 31 28 28 27 27
-
9 9 9 8 5 1
-
49 49 47 44 42 41 41 35
-
49 49 48 47 43 40
-
61 61 58 56 52 49 46 49
-
87 87 83 80 80
-
91 91 89 85 84 80
-
27 27 26 22 17
-
91 91 90 89 82 81 78
-
50 50 48 45 38 39
-
12 12 6 3 1 1
-
84 84 82 81 74 72 70 66
-
50 50 47 45 43 38 37 31
-
82 78 77 74 71
-
94 90 89 86 89
-
16 12 10 7 7
-
85 81 80 77 73
-
86 82 79 76 69
-
90 86 85 86 83 82
-
46 42 39 36 38 41
-
16 12 15 13 10 7 4 4
-
38 34 37 35 33 31 27
-
53 49 47 44 46 45 38
-
58 54 54 53 50
-
69 65 63 61 58 58 57 58
-
28 24 23 22 21 21 21
-
32 28 28 25 22 18
-
19 15 13 13 10 4
-
63 59 56 52 49 47 46 45
-
32 28 25 21 19 17 15 18
-
62 58 57 56 52 52
-
93 89 88 87 83 79
-
94 90 87 83 76
-
72 68 65 60 58 55
-
44 40 37 30 32
-
69 65 64 63 61 58 51 51
-
82 78 76 70 69 66 62
-
62 58 52 51 45
-
90 85 82 81 79 78 75 72
-
76 69 67 66 69
-
68 63 61 60 58 56 56
-
72 65 62 60 56
-
81 74 73 71 68 65 58
-
69 63 60 63 62 60
-
69 62 61 60 58 57 60 61
-
57 51 53 51 50 49 49
-
26 20 18 21 19 15
-
44 39 36 37 30
-
48 41 41 39 37
-
29 24 24 22 23
-
38 31 28 28 27 27
-
97 92 90 90 88 84
-
53 46 45 42 42 35
-
72 67 64 60 58 55 53
-
69 64 63 62 60 57 53 56
-
32 25 22 18 16 16
-
24 17 13 12 8
-
31 24 21 19 15 9
-
41 36 29 27 24 21 20 18
-
22 15 10 7 5 7
-
56 51 50 48 42 39 38 38
-
59 52 49 43 39
-
89 82 81 78 72 69 64
-
8 10 11 12 14 15 16 13
-
18 20 21 22 24 26 26
-
36 37 39 42 45 48 50 54
-
15 16 18 20 21 28
-
10 13 10 11 13
-
87 90 93 96 98 99 97 94
-
96 97 98 96 96
-
6 7 4 5 8 12
-
53 55 53 55 60
-
26 27 29 30 30 32 33
-
43 44 44 47 46
-
31 33 35 35 38 41 44 44
-
13 16 17 19 19 21 22 26
-
29 31 31 34 35 37 40 45
-
83 84 86 87 91 93 96
-
78 80 83 84 88 86
-
1 2 3 5 9 11 11
-
3 4 8 9 10 14
-
66 69 73 75 80
-
15 18 19 21 28 29 31
-
74 76 79 84 86 89 87
-
17 19 22 24 31 31
-
13 14 15 18 23 25 27 31
-
26 27 29 34 37 44
-
38 35 38 39 40 41 42
-
78 76 78 79 81 80
-
8 6 7 8 9 10 10
-
56 55 56 59 62 63 65 69
-
43 40 42 45 47 48 53
-
88 86 85 88 90
-
75 74 77 75 76 77 80 77
-
7 6 9 6 8 8
-
54 52 53 52 53 54 58
-
32 29 30 33 32 37
-
66 63 64 65 65 66
-
85 82 82 83 82
-
71 69 69 70 71 71
-
82 80 83 86 88 88 92
-
92 89 89 90 93 94 99
-
72 70 72 73 75 79 80
-
51 48 49 50 54 55 58 57
-
72 70 73 75 79 80 80
-
71 68 71 72 76 80
-
49 48 52 55 56 59 65
-
42 40 41 44 49 50
-
65 63 69 70 71 70
-
46 44 45 48 49 54 55 55
-
20 18 20 23 30 32 36
-
29 27 30 37 40 45
-
86 86 88 90 92
-
79 79 80 83 86 89 92 89
-
73 73 76 79 81 83 83
-
61 61 62 63 65 67 71
-
87 87 90 91 98
-
48 48 51 50 53 56
-
54 54 53 54 52
-
92 92 91 92 95 95
-
31 31 33 36 37 34 35 39
-
55 55 52 53 58
-
82 82 83 84 86 86 87 89
-
20 20 20 21 20
-
27 27 30 30 31 31
-
22 22 23 23 24 27 28 32
-
82 82 84 85 85 87 93
-
41 41 45 46 49 50
-
61 61 65 67 69 68
-
54 54 58 61 64 64
-
48 48 52 55 59
-
16 16 17 21 26
-
18 18 21 24 29 30 32 33
-
26 26 29 35 32
-
15 15 18 21 24 25 32 32
-
63 63 65 71 73 77
-
36 36 39 42 45 46 53 60
-
40 44 45 47 50 52
-
3 7 9 11 12 15 12
-
39 43 45 48 49 50 53 53
-
1 5 6 9 10 14
-
81 85 88 90 91 92 99
-
25 29 31 34 32 35
-
71 75 77 76 73
-
38 42 39 40 42 44 44
-
1 5 8 10 9 10 14
-
80 84 85 84 86 92
-
72 76 78 81 81 84 85
-
85 89 92 92 93 95 94
-
89 93 93 94 94
-
8 12 13 14 15 16 16 20
-
57 61 63 66 66 72
-
82 86 89 90 93 97 98 99
-
4 8 10 14 15 13
-
4 8 9 11 15 15
-
26 30 33 36 37 41 45
-
10 14 16 20 22 29
-
3 7 12 15 18
-
72 76 78 79 82 87 90 89
-
71 75 77 82 82
-
71 75 82 84 88
-
15 19 26 29 34
-
66 72 74 76 78 81
-
13 19 22 23 20
-
43 50 53 56 58 58
-
67 72 73 76 78 82
-
67 73 75 77 80 83 84 89
-
71 78 77 80 83
-
23 30 32 33 32 31
-
31 36 39 36 36
-
35 41 43 46 45 48 52
-
36 43 40 42 48
-
49 54 55 57 57 60 63 64
-
42 49 52 52 49
-
65 70 73 73 75 77 80 80
-
61 66 66 69 70 71 73 77
-
32 38 38 40 47
-
65 72 74 75 77 81 84
-
42 48 49 51 55 53
-
47 54 56 57 61 62 62
-
7 14 16 20 21 22 26
-
45 50 52 55 59 62 64 71
-
37 44 49 52 53
-
27 32 38 40 42 45 46 45
-
47 52 58 59 61 61
-
1 6 7 12 13 14 17 21
-
40 47 53 55 56 63
-
74 73 72 70 68 66 63 66
-
11 9 7 5 3 3
-
38 35 33 31 29 25
-
66 64 62 61 60 59 56 49
-
20 17 16 17 14 12 11 10
-
88 87 88 85 82 81 80 83
-
40 37 40 38 37 34 33 33
-
13 11 13 11 8 7 3
-
64 61 60 63 62 55
-
28 26 26 23 22 19
-
13 10 7 6 6 7
-
53 50 49 49 47 45 45
-
71 68 66 65 65 62 60 56
-
80 77 75 73 72 72 69 62
-
39 37 34 30 29 27
-
40 38 37 33 34
-
39 37 33 31 29 26 24 24
-
60 57 53 51 47
-
26 23 19 18 11
-
57 56 51 49 48 47 46 44
-
75 74 67 66 63 62 61 62
-
26 25 20 17 17
-
30 29 27 21 19 18 14
-
86 85 79 78 71
-
38 39 38 35 34 31 30
-
52 53 50 49 46 44 45
-
92 93 92 91 90 90
-
24 27 25 24 23 19
-
29 32 29 28 25 24 18
-
77 78 81 78 77 75
-
21 22 21 19 21 22
-
32 35 32 31 32 31 28 28
-
81 83 84 82 80 78 74
-
23 24 21 18 17 18 15 8
-
20 22 21 21 18
-
54 57 56 55 53 51 51 52
-
11 12 10 10 10
-
45 46 45 44 42 42 38
-
69 70 67 65 65 64 58
-
15 16 15 11 10 9 8
-
37 38 34 33 31 29 27 29
-
46 49 46 45 41 38 37 37
-
41 43 39 37 36 32
-
82 85 81 79 77 74 69
-
85 87 84 82 81 76 73 71
-
75 78 73 70 73
-
43 45 38 36 35 33 33
-
62 65 59 58 55 51
-
31 34 32 27 24 17
-
11 11 8 7 4 1
-
94 94 93 91 90 87 86 87
-
26 26 23 20 19 17 17
-
12 12 10 9 7 3
-
79 79 78 76 75 69
-
16 16 17 16 13
-
38 38 35 34 37 36 33 35
-
37 37 36 37 36 34 32 32
-
48 48 47 50 48 45 41
-
53 53 52 49 51 49 42
-
78 78 78 76 75
-
91 91 90 87 85 85 82 85
-
58 58 56 54 51 51 51
-
29 29 27 27 26 25 23 19
-
71 71 71 70 69 64
-
17 17 14 11 7 4 3 1
-
21 21 19 15 17
-
28 28 26 22 22
-
51 51 50 46 42
-
26 26 25 21 20 17 11
-
72 72 70 65 63 61 58 56
-
84 84 78 77 80
-
40 40 39 36 31 29 28 28
-
22 22 21 18 13 11 10 6
-
63 63 61 56 54 47
-
91 87 84 81 78 77
-
97 93 91 89 86 85 84 87
-
19 15 14 13 13
-
20 16 13 12 10 6
-
96 92 90 88 86 83 76
-
97 93 95 94 92 89
-
47 43 41 38 36 38 40
-
85 81 84 81 79 76 76
-
80 76 77 75 71
-
32 28 26 29 27 24 23 18
-
30 26 24 24 21 19 18 17
-
22 18 16 16 18
-
77 73 71 71 69 68 67 67
-
41 37 36 34 31 31 28 24
-
97 93 91 88 85 85 79
-
47 43 39 36 34
-
29 25 23 21 17 19
-
55 51 48 47 43 43
-
91 87 86 83 79 78 74
-
54 50 46 45 40
-
42 38 37 32 31
-
40 36 30 29 28 25 24 27
-
55 51 44 43 40 37 37
-
45 41 36 33 29
-
74 70 63 61 54
-
38 31 29 26 24 23
-
55 50 47 44 41 39 40
-
64 57 56 54 53 50 50
-
26 20 19 17 13
-
86 79 76 73 67
-
21 15 12 9 6 3 6 3
-
90 85 83 80 82 84
-
59 52 54 51 51
-
41 35 37 34 31 28 24
-
48 42 40 38 35 34 36 31
-
40 35 34 34 32
-
69 62 62 59 61
-
79 73 71 68 67 67 65 65
-
57 52 49 48 48 47 45 41
-
37 30 29 29 27 26 19
-
45 38 35 31 28
-
80 74 70 68 66 64 61 62
-
91 84 80 78 76 76
-
22 16 13 11 7 3
-
34 29 25 24 22 15
-
87 82 76 73 72
-
29 22 19 13 10 13
-
86 79 73 72 72
-
71 66 65 63 56 55 51
-
37 32 25 22 19 18 11
-
87 87 86 85 78 76 76
-
7 11 13 15 18
-
47 46 48 50 51 56 58 63
-
35 35 36 35 33 30 32
-
38 34 32 25 24 26
-
46 41 38 35 32 32
-
19 19 15 13 12 5
-
22 18 17 16 13 10 9 5
-
65 69 72 77 78
-
23 22 25 25 24
-
3 2 4 5 12 15
-
21 21 20 13 11
-
45 45 44 43 42 40 38 41
-
66 64 63 62 64 64
-
39 32 31 27 20
-
23 20 18 18 15 12 9 5
-
44 41 42 45 48 49 52 56
-
10 14 17 18 16
-
86 81 75 74 68
-
77 76 73 70 69 69
-
25 23 26 32 30
-
16 20 23 21 24 28
-
80 80 83 85 85 82
-
21 21 18 20 21 24 26
-
26 29 28 26 21
-
9 15 17 19 20 21 23 28
-
57 58 61 63 65 69 70 75
-
72 75 78 81 86 88 90 91
-
66 68 69 74 79
-
16 15 15 16 17 24
-
60 66 67 66 69 76
-
46 42 43 42 41 39 34
-
31 31 34 34 34
-
18 18 14 13 11 7
-
1 1 4 5 6 8 15
-
43 47 49 55 59
-
11 11 14 17 16
-
31 34 32 30 29 28 29
-
99 99 97 97 95 98
-
66 68 72 74 78
-
6 13 15 16 19 19 20 21
-
91 92 91 91 89 90
-
33 39 42 46 52
-
51 50 51 52 52
-
41 38 40 43 47 48 52
-
40 36 34 32 32 29 29
-
35 34 37 39 43 44 47
-
89 87 86 83 81 79 78 71
-
33 29 26 21 20 15
-
70 72 73 74 77 77 78 78
-
86 87 85 87 89 92 95
-
56 59 58 56 55 55 52 52
-
8 8 10 11 12 11 17
-
29 30 27 26 23 22 20 20
-
47 53 55 56 57 59 56 56
-
8 8 10 11 15 19
-
15 15 16 21 24 27 28 25
-
55 52 55 58 65 67 67
-
74 68 65 64 62 60 58 52
-
30 34 36 35 37
-
64 60 59 57 54 53 52 47
-
34 36 38 36 39 42 46
-
36 30 30 29 26 25 22 22
-
95 96 98 96 95
-
49 47 44 41 37
-
8 14 15 15 18 19 16
-
40 42 40 40 33
-
50 48 51 51 51
-
18 17 20 23 26 26 27 31
-
87 91 92 93 93 97
-
50 53 56 60 62 64
-
71 75 79 81 81
-
74 76 70 68 63
-
27 22 19 21 20 20
-
67 63 62 58 56 54 52 48
-
83 85 88 91 92 93 96 96
-
67 74 76 74 75 78 80 78
-
60 60 57 53 53
-
16 15 14 17 20 22 25 29
-
66 69 66 66 62
-
65 69 72 75 74 74
-
52 45 42 40 43
-
17 17 20 23 26 31 35
-
35 40 42 44 45 44
-
80 79 80 82 83 83 84
-
25 24 20 17 16 13 8
-
88 81 80 77 73 75
-
70 69 69 67 61
-
9 14 15 21 22 19
-
40 40 43 44 45 46 49 52
-
78 73 72 70 71 68
-
14 20 23 25 31 37
-
16 22 23 24 26 25 26
-
32 28 26 24 24
-
24 21 24 27 28 32 38
-
47 48 47 45 41
-
45 49 53 54 57 63
-
37 40 42 44 45 47 50 55
-
42 42 39 42 44 47 47
-
45 41 42 41 39 38 35 31
-
13 9 7 6 2 2
-
63 63 60 59 58 55 54
-
44 41 40 38 37 32 28
-
33 28 24 23 20 19 19
-
27 21 18 18 17 16 15 16
-
11 14 13 14 19
-
87 83 80 77 70 68 65 65
-
15 13 11 8 10
-
35 39 40 39 41 39
-
46 50 50 53 56 63
-
76 79 77 70 68
-
63 65 69 72 74 77 75
-
30 34 36 38 41 42 46
-
20 16 15 12 10 8 5 3
-
41 45 45 48 45
-
27 33 33 34 38
-
78 83 84 90 92 96
-
28 29 28 25 22 19 15 15
-
81 83 83 80 78 75
-
74 69 66 65 62 61 58 54
-
89 83 81 79 78 77 77 74
-
58 58 56 57 60 61 62 66
-
9 12 14 17 19 22 25 24
-
14 14 11 9 8 6 7 3
-
22 22 20 17 19 14
-
43 43 44 51 53 55 62
-
75 75 74 73 73 70
-
61 61 64 66 66 70
-
38 35 35 33 31 29 32
-
41 41 39 37 36 33 31 24
-
73 70 72 69 76
-
91 91 90 89 88 84
-
12 16 20 23 25 27 30 34
-
84 86 87 89 90 93
-
94 92 89 86 85 84 83 82
-
49 46 45 44 41
-
21 19 17 16 14 12 10
-
23 24 25 28 30 31 34 36
-
15 12 10 8 6
-
67 70 71 72 75 77
-
27 26 24 23 20 17 14
-
74 75 76 79 81 84 85 88
-
35 34 31 29 26 24 23
-
9 8 7 4 2
-
17 16 13 10 8 6 4 3
-
45 47 50 52 54 56 58
-
28 29 30 31 32 35 38 40
-
69 68 66 64 63 62 60
-
43 44 47 48 51 52
-
21 24 26 28 29
-
29 27 25 22 19 18 16
-
86 83 82 80 77 76 73 71
-
23 21 20 17 16 15 12 10
-
7 8 9 12 15 17 20
-
26 28 30 33 36 38
-
29 28 25 24 21 19 17
-
86 84 83 81 78 77 74
-
5 8 11 13 16 18
-
70 71 72 73 76 77
-
28 31 32 33 35 37
-
27 25 24 22 19
-
36 35 34 31 30 29
-
30 28 25 22 20 18 15 13
-
27 30 31 33 34 35 36
-
15 17 18 21 23 24
-
23 26 28 29 31
-
76 79 82 83 86 87 90 91
-
32 31 28 25 23
-
3 4 5 8 9 10 13 16
-
8 11 13 15 17
-
58 56 55 54 52 51 48
-
41 44 45 47 50 52 54 57
-
66 65 64 62 60 59 57
-
69 66 63 60 58 55
-
27 30 31 33 34 35 36 39
-
43 40 39 38 36 35
-
42 41 39 36 33
-
77 79 82 85 88 89 91
-
14 13 12 9 6 4 3 2
-
47 49 52 55 56
-
88 91 92 93 96 97 99
-
99 97 96 93 91 90
-
74 77 79 82 85 88 90
-
1 4 5 7 10 11
-
16 18 21 24 26 28 30
-
99 96 93 90 89
-
70 69 66 64 63 60 58 57
-
77 75 72 69 67 64
-
30 27 25 23 21 18
-
87 84 83 81 79 77
-
20 21 24 27 29
-
29 26 23 21 20 17 16 14
-
43 41 40 39 38 36 35
-
61 64 66 68 70 73 74 75
-
39 41 42 43 44 46 49
-
17 20 23 25 28 29 30 31
-
37 40 43 45 48 49 51 54
-
49 52 54 57 58
-
15 18 21 24 27 30
-
20 18 16 15 14
-
86 85 82 81 80 77
-
62 61 60 58 56 54 53 52
-
16 13 10 9 6 4 3 2
-
14 13 11 9 8 7 6 5
-
55 56 57 59 62 63 66
-
59 61 64 66 67 69 72 75
-
14 17 19 21 22
-
52 49 47 46 43
-
80 82 84 85 88
-
18 15 13 11 10
-
86 83 80 79 78 75 74
-
50 49 46 44 42 41
-
46 48 50 52 54 55 58
-
64 61 59 57 55 52
-
10 11 14 17 19 20
-
86 85 83 80 78 77 74
-
57 55 54 53 50 49
-
72 70 69 68 67 64 63 60
-
60 59 56 55 53 52
-
46 48 51 54 55 58 61
-
24 23 22 20 17 15 12
-
71 74 76 78 80 81 84
-
30 33 34 35 37 39 40 43
-
67 68 70 73 75 78 80 81
-
53 51 49 46 43 42
-
46 47 48 49 50 52
-
16 17 18 20 23 25 27 28
-
74 72 71 69 66 65 64 63
-
98 97 94 91 88 87 85
-
49 48 47 45 44 42 41 38
-
83 84 85 87 88 89 90
-
41 44 46 48 50 51 52 53
-
56 58 59 62 65 67 70
-
33 32 31 28 27 25
-
57 58 61 64 66 69
-
60 59 56 53 50 47
-
69 70 72 73 75 78
-
39 42 44 47 48
-
57 60 61 62 63 66 68 69
-
2 3 5 7 9 10
-
66 67 68 69 70 71 72
-
9 8 7 4 1
-
86 84 81 79 76 73 72
-
56 55 54 52 50
-
35 38 41 42 45 46
-
41 39 38 35 34 31
-
85 82 79 76 73 71 69
-
10 13 14 15 16 19 22
-
31 28 26 24 22 19
-
89 88 86 83 82 81 80
-
50 47 46 44 43 42 39 38
-
64 63 60 59 56 54 51 49
-
43 41 40 39 37 35 33
-
64 61 58 57 54 52 50
-
41 44 45 47 49
-
89 90 93 94 96
-
39 36 33 30 27 25
-
30 28 27 25 24
-
83 84 86 88 89 92 95
-
42 41 38 35 32
-
30 29 27 26 23 22 21 20
-
8 10 11 12 15
-
59 56 54 52 51
-
64 63 61 59 56 54 53 52
-
68 69 70 73 75 76 79
-
62 64 66 68 70 73 75
-
33 35 36 37 39 41
-
49 52 55 56 59 61
-
46 48 51 53 54 57 60 61
-
24 26 29 31 33 34 35
-
41 39 36 35 34 33 30
-
98 96 93 90 87 86 84
-
31 29 28 27 25 22 21
-
28 31 32 34 35 36 39
-
76 77 80 82 84 86
-
10 12 15 17 18 19 22
-
75 76 79 81 83
-
44 43 41 40 38 35 32 31
-
63 65 67 70 73 75 77 78
-
69 66 63 62 60
-
17 20 22 24 26 27
-
90 87 85 82 81 78
-
95 94 93 90 87 85 83 80
-
18 21 23 24 26
-
43 41 40 38 37 35 33 32
-
70 71 72 74 75 78 79 80
-
32 30 27 25 23 21
-
55 57 59 62 64 67 69
-
52 53 54 56 59 61 62 65
-
29 27 24 21 20
-
41 42 44 45 46 47
-
67 69 70 73 76
-
24 22 21 20 17 14 13
-
73 72 69 67 65 63 61
-
19 20 22 23 24 25 28 29
-
37 36 35 34 31 30 29 27
-
42 43 44 46 49
-
79 82 85 88 90
-
27 25 22 20 18
-
47 49 52 55 57
-
68 66 64 62 59 56
-
89 87 84 82 80
-
93 91 90 87 86
-
31 28 26 25 22
-
12 9 7 4 2
-
27 26 24 22 21
-
71 74 76 79 81 82
-
24 23 20 17 14 11 10
-
58 55 52 49 48
-
97 94 92 89 87 86 85 82
-
91 88 87 85 83 82
-
63 60 57 56 53 52 51 49
-
63 66 68 70 73 76
-
22 20 19 18 15 13
-
65 63 62 61 60 59
-
97 95 94 91 88 85
-
13 15 18 20 21 23
-
66 67 70 71 74 77
-
61 60 58 56 53 52 49
-
17 15 12 11 10 7 6 3
-
86 87 88 89 91 92
-
78 80 83 86 89 91 92 94
-
66 65 63 62 61 59 58
-
84 86 88 89 92
-
80 83 86 87 88
-
69 68 65 62 60 59 56 53
-
57 59 62 65 68 69 72 73
-
11 14 15 16 18 21 22
-
20 21 23 26 29 31 33
-
26 25 24 22 20 18
-
25 28 29 32 34
-
63 62 61 60 59 57 56
-
69 72 75 77 80 82 83 86
-
59 56 53 50 48 45 42
-
30 33 34 36 37 40
-
51 48 45 42 41
-
79 81 83 85 87 89 90 93
-
59 61 63 64 66 69 70 72
-
44 45 46 49 51 54 57 59
-
40 41 42 43 46 48 51
-
10 13 15 17 20 21 23 25
-
11 9 6 5 4 3
-
88 90 91 93 94 97
-
94 93 90 87 84 83 80 78
-
72 74 76 79 82 83 86
-
91 90 89 88 87 86
-
24 27 30 33 35 37 38 41
-
54 53 50 48 45 43 40
-
75 74 72 70 68 66 63
-
86 85 83 80 78 75
-
72 73 76 77 78 79 82
-
81 79 78 77 76 74 71 69
-
11 14 16 19 21
-
83 80 77 74 71 70
-
75 77 79 82 85 87 89 91
-
38 40 41 44 47 49
-
37 39 40 43 46 48 51
-
26 25 22 21 19 16
-
28 25 24 22 19 17 15 14
-
99 96 93 91 88 87 86
-
68 67 66 65 62 60 58
-
36 38 41 43 46
-
69 71 74 76 78 80 83 85
-
37 34 31 28 27 26
-
70 73 76 77 78 80 81 83
-
65 64 61 59 57 54 52
-
13 10 9 6 4
-
85 88 91 93 94
-
77 78 80 83 86 87 90 93
-
36 37 38 39 42 45 46 47
-
66 69 70 73 76 79 80
-
81 80 77 75 74 71 69
-
56 53 50 47 45 42 40
-
75 72 70 67 65 64 61 59
-
35 33 30 28 26 24 21
-
13 14 16 17 18 20 23 25
-
30 31 32 33 36 39
-
40 37 35 34 32 29 26 25
-
19 17 16 14 13 12 11 9
-
54 53 50 47 44
-
65 64 62 60 57 54
-
37 35 32 29 27
-
28 29 32 35 38 40 43 46
-
87 90 92 93 95 97
-
9 10 13 16 17 18 20
-
60 57 55 54 53 52 50 47
-
74 73 71 69 66
-
62 63 66 69 70 71
-
37 39 42 43 44 46 48
-
15 18 19 20 22
-
62 59 58 56 55 54 52 50
-
29 26 25 23 20 19
-
62 63 66 67 68 70
-
97 96 94 93 92 91 88
-
42 40 37 35 34
-
65 63 60 57 56 54 51
-
39 38 37 36 35 33
-
45 42 39 36 34 33
-
37 35 33 30 28 25 24 22
-
20 19 16 15 12 9
-
41 38 35 34 33 31 30 29
-
69 67 65 63 62 59
-
77 75 73 71 70 68 65 63
-
3 5 8 10 13 16 18
-
21 23 25 27 30 33 35
-
67 66 64 62 60
-
95 92 90 87 84
-
66 63 60 57 56 53 50 49
-
47 46 44 41 40
-
39 42 43 44 47
-
57 56 53 51 48 47
-
23 24 25 26 28 30 31
-
78 79 80 81 83 86 87
-
13 16 18 20 21 24
-
90 88 86 83 82 80 78 77
-
82 80 79 77 76 73 71 68
-
64 65 67 69 71
-
64 66 68 69 71 73 74
-
25 27 28 31 32 35 36 39
-
54 55 57 58 59
-
58 55 52 49 46
-
18 15 12 9 8 5 3
-
13 15 17 19 22 25 26 28
-
77 79 82 85 88
-
59 61 63 66 69
-
15 12 11 8 7 6
-
60 63 65 67 70 71 74
-
75 74 71 68 67 65 63
-
39 40 43 46 48
-
67 70 73 75 76 78 81
-
73 70 67 64 61
-
22 24 25 28 31
-
62 64 67 69 71 73
-
44 41 40 37 36 33 32 31
-
50 47 45 43 41 39 37 34
-
36 38 40 41 42
-
93 92 90 87 86 84 83 82
-
17 14 11 10 8
-
90 87 86 84 81
-
56 57 60 63 64 66 67 69
-
38 36 33 32 31
-
67 64 63 60 57 54 52 51
-
76 77 79 81 83
-
82 83 86 87 88
-
39 40 43 45 46 49 52
-
67 68 71 73 75 76 78 81
-
25 24 21 18 17 16 15 13
-
89 86 83 80 78 77 75 72
-
20 21 23 25 27 28 29
-
1 4 6 9 12 15 18 19
-
51 52 53 54 55 56 57
-
71 70 68 67 65 62 61
-
29 26 24 21 18 17 15
-
55 53 52 50 49 48 46 45
-
24 27 28 29 32 33 34 37
-
61 64 65 66 67 68
-
82 80 77 75 74
-
71 68 66 63 61 58 56 54
-
27 28 30 31 33 35 38 41
-
12 13 16 19 21 24 26
-
46 49 51 54 55 58 59 61
-
63 62 60 57 54
-
78 75 74 71 69 66 64
-
84 82 80 77 75 72
-
75 72 70 68 67
-
52 54 57 59 61 64
-
42 45 47 49 50 53
-
80 83 85 86 88 91 93 94
-
29 32 33 36 38
-
4 5 7 8 9
-
37 36 35 33 31 29
-
58 59 62 63 65 67
-
60 58 56 55 53
-
76 79 81 82 84 86 87
-
87 89 90 92 93 95 96
-
59 61 64 65 68
-
63 65 68 69 71 74
-
81 83 86 89 90 91 94 95
-
54 53 51 50 49 47 44
-
78 81 83 86 89 92
-
64 65 68 69 70
-
30 28 25 22 21 18 17
-
36 34 33 32 30
-
31 30 27 24 23 22 21 18
-
62 64 65 66 69 72
-
9 6 5 3 1
-
6 8 11 13 14
-
51 49 48 47 45 43 41
-
76 75 74 71 68 65 63 61
-
83 85 88 91 92 93
-
51 49 47 45 44 43
-
69 66 64 62 60 58
-
6 7 9 10 12 13 16 19
-
45 44 43 42 41
-
56 58 60 63 64 67 68
-
71 73 76 78 81 83 84 86
-
83 82 81 78 75 72 70 67
-
51 50 48 45 42 39 37
-
88 86 85 82 79
-
51 48 46 43 42 40 39 38
-
34 36 39 42 45 48 50 53
-
27 24 22 21 19 17 16
-
66 63 61 60 58 57 54 53
-
83 84 87 90 91 94 96 98
+45
2024/day_03.ml
···
+
let filename = "./day_03_input.txt"
+
let try_read ic = try Some (input_line ic) with End_of_file -> None
+
+
let read_file ic =
+
let rec read acc =
+
match try_read ic with
+
| Some line -> read (line :: acc)
+
| None ->
+
close_in ic;
+
acc
+
in
+
read [] |> List.rev |> String.concat ""
+
+
let regex_mul = Str.regexp "mul(\\([0-9]+\\),\\([0-9]+\\))"
+
let regex_mul_part_2 = Str.regexp "mul(\\([0-9]+\\),\\([0-9]+\\))\\|don't()"
+
let regex_do_part_2 = Str.regexp "do()"
+
+
let calculate_total str regexp =
+
let rec calculate str regexp acc =
+
try
+
let _ = Str.search_forward regexp str 0 in
+
let cmd = Str.matched_group 0 str in
+
let new_str =
+
String.sub str (Str.match_end ()) (String.length str - Str.match_end ())
+
in
+
match cmd with
+
| "do()" -> calculate new_str regex_mul_part_2 acc
+
| "don't()" -> calculate new_str regex_do_part_2 acc
+
| cmd when String.starts_with ~prefix:"mul" cmd ->
+
let a = Str.matched_group 1 str |> int_of_string in
+
let b = Str.matched_group 2 str |> int_of_string in
+
calculate new_str regexp (acc + (a * b))
+
| _ -> acc
+
with Not_found -> acc
+
in
+
calculate str regexp 0
+
+
let () =
+
let ic = open_in filename in
+
let data = read_file ic in
+
calculate_total data regex_mul |> Printf.sprintf "Sum %d" |> print_endline;
+
+
calculate_total data regex_mul_part_2
+
|> Printf.sprintf "Part 2 Sum %d"
+
|> print_endline
-6
2024/day_03_input.txt
···
-
'*when(932,461)!:who()(*mul(662,950)mul(878,53){#+{&%}mul(675,225)^how(648,963)&)#how(924,189)[mul(14,114)!mul(528,270)]#from()mul(866,868) what())mul(253,100); )when()@{mul(827,104))% -,'mul(955,284)/'-(([!from(177,673)<mul(399,798)*{;mul(339,362)!when():: @,-#don't()$;(! )from()%mul(78,207):&from()}^when()mul(51,209)@&who(){(~}mul(570,607){/,-select()(when()mul(808,231)[*~<&;,%mul(503,986)&*@${+mul(826,344)%?'!mul(511,427)${&+%mul(961,419)don't()!where()+mul(771,396)^,$@mul(831,173)mul(929,874)how()]mul(244,480)*!mul(30,541)^]/@who()%why()where()select()mul(490,87)'^@:mul(981,513)~-select()?#@mul(465,651)/mul(341,750)}&;!&,[mul(638,946)@;!,from():mul(349,565)/mul(495,530)&{)who()/!-~#-mul(82,865)$mul(120,92)~(mul(765,981)mul(43,881)**from(557,138)[-:{{mul(280,726)mul(719,15)!mul(716,45)%?($]<%mul(995,514)#-'mul(770,591)&([when(340,34)mul(48,191)why()%)^}who()>*mul(343,826)@}where()mul(211,118)select()why()%who()()do()'where()'+[!--<where()mul(323,818)what()what()*(><:mul(734,544)@when()who(239,383)+!,^~mul(362,147))mul(448,470)}where(916,77);select()/mul(885,970)what()(mul(926,912)when(),,-;?'from()@mul(166,868):from()mul(481,818)[how()who()~!,when()why();mul(2,227)<when(312,998)#/@who(978,537)))mul(296,229)+@;# mul(269,866)when(){<#select()$where()[@mul(601,99)#()//)*>do()![-[ where() ;mul(352,331)-[:mul(724,613)&-~@mul(133,235);when(849,671))where()?~where()@%mul(504,704)why()]<&mul(150,546)^:why();where(793,121)~!')[mul(345,200))[%select()why()^:%where()mul(112,504)'(from(194,838) when()]'why(231,15))$mul(480,487)where(335,714)$(;@{mul(542,838)-(mul(111,392))select()>when()mul(416,295)select()why(){from()<:mul(190,460)$(?how()when()mul(597,500)mul(714,782);?%>!mul(303,578)from(481,153)*&;,mul(373,860)~who()how(){mul(871,673)#@why():/[who():}don't()$<+<?@mul(692,459):<^how()[[*how()mul(906,486)~!where()<?how()<?don't()?'how():'mul(192,522)mul(707,885)who()]what()?who()~;$mul(366,408)<[ ??when()&[-mul(223,308)}*/mul(32,308)#()/mul(55,242)':where()when(){!;*{mulfrom()+$[>#-(how()%-do()!when()!when()from(342,582)@mul(877,442)from()mul(874,842);[?how()when()who()from()?(mul(415,601)#+/]:mul(132,522)#where(222,639)]from()&[how()~mul(278,563)?,~-?,(why()>mul(740,126)]select()';>]*,where(),mul(853,590)where()'~+mul(284,920)from()/+};-+[?^mul(656,345)]why()mul(185,132)-mul(770,693)~[what()<@-from()mul(200,187)mul(624,299)}mul(811,930)}+$]${&#?mul(805,62){;?when()/,:what()('mul(602,308)#}&^select()<@@how()why()mul(572,706)mul(327,202){'^*who()@mul(965,541)why()?/{[&when()mul(298,736):@}} mul(667,224)why()(- $#mul(641,534)'^mul(981,964)?;}don't()from(208,511)]})from(823,301)why()select()mul(462,251)select(){from()<mul(985,619){who()-select()'~select()-?mul(599,184)select();~why()?-?^/mul(329,480*from()+-/ mul(956,136)^:#(where()+mul(531,941)*!{mul(67,457)+)#^where(330,832)@mul(853,759))/}where()mul(572,909)@'->why()$how()'}}mul(83,963)how()$}+~:!,)mul(317,238)*'{ do()mul(408,63)-,*where()who()*@mul(761,933)who()who()&]^mul(757,153) mul(761,877):@#*^where(790,345)$why()mul(464,363)mul(546,662)from()do()-when())'^mul(133,153)
-
$when()*+:@{[who()do():#when(755,316)select()<){+@mul(228,645)$/who()[+$>from()mul(379,971)what()( )where()-mul(333,963)/(@$why()#when()why()!select()do()[!when()^why()#mul(254,172)!!mul(150-/:!%:who()select()what()?mul(511,672)]?'do();/how()when()&select()select()mul(602,681){where() }mul(52,967)mul(373,270)'&^from(767,468)#@who();-mul(965,683)how()#]#$(@mul(205,224)&*^*!why():&$mul(464,992)who()(&don't()&^mul(41,520)]mul(639,416)select(),who()$mul(322,578)&%%where()(how(580,932)what()&mul(529,241)[??#<mul(232,504)$[:%$from(){[mul(551,555)why():?don't()(/from()::#who()select(773,990)}>mul(758,621)*mul(771,275)>select()(why()]mul(87,225)how()how()~@what()how()where()mul(335,347),mul(585,232)$select()/&}^;( mul(594,43)who()~@mul(380,624)mul(678,429);what()what() -/mul(660-select()/mul(305,408);select()~mul(815,711)mul(757,285){how()/why()select()@@){^mul(902,868)from()/'when(){@;mul(295,421)-from()!}<:mul(308,315),when()%/>^$mul(542,950)do()@&^#?~!'how(525,85)mul(191,12)?%]+mul(787,915)-#{#[where(532,178):mul@-mul(941,234){where()?$how()^;%*<mul(896,559))where()mul(116,145)select()when(662,744){when()}];mul(252,242)~;who()#why()]-{!-mul(16,617)mul(637,233),[(+,mul(430,177)mul(398,224))select()~what())&mul(855,707),?mul(902,250)~select(101,564)*where():where()^ [do()>[$[@[mul(92,115)don't()how()mul(493,708)>:;)~when()&mul(710,155)('<^$+$mul(166,985)]{+mul(171,503)%{select(6,86)-'select()mul(825,487)when()/[:?<>mul(459,298)>]select()!don't()'{:;mul(96,934)}-*,%,don't(){+who()$who()!who()mul(517,278)~}@mul(574,84)^&%:what(),mul(723,445)?$mul(952,833))? @select()~who();*]mul(866,509)}who(174,511)]mul(369,695)-what()select(){~>{mul(191,238)&:!:>'what(),mul(381,727^*:where(670,586))-:mul(922,333)how()?how()&?,;when()]@mul(432,354)}<who()mul(270,613)-'[(+mul(640,237)(select();who()~who()(mul(200,694))'-,%:)^what()mul(360,861)<',mul(730,495){who(){:#who()from()mul(981,140)who()where()^[mul(221,257)who()%mul(74,34)select()&+when()$who(112,834)mul(316,217)+when()[,+^~@when(159,94)*mul(487,481)%:why()what()when()(>^mul(263,98);}]:,mul(661,118)%! [from())mul(276,921)^]]]^when();select()mul(895,325)why()+where()!from(294,522)^^^~)mul(153,481)mul(861,802)[]how()(*&mul(219,815)-:&%what()what()@mul(377,33)mul(156&<}how()^mul(654,99)/?>-~select()@)mul(20,758)mul(378,510)(^)*who()?#<+mul(652,169)%when():*+how()mul(860,302+don't()'!who()/) mul(376,810)<: !why()>{mul(431,544)+mul(860,291)when()from(),-why()#mul(367who() <]>){from() @,mul(194,2))$why()how()*when()mul(965,720)@]#){where()[,*+mul(461,205)^how();;(^)>mul(10,206)^,< who()%$%~mul(716,424)[mul(76,949)mul(605,201)-mul(84,478)%when()@+~what()~mul(562,278)mul(746,153)who(987,176)mul(70,785)mul(583,929)-why()/why()%! +mul(512,816)'who()mul(869,983)?mul(735;*why(521,585)$do()from()(how()select()mul(594,821++@!mul(602,847)mul(561,601)mul(351,649)~!why()+][?&mul(884,49)}!when()&#where()when()))+mul(853,585)~$$@mul(462,772):-)what()mul(871,925)$>*^mul(488,569)do()what():when()/(+<+<^mul(556,667)select()where()mul(308,658)@/when()]where()({do()%mul(281,279)<!<,}do()} ,@$@where()<-where()mul(444,348) why()how()(*>)'$]do()$#from()]::;*;mul(831,254)who(33,9)mul(593,778)/)$!{how() mul(716,94)where()#+where()~+~[select()?do()+<,mul(119,848)how()(what();'[,mul(205,435)mul(462,597)#(<:mul+mul(821,403)&**mul(309,390)
-
from()*/)where()*@>mul(425,149)[/:,(,;:{#mul(442,406)>(;<$,&%*mul(954{why(467,228)select();{>)%how(604,161)what()from()mul(359,89),from()*];~when()]mul(403,60)?[];*+#,mul(528,565#>;*- mul(894,804) don't()-mul(736,961)mul(169,583)where()<where()what(321,911)^!who()how()?mul(608,480)(why()[mul(779,945)what()how()#* what()]mul(181,690)%['&/@from()mul(522,978){{who()mul(491,585)?mul(798,456)<>#%~@mul(943,85)$,mul(820,12)]mul(86,786)~mul(453,237how()]what()^when()!-mul(826,572)from()?*select())]from())mul(3,29)how()who()@/+when();%mul(285,796)when())mul(193 ^@,from()#what()>'$(mul(313,971)<#mul(871,501)@how();from()from()mul(648,120)$^}{how()&)(mul(170,653)^who()mul(284,948)*mul(338,643how()~who()!}@(>mul(822,278)when(990,725)+do(),what() mul(7,493)][when()why(530,953)mul(241,105)mul(280,649)when()'??~mul(995,913)&how()select()$~mul(461,746)[:;{]//-mul(419,572)mul(347,770)how()mul(566,424)mul(180,109);select()when()where(827,268)/<,+mul(629,648);'(~<where()select()$<;mul(910,768)$ *? :;mul(871,136)~where():who()who()(where()mul(194,857)who(){mul(843,900)&who()~%mul(600,482)(mul(389,287)do()#[$[$}(>mul(46,371)+*$what()mul(203,987)mul(686,836)(when()from()what()}];]mul(716,962)where()<select()%(**]mul(728,648)^mul(998,355)!/#select()][/%who()mul(675,826)''&,&how()mul(149,800);from()[!who()+/mul(484,370),why())why(){}/how(265,92)when()who()mul(246,872)select()&;}why()/mul(476,30)~{>mul(821,591):<what()~select()$when(125,738)from()mul(371,593)@!mul(406,666)<where()^{~(what()@<mul(894,829)where()what(330,779)how()#mul(682,353)+/-<)when()from()#@mul(83,309),!when()do()from()'who()<mul(288,195)}'/mul(149,220);from()mul(541,643))who()where()$@mul(744,941)- ~<]where(396,622)^how()mul(215,902),~*:(select()select();mul(768^^@*[from()do()@mul(793,999)^$*<who()*;from()mul(60,340)@who()/^why()^mul(454,814)who()->>^mul(902,217)$;>where()?~}select()mul(702,261)when(){~!!mul(181,296)?#mul(698,522)@mul(461,392)~who()(]<%!from()don't()>}),%where()mul(562,168)#;from() where()mul(237,53) mul(268,711)when()~]+{'~mul(36,808)#;[:)select()[when()(who()mul(763,177)from()select()why(){/(mul(701,861)>how()!,*what(753,574)@mul(238,46)mul(663,748)&mul(742,855)##/)-mul(818,603)>what()-,mul(835,282)select()>;#*mul(897,85)/<from();>where(){!mul(852,153)mul(633,603)-what():where()[[mul(776,51{&from()>%>^mul(64,533)mul(992,697)'<why()&mul(358,895)?why()where()!mul(399,247)#why()+why()-,;;when()mul(217,987)*mul(585(&{&})/mul(982,985)select()?mul(528,920){&:mul(387,157):,(((where(883,627)when()where()don't()(where()why())what()$]from()what()who()mul(96,592)'mul(326,927)mulfrom()-from(947,696)~,:select()?)select()from()mul(136,549) from(){where()!mul(797,998)[>when(),mul(331%#%$]*;who()mul(799,100))@[;%<%how()when():mul(781,214)}%!what()from()how()from()mul(609,497)-how()&who()mul>[when()#,[select()mul(848,464)mul(998,874)$]mul(933,654)#*>what()select():[;#when()mul(288,108)select()<mul(447,278)/'~%what()*:~-mul(700,198)mul(208,714)mul(317,38)^%'how()do():what(29,25)who()<what(915,933)why(445,270),/]mul(27,630)*!,@ ($-mul(281,434)? %+)mul(45,531),)select()where()mul(523~what(){(mul(141,965)/@)when()how()mul(980,810))^mul(945,433)@who(967,301)why()> mul(856,529))#&from()[do()where():who()*[%]?mul(236,606)$*)when());^}mul(458,967)from()who()from(){mul(379,719)<*mul&#!/usr/bin/perl>!who()#mul(357,342)?how():/[from();mul(419,654)
-
![/mul(665,722)mul(44,793)from() $when()[/from():?mul(910,529)!how()!@>where()mul(85,692)]-%/mul(884,81)who(521,804)what()what(){what()when()mul(990,766)mul(793,200)select()mul(755,282),[(where()+;(#mul(394,96)mul(351,116)-^(mul(641,709)$,mul(982,628!,,[when()^~(how(184,286)what() mul(750,635)}%{%<> ?&mul(931,9)$[mul(698,488)~how():why()^*mul(564,153)}-where()why() what()mul(714,569)<how()!#who()mul(457,762)when()who()#<what()&'mul(784,28)%,,)}why()@:, mul(97,297)@ /}select()select()[mul(421,144)>from()?[?mul(80,973):#'+don't()}{how()}mul(437,592)(where()?,when()how()%:#mul(295,199) +)}from()>what()}mul(877,282)'where() &~?what(){*mul(222,408)mul(827,819)why() # do();;,why();,[mul(321,402)}who()'mul(755,90)select()what())mul(977,344)#why()who()?+-mul(383,635)($;when()#mul(900,601)+do();mul(206,834)mul(383,432){what(360,811)mul(827,802),)?$where()who()?{do()when()?$why();{{mul(544,551)</@when()mul(133,828)[!}!from()mul(500,141)!select(),#what()]mul(235,136)>:mul(380,98)where()<mul(763,586) mul(456,651)mul(579,437{)/how()!who(190,953)select()mul(97,312)/who(296,290)$'~;#*>mul(231,896)mul(248,602)select()(who()mul(338,121),why()):>mul(95,711)?'{mul(638 -)@!mul(681,304)what()~^%(mul(116,692)}&select()why(664,706)why();}&mul(103,869), mul(205,12)}-[mul(979,353)when(){mul(303,476)-/<$!%%]mul(358,341)select()&}who()why(163,835);>+mul(34,734)mul(330,527)mul(428,357)who()[mul(680,857)>-/;when() what()/ select()mul(218,336)&-who()when()where()who()-from()+mul(84,105)when()&?select(477,434)($#'mul(128,545){+'why()+),?'$mul(745,121),what())mul(133,419)@$/$+;who(115,246)^/(mul(135,230)~:^mul(675,10)$(what()%do()+what()-why()mul(838,662)how()%mul(683,258<mul(127,142)mul(558,494)$+why()why()^!>+*mul(492,582)<! how()mul(299,150)~{,~ who())?*$mul(422,684))select()}from())+from()mul(53from()~{where()&from() when()where()>)mul(246,947){(mul(548,714)from()*~+[-why()select()mul(118,285)where(){<}/%mul(221,266)#mul(79,261)%why()mul(349,642)what(){<(mul(811,491)mul(852,262)what()where(752,95)<^)mul(133,969{select()mul(252,913)why(765,304);?what()mul(661,7):#%?!'mul(744,62)%)mul(532]select()}when()when()]'[%^mul(565,470)^why()mul(9,544),@ what()mul+&!where()*+mul(659,140)mul(982,671))*@% *''mul(508,215))from()-!]> ~mul(413,418)>[(^,,mul(512,738)!-@what(){!<&mul(545,683)mul(461,493)~'mul(255,513+}{~from()what()mul(10,277)*who()&why();!&+-mul(281,940)how()>/$mul(246,406)@{~how()/<>!don't()-:~(mul(741,150)}mul(271,458))when():!&?mul(645,221) why()))mul(943,83)(select()@'@mul(557,649)(select(93,936)when()~?what() mul(196,320);where()?>who()mul(208,759)+what()&%@why()$do()mul(931,359)#?<?})mul(332,926)what();?how()?;,<$mul(902,131)mul(153,818)from()}>who()# [*##mul(754,721)@]#from()>;,mul(924,810)~]mul(504,18)&when()+!'>(mul(420,227)<[{{why()do()$who(){','#what()mul(11,549)mul(275,839)+**&what()mul(960,111)~mul(863,559)mul(997,395)?(}>where(),mul(553,109)[^ 'mul(337,751)<<who()why()@),~[mul(645,994),])*),$select():mul(480,815)//from()$'&+don't();,'what();how()when(586,165)'who():mul(368,791)!when()when()(};mul(80,516)who(657,999)how())@'mul/>>@++;when()what(278,714)mul(50,770)
-
when()@select()where() ([mul(747,2)~ do()]'[why()(><mul[mul(944,820)mul(610,636)!<when(316,187)#)mul(51,113)+& ?'#~mul(296,805)& /]$when()mul(397,118)! !from()$(@mul(780,422)mul(116,952)why()]why())$$mul(349,756when(),mul(846,50),who()what()~*mul(936,216)?select(490,265)~%*select()select()from() <mul(623,64)]}&&from(941,870)]#mul(49,969)&:'@who(619,626)why()who(){@'mul(514,694)-/?</where()!'why()mul(525;&:how(506,221)($)@*mul(307,952)where()how();<<<$]mul(939,978){'$<)who()'#when()mul(266?/ (mul(385,676)from()@what(){mul(798,68when()when()'{who()mul(338,137)!*mul(184,448)'mul(437,301),mul(76,268)'don't();# $<}mul(744,414)?!how()(/*%mul(207,542)~why()when()-)mul(815,793)?>why()mul(20,45)* ,^&!'~mul(769how()from()-/;mul(101,318)from()what():from()who()%mul(114,822)*why()[>select()where(832,207)from(214,70)from()mul(93,917),*$}:> ~what()mul(650,282){how()mul(556,140)where()what()mul(876,167)+&mul#who()~#}@mul(902,167)^!^%mul(137,823)>mul(550,698)how()'$mul(843,697){)'#-@ )/-mul(617,639)from()<mul(542,659)-?-#]mulwhy(279,476)mul(44,841)<!mul(986,94)how(){(how()'>select()mul(838,59)why():from()when()mul(512,68) when()from()from(); don't()mul(292,873)){+don't()<from()$^,)~}$mul(397/mul(134,953)!(from()when()-+mul(317,941)++from()]:'{-mul(665,289):why()>{]mul(663,183)+select();/- how()+ *mul(638,19)]<}:!<from()mul(372,476) [<what()( where()}mul(834,850who()(mul(534,698)who()'mul)#)@{who();); 'mul(979,467)when()when()what()what()mul(590,44)don't()mulwhere()%how()~]who()what()~mul(587,776)?mul(388,23)~?}>&where()%mul(321${mul(145,779)what()[~/>:don't()*##why()*+'mul(268(]$*+how()-'when()mul(845,280)what()^}@mul(989,77)'<why()&>select()*$?$mul(368,599)@@:'@where())mul(348,748) }$;%+select()?%mul(70,929),,^[]^select()#mul(830,51,?&!mul(858,374),select()when()}why()%what()]select()?mul(180,625)!mul(73,99)mul(445,334)/,!@@mul(464,542)!,from()$?[mul(516,277)]mul(617,538)mul(292,731)-*$*what(289,332):why()>mul(994!select(),>$)mul(289,272){why()/:^/mul(983,85)when()mul(18,611)}mul(466,826)who()--mul(470,873)!+*&mul(101,733)'where()mul(983,778)mul(974,217)/-+/]@from(),>mul(483,292)'?$<}<mul(77,441)]mul(810,991)mul(479,727)-@select()from())>,*what()mul(599,699)}/from()[*where(){mul(466,649)#'*:!where()mul(434,181)-</}# }mul(359,147)]$@mul(751,107)^-{ /$select()mul(115,665)]^who(900,677)what(32,870);when()~/from()]mul(351,263) <select():mul(895,90)-what()from()@*:where()mul*,{!mul(765,352)mul(831,730)?mul(69,805)+why()&/what(130,94)why()what():^mul(277!{*%do()^>/what()$/select()}mul(135,403)+'mul(988,367)mul(699,753)^,':<mul(599,94)what()~>+}})do()mul(876,320)why(){~/mul(550,960)$(*:-?$what()mul(259,261)mul(140,435)mul(981,455)#&}+'mul(434,245))!{mul(905,337)@select(716,497)(#}how(880,682)*from()mul(408,109)!}%don't()%<)how()%/mul(485,635)&from(), :;%/mul(421,957)#mul(138,916)mul(779,979)who();mul(694,921)/[/$!&@select()mul(599,341),}/}#'where()what()who()>mul(990;@ !-why()don't(){*:!what(): ^mul(734,796)-:/<from()do()mul(978,96)%[how()*:)what()don't()where()why()'when()$(#where(),from()mul-from()<##[mul(206,798)>where() mul(940,41)what(609,666)'how()what(522,700)mul(602,249)^where()(!~)mul(880,415)select())>(%}mulwhen()why()?<+?mul(744,997)</<]/'*what():[mul(167,167)>from()#when()+{~where()mul(37,232)#mul(996,205)mul(993,863)why()mul(144,204),,what()mul(169,251)
-
%who()^why() mul(410,625)from();what(){[+who(67,306)]$mul{how()mul(456,501);&from()]%<&don't()(!where()}@>}!,mul(566,94)> )when()<-mul(725who(77,893),@>who()-!when()mul(197,527)what()+?+, mul(170,190)@*when(){@why()don't():when()^how()>{}]mul(660,36)when()],]how()@~who(14,397)]mul(260,88)who()~select()when()<{,-do():>why() mul(276,661)?)~how()/'&why()mul(199,824)&,$*'(#) mul(919,245)&who()<from()who(33,18)mul(439,323)?!who()$mul(959,344),;from(){#how()[?mul(406,283)what()@$,why()mul(243,50)*mul(27,713)how()/mul(173,440)mul(752,139);!how()mul(694^}!?^~mul(86,112)where();from()what()how(),-[don't()-who(975,701)mul(809,676)%%*[>/mul(469,339)[[>why() do()mul(388,947)who()#~mul(145,154>,~{ mul(752,410){,!~why()why()#mul(498,700))!; mul(290,290):@from(176,870)[%@mul(340,622)(when(821,843)+when()%why()+<do()how()when()mul(620,296);+*!why()(]#mul(463,780)*select()%;{:what()who()mul(640,731)!}from()!->mul(663,681)@^/(? '{select()%don't()where(51,291)&]:mul(253,129)why(){where()select(),^mul(795,485);!why():@mul(799,33)/<mul(255,590)mul(504,55):mul(582,645)how(){*>/mul(97,531)from();?@%%mul(833,760)!&!/^#&mul(867,677))@mul(483,613))how()@;)^%;?mul(518,57)!$)-why()what()}how(){*mul(919when()$-),mul(206,121)}+']){mul(46,767)-mul(32,66)where()mul(986,477)why()}:;select()@ {{mul(93,728)%;(%where()select()mul(955,534)($~;mul(743,671)[+<%,+$$$mul(154,834)'who()*select()}#when()!mul(129,508)why()who()++when()mul(343,945)^what()^) >do():<mul(827,853)who()[$when()where()@/[{mul(827,288)%~mul(984,937):mul(877,573)-when()&when()/+}?mul(178,519){&;^mul(769,791)what()!how())who()*>mul(586,351):%##who()>#?mul(498,937)],mul(326,512)from()!%#>}from()mul(610,769)how()/mul(955,551)#%,]mul(376,333)<-;when(435,299)#why(){>*%mul(609,536)!>{> :+%&mul(304,490)<[mul(690,195) //where()#&;~mul(499,478)! what()why()why()<select()>^mul(923,423)&when()mul(96,306)^why()who()%from()]/how()]mul(731,186)///mul(516,127)$-<where(974,904);~,where()mul(273,335)]/)where()what():-$-'mul(713,713)~why()! ]'mul(478,925)?who()(mul(459,54)<where()$*;$:#how()don't()/what(726,552)>{ why()!]'mul(280,921)::@(]<from()mul(516,624)*from()when()'^*@who(338,490)/from()mul(121,947)$;};-!when() mul(305,411)mul(106,589)when(870,95)~}@>{how() what()mul(198,835)[-!from()*%mul(149,825) where()where()mul(660,669)(]&@mul(803,556)how(677,591)mul(609,507))?/>@'mul(176,185)[when()from()$}when()where()mul(496,706)why()^<&~?{/%)mul(349,473)how()>?{]!mul(242,815)@%-?<what()mul(282,877)what()$//what()?+mul(766,443)-who()-what()+)select()~@what()mul(595,833)[,$[:;?mul(638,646)mul(480,581)[do()$ who():mul(790,401)mul(208,354)@[[%mul(314,923)$%select()#from()(?/+mul(49,189)@why(519,674)what()$/select()when()@?mul(913,628)?;%where(){select(),!^mul(196,458)mul(206,858)don't()mul(306,305)<from())select()<mul(446,77)how()when():mul(824,384);[:what()-%how(426,897) when()from()mul(239,84)^:mul(598,689)what()<>;[{~mul(56,909) mul(638,125)#>^select()>^-?-'mul(517,633)why()]%mul(480,954)?'-'<mul(938,326)[<-)'mul(859,206)}&mul(667,726)/why()who()!,[how()who(703,56)'$mul(472,810)from()->>}mul(5,623)what()}from(904,521)](who()<mul(476,844)!$ [mul(627,570)(}select()
-140
2024/day_04_input.txt
···
-
SMMMSMSMSSSMSSSXAMXXAASXMMSMXMAMSSSXSAMSAMXSXSSSMXMAXASXSASXSXMXSMSMSXSMMMMAMMXXSMMMSXSXXAMXMAMASMSMSSMMMMSAMXXMXMASMMMAMXSSMXAMXMASMSMSMSAA
-
XAAAAXAAMAAAAAMMXXMASASAMAAXMXSMAAMASXMSXSXMAXAAXSMSXXMASAMSXAMAMAMASXSXSASAMSAMXAAXSSMXASXSXXMMSAXAAAAAMAMXXAXMASMSAMXAMXMASXSAXSASXAAAAMMM
-
SSMSSSMSMSMMMSXASMAXMASXMXSSMAMMMMMAMAAMMMAMMMMMMSAAXMMMMMMAMAMAMAMXMAMASAMASAMXSSMMMASMMMAXAXSAMXMMMXAMSSMSMAXXMAXMASMSSMMAMMMAMMASMMMMXMAM
-
XMAMXAAXAAAMXXASAXSXMXMASAAXMASXXXMXXMMXASAMAAXXAMMMMMAMAMXMSXMASASAMXMAMAMMMMMMXMSMSAMSAMXMMMSAMMAMXXSMMAASMMMMXMAXAMXXAMSASAMAMMAMAXAXASMS
-
XMAMSMMMSMSMAMMXMAMXSAXAMMSMMASMMMMSXAMSXSASMSSMMMMAAXAXASAXAXMMSMSASMMASAXAAAAAAMAXMAMMMXAAAXMAXSAMXXXAMMMMAAXXAXXMMMXMAMXAXMXASMMSXSXSASAA
-
XXAXMMMAXXXMXSAMXMMASXSXMAMAMAXAXAAXMAMSAMXMAMXXAASMSSSSXSMSMMSMSAMAMASXSASXSMSSMSAMMXMAMSSMMMSAMASXSXSAMXASMMSMSSMXSAMXSMSMMSSMMAAXXAMXMMMM
-
MSMSAAMSSMXSXMMSAAMXSXSXMASMMXSXSMASMSMMAMMMMMXMXMXAXXXAXMXSMAAAMASAMXMAMAXAAAMAMXXSAASXMAMAMXMASAMXMMMXSSMXXMAMAAAAMAMMMAAXAXAASMMSXMAXXAMX
-
AAAXXMMXAAASASASXSXAXAXXSASAMMSXAMAXXAMSMMMAASXSASMSMSMSMSAMMSMSMXAASAMXMMMSMMMMXAMMMMMAMASXMASXMMMXSAXAXAMXSXMASMMMSSMAMSMMSSSMMXMXMASMMMSS
-
MMSMMSASMMMXAMAXAXMAMXAXMXXAMAMSXMXSSXMAMAXMMXASAMAXASAAAMMSAAAXXSAMXAAXSMAXASXSAAXAXMXSMASASASXMAXMASMMSSMAAAXMAXXAAAMSXXMXMAMSMASMMXAMAMAM
-
MAMAAMMAXAXMSMMMSMASXASXMXSSMAXXMASMAMSAXMSMAMMMSMAMAMMMMMXMMSMMMXMXSAMXSMMSAMAMSMMMXMAXMXSMSXMAMMXMAMXXAAMXSXSXMSMMSSMMMXMAMAMASASAMXMSMMMS
-
MAXMMSXMAMMAMAMAAAMAMMXAXAAXMXMAMSMXMASAXSAMMSAAXMAMXMXMMSAMMXAXXAMXMASAMAAMAMMMAXXXAMXSAMXAXMASXSMSASMMSMMXMMMAMAAXAAAXMASASMSXMXSXMXAAXAXA
-
SMMSAAMXSAMSSMMSSSMMSMAXMAMSSMSSMMXSXMMAMSASXSMMXXMASXSSMSASASMMMASASASASMMSMMASMSSSXSMAMSMSMSAMXXASAXAMAAMASASMMSSMMSMMMAXAMXXMMMMMMMSXSMSM
-
AMAAAMAAMAXAAAAAAAXXAMSSSXXAAAAXXXSAMXMXMMAMXXSAMXXXXAMMMSXMMXXAXXMASXSAMXAAMSAXXAMMMMMMSAMAAXMMMMMMSMXMXSMASMMAXMAMMAAMMMSAMSSMMSAAXAXAXAAM
-
MMAMSAMXSXMSSMMMSMMSMXXAMXASMMMSAMXMAXMMSXMASAMXXMXMMMMAAMASASMSAMMAMAMAMMSSMMMSMMAASMMXSAXMMMAAXMAAMMXSAMMAMASMMXMSSMXSAAAAXAAAASMSSXSASXSM
-
MAMXMAXMAMAXXXAAAXXSXSMMMSAMAXSMXXASMXMAMAMXMXMMASAXMAXMMSAMMAAMAXSXSXSAMXXMXMSAXSSXSAMXSAMSMMSAMSMSSXAMASMXMXMXMAMXXSAMMSMMMSMMMSSXAAMAMAAX
-
MAMASXMXMXSXAXMSXSMMXSAXAMAMAMSAMSASMAMMSMMMSASXMSMSMAASAMMSXMMSAMSAAASXMXMXAXMAXXAXMAMMMXMAAMAMXXAMXMASAMMMSAMAMSSMAMXSXMAXAAMAMXAMMMMAMSMM
-
XASXSXXAMXMAXSAMXSAMMSAMXMXMMSMAMMXMMAMXAAAAMMSAAMAAXMXXAXAMAXMAXAMXMXMMXXASMSMSMMMXXSMAXSSMSMSSXMAMAMAMAMAMXASXMMAMXMASASMMXXSASAMXMASXMMAM
-
SASAMMSXSASAXXAMASAMAMASMSMSMAMSXMXAMXSSSXMSSMSMMMSMSMMSAMMXMMXMMSMMXSMMAAMAXXMAAAXAXMASAMXXXAAAASASMSASMMSMSXMXXMAMXSAMAMXSXMSXSXMAXXSMMSAM
-
AXMMAMXASMXMXSAMXMAMSSSMAAAASMMXASXMSMMMXAXXAAXXAAMASAAMXXMASMMXMAAMAXAMMXMASMMSSMSAXSAMMMMSMMMXMMAAAMASXAXAMMMSSMAMAXXMXMXSAAXMSMSMSAXAXSAM
-
MXMSSXMXMAMSAMASASMMMXAMSMSMSXMXAMMAAXMASMMSMMMSMXSASMSSMXMASAAAXSAMMSXMXMXAAAAXAXMAXMASXAASAMAASMMMMMSMMMMXMXAAAMAMMSMSSMASMMMMXAAAMMMSMSAM
-
XAMAMXXMMMMMASAMXXXAXXMMXXXXMASMMMMSMSAAXXXSMMASXAMMMXMAMMMMMXSMMXAAMMXMAXMASMMSMMMSAMXMAMMSAMASXASAMXMXAXMXSMMSXMAMXAAAAMAMMAAMMMMSMXAAASXM
-
MXMASAMSAMAMAMASMMSSMMSAMXMASAMXMAXMAXMASMAXXMASXMSSMSSSMAAMMAMXXMMMAMAXAXMAXMXAXSAXMXXXXSXMXMMXXXMAMAMMMSMAMAMXMSASXMSSSMASMSSSXSAMXXSMXMMM
-
XAXMMXMXASMMMMAMAAAAAAAASXXAMMSASMSMMMMXAMXMMMMXMAXAXAAXXSSSMSMMXXSSMSSSSMMAMMSASXMMMSSMASAMSSMAMMMAMASAXAMMSSMAXMMMXAXMAMXSMAAMAMMSSMXMXAAM
-
SXSMSSMSMMMASMXSMSMSMMMSMXMXMASASAXXXAXSXMASAAXAAMSMMMSMAMXMMMAMXXAAXMMAAXMAMAMMMAXAAAAMAMAMAAMASXSMSASMSMSAAAMMSSXSMSMMXSAMMMMMXMAAXMAMSSMS
-
XXAAAAXAMXSASAAMXXXMASXMASXSAMXAMMMXSXMXAXAXSMSASAAMXMMAMXAMASAMXMXAMXMSMMSSSXSASMSMMSSMAMSMSSMASXAMMASAAASMSMSMAAMSAMXSAXMASXAMMMMSXSAMMAAA
-
SMMMMSXMMMMASMMSASXSAMXMXMAXMMMXMXMAMSSXMMMXAMXAMXSMSSSSSSSMASXMASXXXAXXXXXAAASASASXMAMXMSMAMXMAXXMMMAMXMMMAAXAMMSMMAMAMASAMXSMMAMXAASAMSMMM
-
XAAAXMMSAMMMMXSMASAMXXASAMXMSAAAMAMASASAAAXMSMMXMAMMXAXAAAXMAXAXAXXMSMSMXMMMMMMXMMMMMMSXXAMAMXMASMXSMSSXMAMMMSMXMAASMMSXXMASAAMSSSMMMSAMXAMX
-
SSMSXSASASXAMXXMMXAXMMXXXMAAXMSASXSMSASMMXSAXAXXMASMMXMMMMMMMSSMMSMAAASMMXAAAXAMXSASXSAMXAMSMXMAXAAXXMAMMASAXAXSSSMMMAXAAXMMMMMMAAXSXMMSMASA
-
XAAXXMAXAMMMSSXASMSMMMSMMSSSSXMAMAAAMXMXASMMSMMMMASAMMMXMMMMAAAAXAAXXSXAAXSXMXXAMSASXMASXMMXXMMSSMMMSMAMSAMXXMXMAMSXMASXSMSXSASMMMMSAMAXMAMM
-
XMMMMMXMMMMXAMXSMAXXMAAAMXMAAXSAMXMSXSXXMXAXAMAAXXXXMASAMASMMSSSMMSMSMMMMXMAMSMSAMMMXMXMAMAMAMAMXMMXAAAMMXSMAXAMMMSXMAXXAAXASMSAXMAMXMMSMMSS
-
SAXAASMXXAXMAXMMMSMXMMSSMAMXMAMXMXAXAMMXXSAMXSSSSMSMSSXXSAXXXMAMAAXXAXAAXAMAMAAASMSSSMSSSMASAMXSXMASMSMSMXSAMMMSMAXASASMMMMXMAMMMMXSXSAAAAAM
-
AASMMSAMSMMXSMASMXAMXAAMXSMAXMSXMAXMSMASAAXAXAMXAAAAMAMMMXSAMXAXMMSSMSMSXMSMSMMMXMAAAAAAASASASXMXMMXAXMAMMMMXAASMXSAMXMAAXAMMXXXXSXAAMSSMMSS
-
MMMMAMAMAAXAMXMXAXAAXMMSAMMMSMAASMMMAAMSMSASMAXXXMMSMAMAAAXMMAMXXMAMXMXMAMXMAXMASXMXMMMXMMMSMMMMAMMXSXSASMMAMXSMAXMMMSSSMMSXMASXAMMMMMAMXAAA
-
XXAMXSAXSXMASMXMMMMMSAMMXSAAAMSMMAMSAMMXAXAMXAXMAAAXXSXMMMMXMAMMSMMXXMAXAMMSASMXSASXSASMMSXMAMASMSAAAAXASMMAXMAMXMSAMMAXAAMASAMMMMAXAMMSMXSM
-
MMXXMMAMAXSXMAXAXAAMMAMAXMMSSXMXMAMXXMXXMMSMMSAASMMSXMASXXXXMASMAASAMMXSAMXMASAASMMASASXAXXXAMXMAMMSMSMMMXSAXXAMAAMAMXMSSMSMMMSAMXMMAXAAAMMX
-
AAMSMMSMMMXAMXSSSMSSSMMSXMAMXAXMXSSSMSMAXAXXXMMMXAAXAMSMAMSXSASMSMMAMAMSAMXMSMMMSXMXMAMMXMMSMSASMMAAAMAMAMMMMSASMSSMMMXXMASAAXSXSASXSMXMSAMX
-
SSMAAAXAXASXMAMAAAAAAAAAMSSMMSMMXMAMAASMMMSMXMXXXMMMSMXMAMXASASXMASAMXMMAMXMAXAXXXXSAAXXXXMAMSASXMSMXSXMASMAAXAMXAAASASXMXMMMMXAMASAXAASAMXM
-
XAMSSMSAMXMSMASMMMMSSMMMXAAXAMXSXMAMSMSXAAAAAMAMSMSAXMASASMAMXMASAMSAMXSSMMSASMSSSMASMXMSAMXXMAMXXXAXAXSXSMSSMSMMMXMMSMMSMSMSXMMMMMMMMMMAXXS
-
SSMMAMMAMAAXSAXXXMMAMAXMMSXMSSMMXMAMAMXMMXSXMXAXAAMASXASASMAMMSMMMMMXSAMAAAAXXAAAAMAXMXXMXSXXMMMSAMXAMMXXXAAAAAMXSAXMAXMAAAASAMXAXAXAMASMMMS
-
MAASXMXAXMXMASXXAMXASMMSAXSXAAAXSXMMAXXMMAXAMSASMSMMMMXSAXMAXAMXAAAXMMASMMMSSMSMSMMASAMSMAMXMASAMXAXMXXAMMMMSMMXAAMMSMSSMSMSMAMSASXSXSXSXSAS
-
SSMMMMMMSMSSMMSMAXMMMMAMASAMMSMMMASMSMSAMASAMXAXAAAAAXXMXSXAMSXSSSMXASMMXXAXMAAAAAXAMMAAMAMAAAMASMSXXMSAMXMMMMXMSSSXXMAAMXMAXAMXMXXMAMAMAMSM
-
XAAMAAASAMXSAAXMXSSMAXMMMMMSAMASMAMAAASXMMSMMSXMXMSSSSXSAMMXMXAMMAMAXSMMMMSSMSMSXSMSSXXXSSSSSXSMMXMASAXSAMXXAMXAMAMXMMSSMXSSMSSSMMMMAMAMAMAX
-
SSMMMAXSASASMMMXAAAXMXSAXAXMASAMMMXXMMMXMAMXAMXMXXXAAMXMAMASAMXMSAMMMMAAAAAAXXMMXXXMMMAXAXXMAXSXMAXXMXMXXXMSMMMSMMMMAMMMMAXAAAAAXXAXAXASMSMS
-
MAMSAMXXAMASAMXMMSSMXAXSSMSMMMXMASAMMAXSSMMMMSAMXSMMMMASMMSMSSSMMASXASMSSMXAMXASMMXXXXXMASMASAMASXSXSXMSAMMAMMAMAASMXMAAMMSMMMSMMSSSSSMSAAMA
-
SMAMAMAMMMMMAMSXMAXMMSXMMAMXMAXSAMAMSAXXAAAAMSAMAMAXXSXSAMXAAXAASAMXMSAMAMAMXSMSAXMASXXMSMMAMASXMAAAMAXAAMSAMSASXMXAMSSSSXXXAXXXXAASAAXMMMSM
-
AXMMXSASAAAMAMXAMSSMAMAMMAMMMMXMXSMMMSXSMMXAMXMMASXMMSMMMMMMMSSMMMSAMMMMAMXAAMASAMMXMMSXAAXXSMMMMMMMMSSSSMMMMSAXXSMAMXAMMMMSXSAMMMMMXMMMXXXX
-
AAXXMSASXSMMASMMMMAMAXAMXASAAXXXASAAAMMSAAXSSMSSMSAXAXAMMSSMXXXXAAMMSSSMSMXMASASAMXXXAAXMSMXXMXSAAXXXAAXMXAMMMSMAXSXMMMMAXMAXMAMXXXXAXASAMXM
-
MSXSAMAMXMAMXSAMXSXMMSMMSASMSMMMAMXMXSASMMMAAAAMXSAAXSSMAAAASMMSMMSAAXXAAXMMMMXMAMXMMSSMMAMMAMXSMSMSMMSMMXXXAAAMMMMMSAMMSSMXSXMMMSMSXSASMAMA
-
AAAMSMAMXXXASMMAXAXMXAAAMMMXXASAMMSMXMAXASXSMMMSAMMMXAXMMMXMMAASXMMMSSMSMMSXAMMMSMSAXAAXMAMMAMXMAXAMXAXAMSMSMSMXMASASMSAXMMMSXMAXAXAAMAMXXAM
-
MMSMXSSXMMMXMAAMAMMMSMSMMXMAMAXXSAAAXXSMMAMMXAXMASMSAMXMSSSXMSMSAXXXAXMAMSMSASXMAAXSMSSMSMSSMSXMAMAMMXXAMAASXMAMSASXMAMXXAAAMASMSMMMMMMMSSSM
-
XSAXMAXAAAMAMXMSAXAMXAAXXASMMSMMMMXXMAMAMMXXSASMMMXMAXMXAASAAXMSAMSMMSSXSAASMAASMSMMMMAAAAAAAXXMAXAMMMSSMMXMAMXMMMXMMXMMSSMMSAMXAXAAXAXSAAAX
-
XSASMAMSSXSASMMSAXSAMXMXSASAAMASASAASASAMXSXMASMAMMSSMSXMXMXSMAXAMXXAAMMSMMMMXXMXAAAXMMMMMMMMMSSSSMSAXAMXSSMMMSXXAMSMSMXAAMMMAMXMMSMSMSMMSMM
-
AMAMMXMMAMXXAAXMXMXASMAMMXSMMSXMAMSXMASXMASAMAMXAMAMAAMMSXMAAMMMSMSMSXSAMXMXMSAMSSMMSSXMXSMXSXXAAAXAMMASAXMASASMMMXSAMXMSSMAMASASAMXAMXXAXXX
-
XMAMSXSMMMMMSSMMAMXAMMAMXAXXXXAMAMXXMMMMMXXAMMSMSSSMMXMAMAMXMASXXAAXAMMMMXAASAMMAMAAXAAXAXMASMMMMMMSXSMMMASAMASAMXAMXMAAXAMXXMSAMASXMSMMMSMX
-
XSASMASXAAXMAMASASMSMSASMMSSSMMMSXMMXMAXXMSSMMSAMAMXXMMSSXMASMMAMSMMMASASMSXSMXMASMXMMSMSXMXSAXMAMAMMMXMXAXASASXMMMXAMMMSAMSSMMMMMMMAAXAXAMM
-
XSMSMAMXSSSMSSXSSSXMASXSAMAAAAMAXAMXAMMSSMAMAAMAMMMMMAAAMAXAXAMAMAMXXXSAMAXAMXAMXMMASXAAXASMSAMSSSSMSAAMMMSMMXSXXMMXSXSAMAMAAXAXMXAMSMSSSXSA
-
ASASMXSAMXXXAXXSAMXMAMMXAMMSMSMAMASMSSMAMMAXMMXMMXAXSXMMSXMMSMSSMMSMSXMMMSMMXSASAASASXMMMMSASMAXXAAAMSXSAMAXMSMXSAAAMXMASXMXSMMSSMMXMXAAAAXX
-
MMAMAAMMSSMMSSMMXMSMMSMSSMXMXMMMXAMAXAMAMXMSSSMMMMSMMASASMSXAMAMAXMAXAAAAMAMAMAMXXMASXMASXMAMMXSMMMMMAXSXSAXMAAAXMMXSAMMMMMAMAXAMASAMMSSMMAM
-
XMAMXMXXMXAAAXASAMXAXMXAMSXAAMASMMMSMSMMMAMAAAAXSAMASXMASAASXXAXSMMSMMXMXXMMAMAMSSMMSASASAMMMXAAXAAXMMMMAMASMMMMSXAASAMXAXMASAMMSAMASMXAAXXM
-
MSSXMXXXXXMMXSSMASXSMSMMSXMMSMASAMXXAMAMMAMAMSMMMMSAMSMAMXMMMMSMMAMMAMASXSXSMSSMMAAASMMXMAMXMMXSSSSSSXAMAMAXMSAAXMMXSAMMXXSASMSXMMSMMASXMMSA
-
XAAASXSMAAMAXMMSXMAXAAXMAMMAAMXMAMXMXMAMSXMSXXAXAAMMMXMAXAXAAXMASMMMAXMSAAAXMAMASMMMMXXXSMMSMSAMXXAAMSSMXXXXXXMASXXMMAMXXMAXMMMAMAAAMMMXSAMM
-
MMSMMAAAXMMSSMAXXMXMSMSMMSMASMMSMMMMAMAMMAAXASXMMMSAMMSSSMSSSSSMMAASXSMMMMSAMSSXMASXSMSMAMAXAAMXMAMXMXMASXSXSXXMAXMMSXMMMMMMMXSXMMSSSXMXMASX
-
MXAAMSMMMMXAAMMMMMMAMXAAXAMXXXAAMAASXSASXMMMMMXAXXXASMAAAAAAXAAXMXMXXAAAXXMAXAMMSMMASAASAMSMSMSMASMSSXSAMASASMSMMASAAMAMAAAAMXMASXXAXAMASXMX
-
SSSMMXXXAXMMMMAAMAXMASMSMSSSMMMMSSXSASASXMAXAMSSMMMMMMMSMMMMSSSSMSSSMXMMSMSSMASAAAMAMAMMXSXAMMAMMXAAAAMMSXMAMAAXXAMXMSASMSSXSAXAMAMXSMSASASX
-
AAMXSXMSSSSSMSMSMASXASAMXAAXXAMXAMXMAMXMAXSXMMAAMXASXSXXXXAXAAAAAAAXMMSMXAAXXMMXSSSMMXMMXMMSMSASXMMMMXMAXAMAMSMSMMSAXMASAAMMSXSMSXAMMXMXXAMS
-
MMMXMAAAXAAAMXAXMAMMMMAMMMSMMSSMAXXMXMSSMMMAXMSSMSMSAASMXSXSMMMMMMSXSAAXMMMSMMXXXAAAAMXXMXAAXMAMMAMXXSMMSSMAMMAMAXMMSMMMMMSAXXMAAMSMMASXMSMS
-
XXMASMMASMSMMMMXMAMAMXAXAXXAXAAMXMMSSMAAAASAMXAAXAAMMMXSASAMXXXXXXXAMSMMXMASAMXMMSSMMSASAMSSSMAMAMSSSXAAAASASMAMSXMASXSXXAXAMMMAMXMASASAAMAS
-
XAXXXAXAMXMAXAMMSSXMASMSMMSSMSAMXAXAASMSMMMMAMSSSXMMAXAMMMAMXSMSSSMXMAXAMMASAMAAMAMXAXXXXAMXMMSSXSAMXXSMSMSXMMAMMASAMMXAMSXSAMAASASAMASMMMAM
-
SXSMSXMAXAXSMMXXAXMAXSAMMAAAXXAMXMMSMMXMASXSSMMMMAAMSMMMASAMXAAXMASMXMASMMMMAMXSAMXMSSXMXXMXAAMAXMASMXXAXASAXSAXSAMASMMAMAAMSMMXXXSAMXXAAMXM
-
XXAMAMXSMSXMASMMMXAMXMMMMMSSMMMMAMMMXXXXAMXAMXAAMMMMXASMMMAXSMSMMAMSAMXMAAMSSMAXMASAAMAMSSSXMXMXMAMXMXMAMAMAMSAXMMMMAMSMMMXMAMXSSXMASASXMMSA
-
SMMSMSAXAXAMAMAAAMAMAMMXAAXXAASXXSAMMSMMMSXMSXMSSMMMSXMAXSSMXMAMMXMXXSXSSMXAAMMMXAASMMAMMAMXMMSSSMSAMMMMMMMXMMXMMXMMAXAXAMASMSAAXXSXMXXAAAXM
-
AAXAAMAMMMXMSMMXMASMSXSAMXSMSMSAMXMSAAAXMAXXXASAMXAAXMMSMAXXAXASXMSMMMAXAXMXMMMSMSMMXSMSMAMASMMAAAMMMAAMASXSMMSSXSXSSSMSSSMSAMMSMAMAMMSMMMSX
-
MSMMXMMMSSMMXAXXXXXAMAAXXAMMMMMXMSXMXSSMMMSMXXMASMMSXMAAMAMXSMXSAXAAAMSMSMMSAMXAXXAXAXAAXASMMAMMMMMSXSXSASAXAAXMASAMAAXAAAMMXMAMAAXAMXAAASXM
-
XMAXXXAAXAAAMSMMMMMAMMMSSMXAMAAAXXAXXMXXAAAASXSXMMAXAMSSMASAMMSSXMSSMSAAXAAXMMMMSMSMSMSMSXSAXAMXXXASAXMMAMASMMSSMMAMSMMMMSMXSXMASMSSSSSSMMAS
-
MMMSMSMSSSMMMAMXAASXMXAAAASMSMSSSSMMSMAMMMXSAAMMMMMMAMMAXAMMSMMXXXMAXSMSMMMSSSSMSMAMXAMXXASXMSSMMMXSMMAXXSASAMAAXSXMAAXMSMXMXMMAAAXAAAMAASAM
-
SAAAAAAXAMMSAAMXSXSAXMASXMMXAAAMAXMAMMAMAASAMXMAAMXSSXSAMXSXAMXAMSSMAMXMAMAAAMAMXMASMMMSMXMAMAAAXMASXSXMMAASXMSSMXXSSSMMAAAMAXMAMXMMMMSSMMAM
-
SMXSSMXMAMAXMXMXXAXAMXAMMSMXMSMAXXMSSXSSMXMAXSMXSSXAAAXMASXXSSMSMAAXMAAXAMMMMSAMASMSASAAMAXAMSSMMSSMMAAAXMMMMXXAMMMMMMMSSSMSASAMXSXXAXAMXXAM
-
MSMXAXAMMMMXSSMSMAMSAMXSAAMSAMXMMMMAAAXAMASMMSAAXAMMSMMASXMAXAAXMXMMXMSSXSMSMSXSMSXSMMSASMSXMAMXAMAMSMAMXMAXAXSAMXAAAAAXXAAXASMMAXMSMXMAMSSS
-
MMXMASMSMASAAAAAMAMXAXXMXSSSMSAAXMSMXMMAXMASAMMSMAXXAXSXMAMSMMSXMASASAMAXAAAAMXSASASXAMXMMAMMMMMXSMMAXAAMASXSASAMXSASMSSMSMMXMXMAXMASAXMXAMX
-
XSAMXMAAMAMMMMMMXXMSSMMSAMXMASXSXXMAXXSXMXXMXMAAMMMSMMSASXMMXXAMMAMAMAXMSMSMSMAMAMAMMASASMASAMXSXMXSSSSXSAAAMXXXSAMXXXXAAXAXSXMMSMMAMMMXMAXX
-
AMXSAMXMMXSAXMXSSSMAAAXMASAMMMMMMSXAMMXMMSXMMMSSXSAXXASAMMMAMMXSMASMSSMXAAAXMMXSAMMMMMSAMSXSASAXAMAMAAAAMMSXMXMAXAXMMSSMMMSMSAXAMMMSMSMSXSXX
-
MSMMASXSSXMMSMAMAAMSMSASMSXSASAMASMSSXAMASXMAXAAAMXSMXMAMAMASMAMMMMXAAXSMSMSXAAMAMMXMAMXMXXMAMXXXMAXMMMMMMMMMXSSXSMAAAAXAXMASXMASAMXAAASAMXS
-
MAAMAMMAMXXAAMAMSMMASXXXASMSASAMXSAAAXAMAXAXSSMMSMXMXMXMSMSASMMXASMMSMMXXAMXMMMXAMXAMMSSMXSMXMSMXSSSXXASXSAMXAMXAMSMMSSMMAMAMAMXMAMMMMXMAMAX
-
SMSMSXMAMXMSSSMMXXXMSXSMAMAMASMMAMMMASMMMSSMMXMAAMASAMAAAAMASAMSAMXAXAMMMSMSXAXSXMMSSXAAXAXXAAAAAAXMXMMAASMMMXSMAMAXMAMAXXMXSXMASAMSASXSMMSS
-
SAAAXASASAAMAAXSAMSXSASMAMXMAMASXXASXSAAAAAAXSMXXSXSASMSMSMXMAMMSMMMSSMAAMASMMMAASAMXMSMMSSXMMMMMMSMMMAMXMASMSAAAXXMMMSSSMSAMXSXMAMSASAMXAAA
-
MSMSSMMASMSMMMMMAMXAMAMMXSXMMSAMASXSASXMMSSMMXAXXMASXMAMXMXAMAMMAMAAMXSSMMAMASAMAMXSXMAAAAMXSSSXAXAAAMASAXXAXSMSMSAMXAAAAAAXMXAASXMMSMMAMMSS
-
XXXAAAMAMMXXMXMMAAMXMAMXAMMSMMAXXSAMMMAXAMAXSMMMAMAMSMXMAXMSSSXSASMSSXXXAMMSAMMSMXAMASXMMSMMMAXSASMSMSASMSSMMMXAAMAMSMMSMSMSMSMXMAAXAXMASAAM
-
SMMSSMMAMAAXMAMXSSSMSSMMMSAAXSSMMMAMAMXMXSAMXAASXXXMXMASMSMMAAASXSMAMXASXMAMAXXAXMASAMXSXXXAMXMAMSAMXMASXAXMMSMMSMSXXMAXXMAMMMXMAXMMMMSAMMSM
-
MAAAAXSSSMXSSXXAMXXAMXSXMAMXXAAAMSMMMSMMMMMSSSMSMMSMASASAAAMMMMMXXAAXMMMSMXXMMSASXXMASASASAXMMAMASXMXMMSMMXSAXMAMMMMAMXSMMMMMXMASAMXXXMAXXAM
-
SSMSSMXMAMAAAAMSMMMSMXAXMAXXXSMMXAAAAAAAAMAAAMXMXAAMAMXMMMXSXMXXMMMSSSXAXSMMSMMMMMAMXMASASAMMMXSAMXMMSAXASAMMSMMSASXMMAMXAMMSXSAMAAMASXMASXS
-
XAXAMAAMAMMMMMMXAAAAMSMAMMSSMXSSMSSMSXSMSSMMXMAXMSSXSSSSSXASAMSAMXAAMXMAXMMAAAAXXSSMMSAMAMMSXMXMXSASAMMSXMASAMXMSXMAMSASMXSAAMMMXMMMAXASXMAA
-
SXMXSMMMSXMMSASXSMXMMAXMXAAMAMASAAAAAXMAMXMXASMSXAAXXAMASMXXAMXXXMMMMAXXMMMSSSMSAAXXXSAMXMASASXSXSXMASAMASMMXMAMMMSSMSASMAMMMMAXSSMMMSMMAXMA
-
AAMASXMAMAAAXMXAXAAXXMSSMXMMSMAMMMMSMMSAMAAMMMASMMXXMAMAMXXMAMXSAMASMMSMSXAXAMASAMXMASAMMMMSAMAMXMASAMASXMMAASAMMAMXAMXMMSSSXMMSAAAAAAAXXMXM
-
SXMASXMASXMMSSMXMMXSASAMXSAMXMAXSAMXAXSAMAXMAMAMASAMSMMMSAXSAMXMAMASAAMAMMXMXMAMASASAMAMXAMMMMAMXSXMMSAMAAMSXSAXMAMMSMMSXMAMXAXAXSMMSSSSMMAS
-
MAMASMMASAMXAXXXXAAXXMAXAMXMSSMMSAXMXMSAMASXSMMSAMAXAAAAMAMXASMSAMSSMMMSMMMAMMSSMMAMAMSMSAMAMXMSMMMAAMMSSSMMAMXMSAMXAAAXXMAMXSXMMMMMAMXAASAM
-
MAMAXAMASXMMASMSMMSSXMAMSSMMAAXASMMSMMSAMAMXAAAMAMSMSSMSMMSXAXXXXMAXXXAXAAMSMAAAMMXMAMXAXXSASXXAAAMMSMMAXMASMXSXMAMSAMXSMSSSXMXXAXAXMMSSMMSS
-
SMMMSXMXSMXSXAMMAAAXXMAXMAMMSXMMMSAAAMSXMXSMSMMSSMXAXAMXMAMMSMSXSMXMAMXSSMSXMSSMMXMAXAMAMMAAMASXSXSMAAXMAMXMXAAASAMXSXXXAMXMASAMXSSMXXAAXAMX
-
AAAXMXSAMXMMSMASXMSMSSMMMAMXXASAMMXXMAMXXSAMXAXAAMMMMSSMMMSAAAMAXXMSSMAMAXAXXXXAXXMSSMMMMMMMSMAAXASXSMMMSMSXMASAMXMAAMSMSMAXMMMSMAXSMMSSMSSS
-
MSMXAMXASMMMAMXMMMXMAAASMMSASAMAMASMSMAXMMMMSXMASMAXMAMAAAMXSMMXMXMAXMMSAMMMMMMMAMAAAAAAAXXMAMMMMMMMMASXAAXXMXXASAMXSAXMAXMXSAAMMMMAMAMAMXAX
-
MXXXAXSXMAXMXMAAAAMMSMMMAAMXSXMAMXSAAXMSMMAAMAMAMXSSMASXMMSAMXSAMAMAXXMXMMSAAASMSMMSSMMSMSASASXSXMAXMAMXMMMSMAXASXSAMXSXMMMAXMMXAXSMMMSASMMM
-
AAAMXMMMSMMMSSMSMXSAXMSMMMMAXXSSSMMMMMAAAXMMSAMSXMMMXXSMAMMMSASMXAMSSSSSMASXMXSAXAMMAMXAMXAMASAMMSMSMMMXSAAAMAMAMASXMASAAAMXSSMSSXXXAMAMXAAM
-
MMSXMAXAAXAAXAXXXSMMMMAMXAMXSMMMAXAASMSSSMMMMXXXASAMSXMMMMAAMMMMASXMAXAAMAMMXAMXMMMMAMMXXMMSSMAMAAMXMAAAXMSMXAMAMXXAMASMMMSAAAMAMXSAMXSSSSMS
-
AXAASMMSSSMSSSMMMSAAMSASMSMXAMASAMSMXAMMMAAXMMSSMMAMMMSAAMMSSSMSAXASMMXMMSXSAXAAXMASASXSXSASASXMSSMAMMMMXXAMSMMXXMMMMAMAAAMMSMMASMAAMXAAAAAX
-
MMMMMXAXAAAAXAAAASMMXMAMAAMMSXAXXAXMMSMSXSMSXAXAASXMAAMMMMMXXAAMASAMXAXSXMAXMASAXSASXSAXAMXSMMXMMXMAXAAXXMAMXMASASASMMSSMSSMXAMASASXSMMMMMMM
-
SSMSSMSMSMMMSSXMMXAXAXAMSMSSMMSSMSAMXXAXAAXXMMSSMMXSMSMSSSSMMMMMMMMMMSMSAMMMXXXAXMASMMMMXMAMXXSMXXSMSMSSSMAMMMXSASASXMAMXAAXSAMASMXAAAXMAMAX
-
AAAAXAAAAXXXXMXSASXMMMXXMASAXAAXMAMXMMAMSMMXAXMMMSASMXAAAMXAAAAXXAAMXMAMMMXMXXMMMMXMAAXMXMSSMMASXMAXAAXAXMASXMASXMAMMMASMSSMSAMXSXMXMSMMSSMS
-
SMMMSXMSMSMMSMMMASMAXSSMSSSMMMMSMAMAXMMMAAXXSXXAAMMSAMMMMMSSMSMSSSMSAMSMSSXMSSMAMMXMXAMXAXMAASAMMSMMMSMAMSMSAMASXMXMASAMXMXMSAMXMXSMMMAMAAAS
-
XAMASAAAXAAMAAMSAMXSMXMASAXXAAMAMASMSXXSSSXAXSMMSSXMXMXMMXXXAXMAMAASMSMAMAAXAXXAXXAMXAMSSSMSMMASAAXAAAMXMAASXMASXMAMMXMSMSAXSXMAMAXAAXAMMXMM
-
SXMASMMMXASXMSMMAMXMXMMSMMMMSXSAXXAMXAMMAMMAMAXMAXAMMSXMXSSMSMMASMMMXXMAMSMMMSSSMSAMAAMAAMXAASMMXSSMSXXAMMMMAMASASASMMMAASMMMMSAMASMMSMSSXAA
-
XXMASXAAXMXMAXMSSMMXAXXMAMAAMAMAMSAMMSMMAMMASMMSSSMMAAAMAXAAAAXAXMASXXSAMMAAXMAAXXAXSXMMSMSSXMAAXXAAAASMXXASXMASAMXAAMMMMMMAAMXAMASAAAAAMXXM
-
MXSASMMSSMAMMMMAAAASXSMSMMMMMAMAMSAMAXASMXSASXAAAAMMMXXMMSMSSMMXSXXMSXSMSSSMSMMXMMMMMAASAMXMASMMSSMMMAXAASASASXMXMMMASAXAASMSMSAMXSMSMSMSMSX
-
SAMSSMMAAMAMAAMSMMMMAAAAAASMSSMMXSAMXSAMAMMXSMMMMSMSSMSAAXXAAASAMXSXMMSAAAXXXMMSMAAAXSMMAXSAAXAAAXMAMXMSMSASAMAMXSXMAXMMSMMXAASAMXXAXAMASAMM
-
MXMAXAMXSXMXSXXXSXAMSMMSSMSAAAXMAXAMXMAMMXSAMMSSMAAAMMXMSSMMSMMASASAMAMMMSMSSMMASMMXXAMXSMAMXXMMSXSASAAMAMXMAMXMASMMMXXAMAXMMMMAASMAMSMAMAMA
-
ASMMMAMXXASMXMASXXXXMAAAXXMMMMMMMMSMAXAMXXMMXAAAXMMMSSMMMAMAXAXMMASXMAMAXAAMXAMXXXAXMASAAAMMSMXAMASAMMMXXXMSSMAMASASAAMSSMXSAMSXMSXMAXMXSXXX
-
AXAAMSSXSAMAAASMAMSSSMMSSMXAAAMXMAAXSSMMSAASMMSMMXXSAMAAMAMXSAMSMMMASMSMSMSMSMMSXMAMSXMXSMXAAXXMAMMMMSXMXSAAXSAMAXMMMMSAAXASMMMMMMAMAMMMMMSM
-
SSMMXAAMMAMSXSAMXMAAAMAAXMSSMMSAMSSMMAAAAMAMXMAMSSMMASMMSSSXMXMAASMMMAAAAAMXSAAXAMXXAMXMXMSSMSSSMXXSASAAAMMMMMMMASXMXMMMSMMXXAMAASAMASMAAAAA
-
XAAAMMSMMAXXXMASXSMSMMSSXXAMAMMMMAAAMMMMASMSSMASAAASAMXAAMXAASXSXMAXXSMMMXMASMMSSMSAMXXAXMAMXMAAAAXMASMMMSMMAXAXMAXMSSMXAMXSXMSSXSXSASXSMSSS
-
SSMMXAAASXMSASMMAXXXXAXXXMAMMMAMMSSMMSXXMXAAASMMXSMMMSMMMMMMMMMMMSMMXMMMSXMASAAAAAXSXMASMMASXMSMMMSMAMAMAMXSASMSMSAXAAXXXSAMXMAMAXAMASAMXXXM
-
XXSXMMSMMAASAMXMXAMMMMSMSMSMMSASMMMMXMAMMMMSMMXMAMXAMXASMSMSSXAAAAAXXSAASAMASMMSMMMMXAMXASAMXMAMAMAMASXMASMMAMAAAMMMSSMSMMASMMAMSAMMXMMMMMXM
-
XASXSMMXMMMMMMXXSXMAAMAAAAXAASXSMXAXAMXMXMAMXMAMXMSSMMXSAAAAMSSSSSXSASMMSAMXSXMAMAAXASXSMMASAMAXASMSMSASXSMMMMSMMMXAXAAAASXMASAMXAXXAAAAAXMA
-
MSMAMAAASXMXSXSXAASXSSMSMSMMMXMSASMSMSMMAMASASXSAAMMASXMMMMMMAXAXAAMAMSASXMMSAMXSMXSMMAMASXMXSXXMMAAXSMMMMAAAMAMXXSSMMSMMSASMSXSMSMAMSSSXSAS
-
SAMXMMSMSASXSASMMMMAMMAAAXMASXAMXMAAAAXSAMMSAMASMSMSAMAAXXSSMMSMMMMMMMMMMAMASASAMXASAMXMAMXMAXXASXSSMXSAASMMMSAMXAAAAAXXAXMMAXAAAMAMXAAXMAMX
-
SMSMMXMASAMAMAMXSMMAMMSMSMMASMMMMSSMMMXSASXMXMXMAXAMXSMMMMXAAAAAMAMAAAXAMAMXSAMXSMMSASXMMSXMAXSSMAAAAXXSMSAAAMAMAMSSMMMMAMSMXMMMSMAXMMSMXMAS
-
MXMAXAMXMAMXMAMMAMMSXXAAXXXAXAAMAXXMXXXSAMMMAMAMMMSMMMXSAMXSMMSXMAXSMMMXSSSXXMMMXMASAMASAMXMMMSAMSMMSMXMMMMMMSAMXMAMMSMMMXSAMXAXAMMMSAMXXSAX
-
MAMXSMXMMXMAMXMAMMAMAMMXMMMMSSMSMMAMAAXXMXASASASAAAAAAAMASAMAAAAMSMXMMSAXAAXXMASAMMMASAMAXSAMXSAMAXAXMASAMXAXSXMASXMASXMSAMXXSMXSASAMASAMMMS
-
SMSXAXAMXSSSSSSSXMAMAXXAMAAMMAAAMSAMASAAXSXSASASMSXSMSSSSMXSXMMSMXAMAAMMMXMMXSASXSXSAMXSAMXXMAMMMMMMMMXXAMMAXXASAXAMASAXMMSMMSXSXMASMXMASAMA
-
AASXMMXSAAAXAXMXSMMXMMMSXSMSXMMMXXASXMXMMMXMMMAMMXAMAAMMXAMMMSXMAMAMMMSXMSMSAXASAMXMXSAMXMASMSSMAXAMSXMMAMSMSSMMXSAMASXMAXAMAMXMAXMMMAAXSASM
-
MXMASAAMMMMMXMXAXXXAXAMMXMMSXXMXXMAMXAASAMXSAMAMAMAMMMSXMSMAAMASXSSMAAAAXAAMMSASMSAXSMXSSMMXMMAMXSMSAAMSMMAMAAAAAXAMAMXAAXSMMSMSAMSASMSMSAMX
-
XSSMMMSSXSAMMSMMSSSMXASMASAMAXSASMAMXSMSASXAMSMSXSXMSXXMAMSMXSMMAAXAMXXMMMSMXSASASAMXMAXAXMAMMAMXMMSMMMAAAMMSSMMSSMMASMSAMXMXAMXXXSAMMAXMXXM
-
AMAAMXMXASXSAAAXAAAASXMXAMASAXMAMSXSAXASMMXMXAAMAMXMMASMSMMSMAMMMMMSSXMSAMAMXMAMMMSAMXMSMMSMSMAMXAAXXASMXMXXMAMAAAXSAMXMAMXMMMSAMXMMMSSSSSMM
-
XSSMMAMMMMAMXMXMMMMMMMAMXSMMMSMAMXMMASAMXSAXMMSMAXSXMAMXMSAAXMMSXXMASAAXMMAMXMAMXAXXAAXAXAAAXMASMMMSSMMAASXSSSMSSXMMSSSSMMMSAMSXMASAAXAAXMAX
-
MXMAXAMAMMMMMMMMMXMXAMSMMMAMXAXXMAXMAMAMASMSXAXXMMSAMAXAMMSSSMASAMXXMSMMMSMXAMMMMMSMSMSSSSMSMSAMXAAAXXMSMMAXAAAAMXSAMXMASAASAMSASAMMSSMSMSSM
-
AAXSSMSASXSAAASXSAXMAXAAAAAMSXSSSSMSASXMAMMMMMMAMASMMSSMSAMXAMASAXXMMAMMAAXMSMXAAXXXAMXAAASAMXMXSMMSSXAAAMMMSMMMSAMMMAXXMMMSAMXAMASXMXAAAXAX
-
SAMXAAAAMASMSXSASASXSSSMMXSMXMXMAMASAXMMMXAMSSSMMAXAAAAMMMMSSMASMMMMMASMMSSXMASXSMSSSSMMMXMXXAMMMXMXXMMSMMXAXAMXMASMMSMXXAASAXMXMASAAMSMSSMM
-
MMASMMMMMXMAMAMXMAMAAXAASXMASAMMAMXMSMSASMAMAAAXMMSMMSSMASXSAMXSASAASASXMAMXMXMAAAAMXXAXXAMXSXSAXAAMMAMAAXMXSMMASMMMAMAMSMXMXMSMMAXMMMXXAAAA
-
SXXXAMXSMAMXMAXMMAMXMSXMMAMAXMXMASAMXMMAMXXMXSMMAMAMXXXMASXMSMASAMMXAAXXMSSMSASMMMMSSMMMSXSAMASMSMSAASMMSASXSASASASMASAMXMSSSMAAMXXSAMMMSSMM
-
MMMMAMAMSMSMSMSASMSMMMMMMAMMMSMSASMMASMAMXSMMXMXMXMSSMSMASXMAMXMMMXSMMMXXXXAXXSXMXXMAASAMXMASAXAMXMXMXAAXAXXMAMXSAMMMXAXMMAAXSAMXMASASAAAAAX
-
SASMSMXXAMAAAAAAMAXAAAAXSSSSMAAMASMSASMASAAAAMMAMAXXAMMMASASXSMSMSASAASMMMMSMMMAMXMMSMMAMMSMMMSSMSMSMSMMMMMSMAMAMASAMXSMSMMSMSMSSMMSAMMMSSMM
-
MASAAAXSASMSMSMMMXMSMSSXXXMASMSMMMAMAXMASMSMMXSASMSSMMXMASXMASAAAMASXMAASAAAMASAMAXMAMSAMAAAAAXAASAAMAAAASAASAMXSASASAAAAASAASAAXAXMXMXAAMAS
-
MMMMMMMSMMXAAXXMMXAXMAXASMSAMMAAXMXMXMMMSMXMAMSXSMXAXSXSAMXXAMMMSMMMMSSSMMSSSXSSSXSXMASMSSSSMSSMMMSMSSSSSSSXSSSXMASAMMSMSSMMSMMMSAMXAXAMMSAM
+39
2024/day_04_part_2.f90
···
+
program day_04
+
implicit none
+
character(len=140) :: lines(140)
+
character(len=1) :: c
+
integer :: io, row, col, score, z
+
logical :: left_m, right_m
+
+
left_m = .false.
+
right_m = .false.
+
score = 0
+
open(newunit=io, file='./day_04_input.txt', status='old', action='read')
+
read(io, '(a)') lines
+
do row = 2, size(lines) - 1
+
do col = 2, len(lines(row)) - 1
+
if (lines(row)(col:col) == 'A') then
+
c = lines(row-1)(col-1:col-1)
+
if (c == 'S' .or. c == 'M') then
+
left_m = c == 'M'
+
c = lines(row-1)(col+1:col+1)
+
if (c == 'S' .or. c == 'M') then
+
right_m = c == 'M'
+
c = lines(row+1)(col-1:col-1)
+
if (right_m .and. c == 'S' .or. (.not. right_m .and. c == 'M')) then
+
c = lines(row+1)(col+1:col+1)
+
if (left_m .and. c == 'S' .or. (.not. left_m .and. c =='M')) then
+
score = score + 1
+
end if
+
end if
+
end if
+
end if
+
end if
+
left_m = .false.
+
right_m = .false.
+
c = ''
+
end do
+
end do
+
print*, score
+
+
end program day_04
+193
2024/day_05.f90
···
+
module day_05_utils
+
implicit none
+
contains
+
subroutine append_to_integer_array(arr, val)
+
implicit none
+
integer, allocatable, intent(inout) :: arr(:)
+
integer, intent(in) :: val
+
integer, allocatable :: temp(:)
+
if(.not. allocated(arr)) then
+
ERROR STOP 'Array not allocated'
+
end if
+
allocate(temp(size(arr) + 1))
+
temp(1:size(arr)) = arr
+
temp(size(arr) + 1) = val
+
call move_alloc(temp, arr)
+
end subroutine append_to_integer_array
+
function fix_and_get_middle_value(arr, left, right) result(res)
+
! we are going to fix the array swapping until its right
+
! there's probably a better way maybe? but I just want to get it done
+
implicit none
+
integer, allocatable, intent(in) :: arr(:), left(:), right(:)
+
integer, allocatable :: work(:), copy(:)
+
integer :: res, i, j, tmp
+
logical :: found
+
allocate(copy(size(arr)))
+
copy = arr
+
do
+
found = .false.
+
outer: do i = 1, size(copy)
+
if(i+1 < size(copy)) then ! if we can check forward
+
if(allocated(work)) then
+
deallocate(work)
+
end if
+
do j = 1, size(right) ! find value in right and save left to work
+
if (copy(i) == right(j)) then
+
if(.not. allocated(work)) then
+
allocate(work(1))
+
work(1) = left(j)
+
else
+
call append_to_integer_array(work, left(j))
+
end if
+
end if
+
end do
+
do j = i+1, size(copy)
+
if(any(work == copy(j))) then
+
tmp = copy(i)
+
copy(i) = copy(j)
+
copy(j) = tmp
+
found = .true.
+
exit outer
+
end if
+
end do
+
end if
+
+
if(.not. found) then ! if we are still valid lets keep going
+
if(allocated(work)) then
+
deallocate(work)
+
end if
+
if(i-1 > 0) then ! if we can check backwards
+
do j = 1, size(left) ! find value in left and save left to work
+
+
if (copy(i) == left(j)) then
+
if(.not. allocated(work)) then
+
allocate(work(1))
+
work(1) = right(j)
+
else
+
call append_to_integer_array(work, right(j))
+
end if
+
end if
+
end do
+
do j = 1, size(copy)
+
if(any(work == copy(j) .and. j < i)) then
+
tmp = copy(i)
+
copy(i) = copy(j)
+
copy(j) = tmp
+
found = .true.
+
exit outer
+
end if
+
end do
+
end if
+
else
+
exit outer
+
end if
+
end do outer
+
if(.not. found) exit
+
end do
+
res = copy((size(copy) + 1)/2)
+
deallocate(copy)
+
if(allocated(work)) then
+
deallocate(work)
+
end if
+
end function fix_and_get_middle_value
+
end module day_05_utils
+
program day_05
+
use day_05_utils
+
implicit none
+
integer :: io, ios, idx, a, b, ct, i, j, res, res_part2
+
integer, allocatable :: left(:), right(:), print_list(:), work(:)
+
character(len=100) ::line
+
logical :: found
+
+
open(newunit=io, file='./day_05_input.txt', status='old', action='read')
+
res = 0
+
res_part2 = 0
+
do
+
read(io, '(a)', iostat=ios) line
+
if(ios /= 0) exit !eof
+
idx = index(line, '|')
+
if(idx > 0) then ! rules
+
read(line(1:idx-1), *) a
+
read(line(idx+1:), *) b
+
if(.not. allocated(left)) then
+
allocate(left(1))
+
left(1) = a
+
else
+
call append_to_integer_array(left, a)
+
end if
+
if(.not. allocated(right)) then
+
allocate(right(1))
+
right(1) = b
+
else
+
call append_to_integer_array(right, b)
+
end if
+
end if
+
idx = index(line, ',')
+
if (idx > 0 ) then ! print_list
+
ct = 1
+
do i = 1 , len_trim(line)
+
if(line(i:i) == ',') then
+
ct = ct + 1
+
end if
+
end do
+
allocate(print_list(ct))
+
read(line, *) print_list
+
found = .false.
+
do i = 1, size(print_list)
+
if(i+1 < size(print_list)) then ! if we can check forward
+
do j = 1, size(right) ! find value in right and save left to work
+
if (print_list(i) == right(j)) then
+
if(.not. allocated(work)) then
+
allocate(work(1))
+
work(1) = left(j)
+
else
+
call append_to_integer_array(work, left(j))
+
end if
+
end if
+
end do
+
do j = 1, size(work)
+
if(any(print_list(i+1:size(print_list)) == work(j))) then
+
found = .true.
+
exit
+
end if
+
end do
+
deallocate(work)
+
end if
+
if(.not. found) then ! if we are still valid lets keep going
+
if(i-1 > 0) then ! if we can check backwards
+
do j = 1, size(left) ! find value in left and save left to work
+
if (print_list(i) == left(j)) then
+
if(.not. allocated(work)) then
+
allocate(work(1))
+
work(1) = right(j)
+
else
+
call append_to_integer_array(work, right(j))
+
end if
+
end if
+
end do
+
do j = 1, size(work)
+
if(any(print_list(1:i-1) == work(j))) then
+
found = .true.
+
exit
+
end if
+
end do
+
deallocate(work)
+
end if
+
else
+
exit
+
end if
+
end do
+
if (.not. found) then
+
res = res + print_list((size(print_list) + 1)/2)
+
else
+
res_part2 = res_part2 + fix_and_get_middle_value(print_list, left, right)
+
end if
+
deallocate(print_list)
+
end if
+
end do
+
+
deallocate(left)
+
deallocate(right)
+
print*, "Result ", res
+
print*, "Part 2 Result ", res_part2
+
end program day_05
+64
2024/day_06.f90
···
+
program day_06
+
implicit none
+
character(len=130) :: line, lines(130)
+
integer:: io, x,y, xd,yd, i, ct
+
+
open(newunit=io, file='./day_06_input.txt', status='old', action='read')
+
read(io, '(a)') lines
+
+
ct = 0
+
! find starting position
+
do i = 1, size(lines)
+
if (index(lines(i), '^') > 0) then
+
y = i
+
x = index(lines(i), '^')
+
xd = 0
+
yd = -1
+
exit
+
end if
+
end do
+
+
! move until we leave the bounds when we hit a valid spot mark it with an X and increase count
+
do
+
! are we going out of bounds?
+
if (x+xd < 1 .or. x+xd > len(lines(y)) .or. y+yd < 1 .or. y+yd > size(lines)) then
+
ct = ct + 1
+
lines(y)(x:x) = 'X'
+
exit
+
end if
+
+
! try to move
+
select case(lines(y+yd)(x+xd:x+xd))
+
case('.')
+
! valid move
+
ct = ct + 1
+
x = x + xd
+
y = y + yd
+
lines(y)(x:x) = 'X'
+
case('X')
+
! valid move but we've been here before
+
x = x + xd
+
y = y + yd
+
case('#')
+
! we are blocked lets rotate 90 degrees
+
if(xd == 0 .and. yd == -1) then
+
xd = 1
+
yd = 0
+
else if (xd == 1 .and. yd == 0) then
+
xd = 0
+
yd = 1
+
else if (xd == 0 .and. yd == 1) then
+
xd = -1
+
yd = 0
+
else if (xd == -1 .and. yd == 0) then
+
xd = 0
+
yd = -1
+
end if
+
case default
+
exit
+
end select
+
end do
+
print*, lines
+
print*, "distinct: ", ct
+
end program day_06
+
+97
2024/day_06_part_2.f90
···
+
program day_06_part_2
+
implicit none
+
character(len=130) :: line, lines(130), temp_lines(130)
+
integer:: io, x,y, xd,yd, i, j, ct, o_ct, init_x, init_y, init_xd, init_yd
+
+
open(newunit=io, file='./day_06_input.txt', status='old', action='read')
+
read(io, '(a)') lines
+
+
ct = 0
+
! find starting position
+
do i = 1, size(lines)
+
if (index(lines(i), '^') > 0) then
+
y = i
+
x = index(lines(i), '^')
+
lines(i)(x:x) = '.' ! replace with a dot to not confuse this part
+
xd = 0
+
yd = -1
+
init_x = x
+
init_y = y
+
init_xd = xd
+
init_yd = yd
+
exit
+
end if
+
end do
+
+
do i = 1, size(lines)
+
do j = 1, len(lines(i))
+
o_ct = 0
+
! reset positions
+
x = init_x
+
y = init_y
+
xd = init_xd
+
yd = init_yd
+
temp_lines = lines ! fresh board every run
+
if(temp_lines(i)(j:j) == '.') then
+
temp_lines(i)(j:j) = 'O' ! place obstacle to test
+
! move until we leave the bounds when we hit a valid spot mark it with an X and increase count
+
do
+
! are we going out of bounds?
+
if (x+xd < 1 .or. x+xd > len(temp_lines(y)) .or. y+yd < 1 .or. y+yd > size(temp_lines)) then
+
exit
+
end if
+
+
! try to move
+
select case(temp_lines(y+yd)(x+xd:x+xd))
+
case('.')
+
! valid move
+
x = x + xd
+
y = y + yd
+
case('O')
+
! we are blocked lets rotate 90 degrees and count obstacle
+
o_ct = o_ct + 1
+
if(xd == 0 .and. yd == -1) then
+
xd = 1
+
yd = 0
+
else if (xd == 1 .and. yd == 0) then
+
xd = 0
+
yd = 1
+
else if (xd == 0 .and. yd == 1) then
+
xd = -1
+
yd = 0
+
else if (xd == -1 .and. yd == 0) then
+
xd = 0
+
yd = -1
+
end if
+
case('#')
+
! we are blocked lets rotate 90 degrees
+
! change this to an O to try and detect when stuck
+
temp_lines(y+yd)(x+xd:x+xd) = 'O'
+
if(xd == 0 .and. yd == -1) then
+
xd = 1
+
yd = 0
+
else if (xd == 1 .and. yd == 0) then
+
xd = 0
+
yd = 1
+
else if (xd == 0 .and. yd == 1) then
+
xd = -1
+
yd = 0
+
else if (xd == -1 .and. yd == 0) then
+
xd = 0
+
yd = -1
+
end if
+
case default
+
exit
+
end select
+
if(o_ct > 100) then
+
exit ! probably stuck
+
end if
+
end do
+
end if
+
if(o_ct > 100) then ! we got stuck probably 100 is so arbitrary
+
ct = ct + 1
+
end if
+
end do
+
end do
+
print*, "block points: ", ct
+
end program day_06_part_2
+57
2024/day_07.f90
···
+
module day_07_utils
+
use iso_fortran_env, only: int64
+
implicit none
+
contains
+
recursive function test_values(arr, target, next_idx, current_value) result(pass)
+
implicit none
+
integer(kind=int64), intent(in) :: target, current_value, arr(:)
+
integer, intent(in) :: next_idx
+
logical :: pass
+
if(next_idx > size(arr)) then
+
pass = current_value == target
+
return
+
end if
+
pass = test_values(arr, target, next_idx + 1, current_value + arr(next_idx)) .or. &
+
test_values(arr, target, next_idx + 1, current_value * arr(next_idx))
+
end function test_values
+
logical function is_calibrated(arr, target)
+
implicit none
+
integer(kind=int64), intent(in) :: target, arr(:)
+
is_calibrated = test_values(arr, target, 2, arr(1))
+
end function is_calibrated
+
end module day_07_utils
+
program day_07
+
use iso_fortran_env, only: int64
+
use day_07_utils
+
implicit none
+
integer(kind=int64) :: test_number, res
+
integer(kind=int64), allocatable:: work(:)
+
integer :: io, ios, idx, i, ct
+
character(len=200) :: line, work_line
+
logical :: pass
+
res = 0
+
open(newunit=io, file='./day_07_input.txt', status='old', action='read')
+
do
+
read(io, '(a)', iostat=ios) line
+
if (ios /= 0) exit
+
idx = index(line, ':')
+
if (idx > 0) then
+
read(line(1:idx-1), *) test_number
+
ct = 0
+
work_line = trim(line(idx+1:len(trim(line))))
+
do i = 1 , len(trim(work_line))
+
if(work_line(i:i) == ' ') then
+
ct = ct + 1
+
end if
+
end do
+
allocate(work(ct))
+
read(work_line, *) work(:)
+
end if
+
pass = is_calibrated(work, test_number)
+
if(pass) then
+
res = res + test_number
+
end if
+
deallocate(work)
+
end do
+
print*, "Result: ", res
+
end program day_07
+68
2024/day_07_part_2.f90
···
+
module day_07_part_2_utils
+
use iso_fortran_env, only: int64
+
implicit none
+
contains
+
recursive function test_values(arr, target, next_idx, current_value) result(pass)
+
implicit none
+
integer(kind=int64), intent(in) :: target, current_value, arr(:)
+
integer, intent(in) :: next_idx
+
character(len=20) :: str_1, str_2, concat_str
+
integer(kind=int64) :: concat_value
+
logical :: pass
+
+
if(next_idx > size(arr)) then
+
pass = current_value == target
+
return
+
end if
+
+
write(str_1, '(I0)') current_value
+
write(str_2, '(I0)') arr(next_idx)
+
concat_str = trim(str_1) // trim(str_2)
+
read(concat_str, '(I20)') concat_value
+
+
pass = test_values(arr, target, next_idx + 1, current_value + arr(next_idx)) .or. &
+
test_values(arr, target, next_idx + 1, current_value * arr(next_idx)) .or. &
+
test_values(arr, target, next_idx + 1, concat_value)
+
end function test_values
+
logical function is_calibrated(arr, target)
+
implicit none
+
integer(kind=int64), intent(in) :: target, arr(:)
+
+
is_calibrated = test_values(arr, target, 2, arr(1))
+
end function is_calibrated
+
end module day_07_part_2_utils
+
program day_07_part_2
+
use iso_fortran_env, only: int64
+
use day_07_part_2_utils
+
implicit none
+
integer(kind=int64) :: test_number, res
+
integer(kind=int64), allocatable:: work(:)
+
integer :: io, ios, idx, i, ct
+
character(len=200) :: line, work_line
+
logical :: pass
+
res = 0
+
open(newunit=io, file='./day_07_input.txt', status='old', action='read')
+
do
+
read(io, '(a)', iostat=ios) line
+
if (ios /= 0) exit
+
idx = index(line, ':')
+
if (idx > 0) then
+
read(line(1:idx-1), *) test_number
+
ct = 0
+
work_line = trim(line(idx+1:len(trim(line))))
+
do i = 1 , len(trim(work_line))
+
if(work_line(i:i) == ' ') then
+
ct = ct + 1
+
end if
+
end do
+
allocate(work(ct))
+
read(work_line, *) work(:)
+
end if
+
pass = is_calibrated(work, test_number)
+
if(pass) then
+
res = res + test_number
+
end if
+
deallocate(work)
+
end do
+
print*, "Result: ", res
+
end program day_07_part_2
+142
2024/day_08.f90
···
+
module day_08_utils
+
implicit none
+
type node
+
character :: c
+
integer, allocatable :: x(:), y(:)
+
end type node
+
contains
+
subroutine append_to_integer_array(arr, val)
+
implicit none
+
integer, allocatable, intent(inout) :: arr(:)
+
integer, intent(in) :: val
+
integer, allocatable :: temp(:)
+
if(.not. allocated(arr)) then
+
ERROR STOP 'Array not allocated'
+
end if
+
allocate(temp(size(arr) + 1))
+
temp(1:size(arr)) = arr
+
temp(size(arr) + 1) = val
+
call move_alloc(temp, arr)
+
end subroutine append_to_integer_array
+
+
subroutine add_node(nodes, c, x, y)
+
type(node), allocatable, intent(inout) :: nodes(:)
+
type(node), allocatable :: temp(:)
+
character, intent(in) :: c
+
integer, intent(in) :: x, y
+
integer :: i
+
do i = 1, size(nodes)
+
if (nodes(i)%c == c) then
+
if(.not. allocated(nodes(i)%x)) then
+
allocate(nodes(i)%x(1))
+
nodes(i)%x(1) = x
+
else
+
call append_to_integer_array(nodes(i)%x, x)
+
end if
+
if(.not. allocated(nodes(i)%y)) then
+
allocate(nodes(i)%y(1))
+
nodes(i)%y(1) = y
+
else
+
call append_to_integer_array(nodes(i)%y, y)
+
end if
+
return
+
end if
+
end do
+
allocate(temp(size(nodes) + 1))
+
temp(1:size(nodes)) = nodes
+
allocate(temp(size(nodes) + 1)%x(1))
+
allocate(temp(size(nodes) + 1)%y(1))
+
temp(size(nodes) + 1)%c = c
+
temp(size(nodes) + 1)%x(1) = x
+
temp(size(nodes) + 1)%y(1) = y
+
call move_alloc(temp, nodes)
+
end subroutine add_node
+
end module day_08_utils
+
+
program day_08
+
use day_08_utils
+
implicit none
+
character(len=50) :: lines(50)
+
integer :: io, i, j, k, l, score, xdist, ydist
+
integer, allocatable :: anti_x(:), anti_y(:)
+
type(node), allocatable :: nodes(:)
+
logical :: found
+
+
open(newunit=io, file='day_08_input.txt', status='old', action='read')
+
read(io, '(A)') lines
+
score = 0
+
do i = 1, 50
+
do j = 1, 50
+
if(lines(i)(j:j) /= '.') then
+
if(.not. allocated(nodes)) then
+
allocate(nodes(1))
+
nodes(1)%c = lines(i)(j:j)
+
allocate(nodes(1)%x(1))
+
allocate(nodes(1)%y(1))
+
nodes(1)%x(1) = j
+
nodes(1)%y(1) = i
+
else
+
call add_node(nodes, lines(i)(j:j), j, i)
+
end if
+
end if
+
end do
+
end do
+
do i = 1, size(nodes)
+
do j = 1, size(nodes(i)%x)
+
do l = 1, size(nodes(i)%x)
+
if(nodes(i)%x(j) == nodes(i)%x(l) .and. nodes(i)%y(j) == nodes(i)%y(l)) cycle ! don't compare same values
+
xdist = nodes(i)%x(j) - nodes(i)%x(l)
+
ydist = nodes(i)%y(j) - nodes(i)%y(l)
+
if(nodes(i)%x(j) + xdist > 0 .and. nodes(i)%x(j) + xdist <= 50 .and. &
+
nodes(i)%y(j) + ydist > 0 .and. nodes(i)%y(j) + ydist <= 50) then
+
if(.not. allocated(anti_x)) then
+
allocate(anti_x(1))
+
anti_x(1) = nodes(i)%x(j) + xdist
+
allocate(anti_y(1))
+
anti_y(1) = nodes(i)%y(j) + ydist
+
score = score + 1
+
else
+
found = .false.
+
do k = 1, size(anti_x)
+
if(anti_x(k) == nodes(i)%x(j) + xdist .and. anti_y(k) == nodes(i)%y(j) + ydist) then
+
found = .true.
+
exit
+
end if
+
end do
+
if(.not. found) then
+
call append_to_integer_array(anti_x, nodes(i)%x(j) + xdist)
+
call append_to_integer_array(anti_y, nodes(i)%y(j) + ydist)
+
+
score = score + 1
+
end if
+
end if
+
end if
+
if(nodes(i)%x(l) - xdist > 0 .and. nodes(i)%x(l) - xdist <= 50 .and. &
+
nodes(i)%y(l) - ydist > 0 .and. nodes(i)%y(l) - ydist <= 50) then
+
if(.not. allocated(anti_x)) then
+
allocate(anti_x(1))
+
anti_x(1) = nodes(i)%x(l) - xdist
+
allocate(anti_y(1))
+
anti_y(1) = nodes(i)%y(l) - ydist
+
score = score + 1
+
else
+
found = .false.
+
do k = 1, size(anti_x)
+
if(anti_x(k) == nodes(i)%x(l) - xdist .and. anti_y(k) == nodes(i)%y(l) - ydist) then
+
found = .true.
+
exit
+
end if
+
end do
+
if(.not. found) then
+
call append_to_integer_array(anti_x, nodes(i)%x(l) - xdist)
+
call append_to_integer_array(anti_y, nodes(i)%y(l) - ydist)
+
+
score = score + 1
+
end if
+
end if
+
end if
+
end do
+
end do
+
end do
+
print*, "Total : ", score
+
end program day_08
+164
2024/day_08_part_2.f90
···
+
module day_08_utils
+
implicit none
+
type node
+
character :: c
+
integer, allocatable :: x(:), y(:)
+
end type node
+
contains
+
subroutine append_to_integer_array(arr, val)
+
implicit none
+
integer, allocatable, intent(inout) :: arr(:)
+
integer, intent(in) :: val
+
integer, allocatable :: temp(:)
+
if(.not. allocated(arr)) then
+
ERROR STOP 'Array not allocated'
+
end if
+
allocate(temp(size(arr) + 1))
+
temp(1:size(arr)) = arr
+
temp(size(arr) + 1) = val
+
call move_alloc(temp, arr)
+
end subroutine append_to_integer_array
+
+
subroutine add_node(nodes, c, x, y)
+
type(node), allocatable, intent(inout) :: nodes(:)
+
type(node), allocatable :: temp(:)
+
character, intent(in) :: c
+
integer, intent(in) :: x, y
+
integer :: i
+
do i = 1, size(nodes)
+
if (nodes(i)%c == c) then
+
if(.not. allocated(nodes(i)%x)) then
+
allocate(nodes(i)%x(1))
+
nodes(i)%x(1) = x
+
else
+
call append_to_integer_array(nodes(i)%x, x)
+
end if
+
if(.not. allocated(nodes(i)%y)) then
+
allocate(nodes(i)%y(1))
+
nodes(i)%y(1) = y
+
else
+
call append_to_integer_array(nodes(i)%y, y)
+
end if
+
return
+
end if
+
end do
+
allocate(temp(size(nodes) + 1))
+
temp(1:size(nodes)) = nodes
+
allocate(temp(size(nodes) + 1)%x(1))
+
allocate(temp(size(nodes) + 1)%y(1))
+
temp(size(nodes) + 1)%c = c
+
temp(size(nodes) + 1)%x(1) = x
+
temp(size(nodes) + 1)%y(1) = y
+
call move_alloc(temp, nodes)
+
end subroutine add_node
+
end module day_08_utils
+
+
program day_08
+
use day_08_utils
+
implicit none
+
character(len=50) :: lines(50)
+
integer :: io, i, j, k, l, score, xdist, ydist, next_x, next_y
+
integer, allocatable :: anti_x(:), anti_y(:)
+
type(node), allocatable :: nodes(:)
+
logical :: found
+
+
open(newunit=io, file='day_08_input.txt', status='old', action='read')
+
read(io, '(A)') lines
+
score = 0
+
do i = 1, 50
+
do j = 1, 50
+
if(lines(i)(j:j) /= '.') then
+
if(.not. allocated(nodes)) then
+
allocate(nodes(1))
+
nodes(1)%c = lines(i)(j:j)
+
allocate(nodes(1)%x(1))
+
allocate(nodes(1)%y(1))
+
nodes(1)%x(1) = j
+
nodes(1)%y(1) = i
+
else
+
call add_node(nodes, lines(i)(j:j), j, i)
+
end if
+
end if
+
end do
+
end do
+
do i = 1, size(nodes)
+
do j = 1, size(nodes(i)%x)
+
if(.not. allocated(anti_x)) then
+
allocate(anti_x(1))
+
anti_x(1) = nodes(i)%x(j)
+
allocate(anti_y(1))
+
anti_y(1) = nodes(i)%y(j)
+
score = score + 1
+
else
+
found = .false.
+
do k = 1, size(anti_x)
+
if(anti_x(k) == nodes(i)%x(j) .and. anti_y(k) == nodes(i)%y(j)) then
+
found = .true.
+
exit
+
end if
+
end do
+
if(.not. found) then
+
call append_to_integer_array(anti_x, nodes(i)%x(j))
+
call append_to_integer_array(anti_y, nodes(i)%y(j))
+
+
score = score + 1
+
end if
+
end if
+
do l = 1, size(nodes(i)%x)
+
if(nodes(i)%x(j) == nodes(i)%x(l) .and. nodes(i)%y(j) == nodes(i)%y(l)) cycle ! don't compare same values
+
xdist = nodes(i)%x(j) - nodes(i)%x(l)
+
ydist = nodes(i)%y(j) - nodes(i)%y(l)
+
next_x = nodes(i)%x(j) + xdist
+
next_y = nodes(i)%y(j) + ydist
+
do
+
if(next_x> 0 .and. next_x <= 50 .and. &
+
next_y > 0 .and. next_y <= 50) then
+
found = .false.
+
do k = 1, size(anti_x)
+
if(anti_x(k) == next_x .and. anti_y(k) == next_y) then
+
found = .true.
+
exit
+
end if
+
end do
+
if(.not. found) then
+
call append_to_integer_array(anti_x, next_x)
+
call append_to_integer_array(anti_y, next_y)
+
+
score = score + 1
+
end if
+
next_x = next_x + xdist
+
next_y = next_y + ydist
+
else
+
exit
+
end if
+
end do
+
next_x = nodes(i)%x(l) - xdist
+
next_y = nodes(i)%y(l) - ydist
+
do
+
if(next_x > 0 .and. next_x <= 50 .and. &
+
next_y > 0 .and. next_y <= 50) then
+
found = .false.
+
do k = 1, size(anti_x)
+
if(anti_x(k) == next_x .and. anti_y(k) == next_y) then
+
found = .true.
+
exit
+
end if
+
end do
+
if(.not. found) then
+
call append_to_integer_array(anti_x, next_x)
+
call append_to_integer_array(anti_y, next_y)
+
+
score = score + 1
+
end if
+
next_x = next_x - xdist
+
next_y = next_y - ydist
+
+
else
+
exit
+
end if
+
end do
+
end do
+
end do
+
end do
+
print*, "Total : ", score
+
end program day_08
+152
2024/day_09.f90
···
+
module day_09_utils
+
implicit none
+
contains
+
subroutine swap_to_first_positive_integer_from_end(arr, idx)
+
implicit none
+
integer, allocatable, intent(inout) :: arr(:)
+
integer, intent(in) :: idx
+
integer, allocatable :: temp(:)
+
integer :: i, res
+
do i = 0, size(arr) - 1
+
if(arr(size(arr) - i) > -1) then
+
arr(idx) = arr(size(arr) - i)
+
allocate(temp(size(arr) - (i +1)))
+
temp = arr(1:size(arr) - (i+1))
+
call move_alloc(temp, arr)
+
return
+
end if
+
end do
+
end subroutine swap_to_first_positive_integer_from_end
+
subroutine append_to_integer_array_times(arr, val, times)
+
implicit none
+
integer, allocatable, intent(inout) :: arr(:)
+
integer, intent(in) :: val, times
+
integer, allocatable :: temp(:)
+
if(.not. allocated(arr)) then
+
ERROR STOP 'Array not allocated'
+
end if
+
allocate(temp(size(arr) + times))
+
temp(1:size(arr)) = arr
+
temp(size(arr) + 1:size(temp)) = val
+
call move_alloc(temp, arr)
+
end subroutine append_to_integer_array_times
+
end module day_09_utils
+
program day_09
+
use iso_fortran_env, only: int64
+
use day_09_utils
+
implicit none
+
integer :: io, ios, i, j, block_n, ct, block_start, block_end, space_start, space_end
+
integer(kind=int64) :: res
+
character(len=1) :: c
+
integer, allocatable :: system(:), work(:), done(:)
+
logical :: is_space, space_block_start
+
+
open(newunit=io, file='./day_09_input.txt', status='old', action='read', access='stream')
+
is_space = .false.
+
block_n = 0
+
do
+
read(io, iostat=ios) c
+
if (ios /= 0) exit
+
read(c, *, iostat=ios) i
+
if(ios /= 0) exit
+
if (i == 0) then
+
is_space = .false.
+
cycle
+
end if
+
if (.not. allocated(system)) then
+
allocate(system(i))
+
system(1:i) = block_n
+
is_space = .true.
+
block_n = block_n + 1
+
else
+
if (is_space) then
+
call append_to_integer_array_times(system, -1, i)
+
is_space = .false.
+
else
+
call append_to_integer_array_times(system, block_n, i)
+
block_n = block_n + 1
+
is_space = .true.
+
end if
+
end if
+
end do
+
allocate(work(size(system)))
+
work = system
+
ct = count(work > -1)
+
outer: do
+
do i = 1, size(work)
+
if (i == ct) exit outer ! we are done
+
if(work(i) < 0) then
+
call swap_to_first_positive_integer_from_end(work, i)
+
exit
+
end if
+
end do
+
end do outer
+
res = 0
+
do i = 1, size(work)
+
if(work(i) > -1) then
+
res = res + ((i-1) * work(i))
+
else
+
end if
+
end do
+
print *, res
+
! start_part_2
+
res = 0
+
deallocate(work)
+
allocate(work(size(system)))
+
work = system
+
block_n = -1
+
block_start = -1
+
block_end = -1
+
do i = size(work), 1, -1
+
if(block_n == -1 .and. work(i) /= -1) then
+
! we are starting a block
+
block_end = i
+
block_n = work(i)
+
if(allocated(done) .and. count(done == block_n) > 0) then
+
block_n = -1
+
block_start = -1
+
block_end = -1
+
cycle
+
else if(.not. allocated(done)) then
+
allocate(done(1))
+
done(1) = block_n
+
else
+
call append_to_integer_array_times(done, block_n, 1)
+
end if
+
else if (block_n /= -1 .and. block_n /= work(i)) then
+
! we are ending the block
+
block_start = i
+
+
! lets try to move the block
+
space_block_start = .true.
+
do j = 1, size(work)
+
if (j > block_start) exit
+
if(space_block_start .and. work(j) == -1) then
+
space_start = j
+
space_block_start = .false.
+
else if (.not. space_block_start .and. work(j) /= -1) then
+
space_end = j
+
space_block_start = .true.
+
if(space_end - space_start >= block_end - block_start) then
+
work(space_start:space_start + (block_end - (block_start +1))) = block_n
+
work(block_start+1:block_end) = -1
+
exit
+
end if
+
space_end = -1
+
space_start = -1
+
end if
+
end do
+
block_n = work(i)
+
block_end = i
+
block_start = -1
+
end if
+
end do
+
do i = 1, size(work)
+
if(work(i) /= -1) then
+
res = res + ((i-1) * work(i))
+
end if
+
end do
+
print *, res
+
end program day_09
+
+
+5
2024/dune
···
+
(executable (name day_01)
+
(libraries str))
+
(executable (name day_02))
+
(executable (name day_03)
+
(libraries str))
+1
2024/dune-project
···
+
(lang dune 3.6)
+51
2025/day_01.cbl
···
+
IDENTIFICATION DIVISION.
+
PROGRAM-ID. day_01.
+
AUTHOR. Trey Bastian.
+
ENVIRONMENT DIVISION.
+
INPUT-OUTPUT SECTION.
+
FILE-CONTROL.
+
SELECT input-file ASSIGN TO "./input.txt"
+
ORGANIZATION IS LINE SEQUENTIAL.
+
DATA DIVISION.
+
FILE SECTION.
+
FD input-file.
+
01 input-line.
+
02 direction PIC X.
+
02 move-text PIC XXX.
+
WORKING-STORAGE SECTION.
+
01 dial-position PIC 9(2) VALUE 50.
+
01 move-num PIC S9(3).
+
01 zero-count PIC 9(4) VALUE ZEROS.
+
01 eof PIC X.
+
88 eof-y VALUE "Y".
+
88 eof-n VALUE "N".
+
+
+
PROCEDURE DIVISION.
+
OPEN INPUT input-file.
+
SET eof-n to TRUE.
+
PERFORM UNTIL eof-y
+
READ input-file AT END
+
SET eof-y to TRUE
+
NOT AT END
+
MOVE FUNCTION NUMVAL(move-text) TO move-num
+
IF direction = "L"
+
COMPUTE move-num = 0 - move-num
+
END-IF
+
+
COMPUTE dial-position = FUNCTION MOD(dial-position +
+
move-num, 100)
+
+
if dial-position < 0
+
ADD 100 to dial-position
+
END-IF
+
+
if dial-position = 0
+
ADD 1 to zero-count
+
END-IF
+
END-READ
+
END-PERFORM.
+
CLOSE input-file.
+
DISPLAY zero-count.
+
STOP-RUN.
+
+67
2025/day_01_part2.cbl
···
+
IDENTIFICATION DIVISION.
+
PROGRAM-ID. day_01_part2.
+
AUTHOR. Trey Bastian.
+
ENVIRONMENT DIVISION.
+
INPUT-OUTPUT SECTION.
+
FILE-CONTROL.
+
SELECT input-file ASSIGN TO "./input.txt"
+
ORGANIZATION IS LINE SEQUENTIAL.
+
DATA DIVISION.
+
FILE SECTION.
+
FD input-file.
+
01 input-line.
+
02 direction PIC X.
+
02 move-text PIC XXX.
+
WORKING-STORAGE SECTION.
+
01 dial-position PIC 9(2) VALUE 50.
+
01 new-position PIC 9(2).
+
01 move-num PIC S9(3).
+
01 zero-count PIC 9(4) VALUE ZEROS.
+
01 eof PIC X.
+
88 eof-y VALUE "Y".
+
88 eof-n VALUE "N".
+
+
+
PROCEDURE DIVISION.
+
OPEN INPUT input-file.
+
SET eof-n to TRUE.
+
PERFORM UNTIL eof-y
+
READ input-file AT END
+
SET eof-y to TRUE
+
NOT AT END
+
MOVE FUNCTION NUMVAL(move-text) TO move-num
+
IF move-num > 99
+
COMPUTE zero-count = zero-count + (move-num / 100)
+
END-IF
+
+
IF direction = "L"
+
COMPUTE move-num = 0 - move-num
+
END-IF
+
+
COMPUTE new-position = FUNCTION MOD(dial-position +
+
move-num, 100)
+
+
if new-position < 0
+
ADD 100 to new-position
+
END-IF
+
+
EVALUATE new-position
+
WHEN 0
+
ADD 1 to zero-count
+
WHEN < dial-position AND direction = "R" AND
+
dial-position <> 0
+
ADD 1 to zero-count
+
WHEN > dial-position AND direction = "L" AND
+
dial-position <> 0
+
ADD 1 to zero-count
+
END-EVALUATE
+
+
+
MOVE new-position TO dial-position
+
+
END-READ
+
END-PERFORM.
+
CLOSE input-file.
+
DISPLAY zero-count.
+
STOP-RUN.
+
+76
2025/day_02.cbl
···
+
IDENTIFICATION DIVISION.
+
PROGRAM-ID. day_02.
+
AUTHOR. Trey Bastian.
+
ENVIRONMENT DIVISION.
+
INPUT-OUTPUT SECTION.
+
FILE-CONTROL.
+
SELECT input-file ASSIGN TO "./input.txt"
+
ORGANIZATION IS LINE SEQUENTIAL.
+
DATA DIVISION.
+
FILE SECTION.
+
FD input-file.
+
01 input-line PIC X(4096).
+
WORKING-STORAGE SECTION.
+
01 ptr PIC 9(4) Value 1.
+
01 len PIC 9(4).
+
01 left-val PIC 9(32).
+
01 right-val PIC 9(32).
+
01 grouping PIC X(65).
+
+
01 val-string PIC Z(32).
+
01 val-string-len PIC 9(2).
+
01 val-string-start-idx PIC 9(2).
+
01 val-string-half PIC 9(2).
+
01 result PIC 9(32) VALUE ZEROS.
+
+
01 eof PIC X.
+
88 eof-y VALUE "Y".
+
88 eof-n VALUE "N".
+
PROCEDURE DIVISION.
+
OPEN INPUT input-file.
+
SET eof-n to TRUE.
+
PERFORM UNTIL eof-y
+
READ input-file AT END
+
SET eof-y to TRUE
+
NOT AT END
+
INSPECT input-line TALLYING len FOR CHARACTERS BEFORE
+
SPACE
+
+
PERFORM UNTIL ptr > len
+
UNSTRING input-line DELIMITED BY "," INTO grouping WITH
+
POINTER ptr
+
END-UNSTRING
+
+
UNSTRING grouping DELIMITED BY "-" INTO left-val,
+
right-val
+
END-UNSTRING
+
+
PERFORM VARYING left-val FROM left-val BY 1 UNTIL
+
left-val > right-val
+
MOVE left-val TO val-string
+
+
COMPUTE val-string-len = FUNCTION LENGTH(FUNCTION
+
TRIM(val-string))
+
IF FUNCTION MOD(val-string-len, 2) = 0
+
+
COMPUTE val-string-start-idx =
+
(FUNCTION LENGTH(val-string) - val-string-len ) + 1
+
COMPUTE val-string-half = val-string-len / 2
+
+
IF val-string(val-string-start-idx:val-string-half)
+
= val-string(val-string-start-idx +
+
val-string-half:val-string-half)
+
+
ADD left-val TO result
+
END-IF
+
END-IF
+
END-PERFORM
+
+
END-PERFORM
+
+
END-READ
+
END-PERFORM.
+
CLOSE input-file.
+
DISPLAY result.
+
STOP-RUN.
+
+103
2025/day_02_part2.cbl
···
+
IDENTIFICATION DIVISION.
+
PROGRAM-ID. day_02_part2.
+
AUTHOR. Trey Bastian.
+
ENVIRONMENT DIVISION.
+
INPUT-OUTPUT SECTION.
+
FILE-CONTROL.
+
SELECT input-file ASSIGN TO "./input.txt"
+
ORGANIZATION IS LINE SEQUENTIAL.
+
DATA DIVISION.
+
FILE SECTION.
+
FD input-file.
+
01 input-line PIC X(4096).
+
WORKING-STORAGE SECTION.
+
01 ptr PIC 9(4) Value 1.
+
01 len PIC 9(4).
+
01 left-val PIC 9(32).
+
01 right-val PIC 9(32).
+
01 grouping PIC X(65).
+
+
01 val-string PIC Z(32).
+
01 val-string-len PIC 9(2).
+
01 val-string-start-idx PIC 9(2).
+
01 val-string-half PIC 9(2).
+
01 val-window PIC 9(2) VALUE 1.
+
01 c-idx PIC 9(2).
+
01 s-left PIC Z(16).
+
01 s-right PIC Z(16).
+
01 no-match PIC X VALUE "N".
+
01 result PIC 9(32) VALUE ZEROS.
+
+
01 eof PIC X.
+
88 eof-y VALUE "Y".
+
88 eof-n VALUE "N".
+
PROCEDURE DIVISION.
+
OPEN INPUT input-file.
+
SET eof-n to TRUE.
+
PERFORM UNTIL eof-y
+
READ input-file AT END
+
SET eof-y to TRUE
+
NOT AT END
+
INSPECT input-line TALLYING len FOR CHARACTERS BEFORE
+
SPACE
+
+
PERFORM UNTIL ptr > len
+
UNSTRING input-line DELIMITED BY "," INTO grouping WITH
+
POINTER ptr
+
END-UNSTRING
+
+
UNSTRING grouping DELIMITED BY "-" INTO left-val,
+
right-val
+
END-UNSTRING
+
+
PERFORM VARYING left-val FROM left-val BY 1 UNTIL
+
left-val > right-val
+
MOVE left-val TO val-string
+
+
COMPUTE val-string-len = FUNCTION LENGTH(FUNCTION
+
TRIM(val-string))
+
+
COMPUTE val-string-start-idx =
+
(FUNCTION LENGTH(val-string) - val-string-len ) + 1
+
+
COMPUTE val-string-half = val-string-len / 2
+
+
PERFORM VARYING val-window FROM 1 BY 1
+
UNTIL val-window > val-string-half
+
COMPUTE c-idx = val-string-start-idx + val-window
+
MOVE "N" to no-match
+
PERFORM VARYING c-idx
+
FROM c-idx
+
BY val-window
+
UNTIL c-idx
+
> FUNCTION LENGTH(val-string)
+
+
MOVE val-string(val-string-start-idx:val-window)
+
TO s-left
+
+
IF (c-idx + val-window
+
> FUNCTION LENGTH(val-string))
+
MOVE val-string(c-idx:) TO s-right
+
ELSE
+
MOVE val-string(c-idx:val-window) TO s-right
+
END-IF
+
+
IF NOT s-left = s-right
+
MOVE "Y" to no-match
+
EXIT PERFORM
+
END-IF
+
END-PERFORM
+
IF no-match = "N"
+
ADD left-val to result
+
EXIT PERFORM
+
END-IF
+
END-PERFORM
+
END-PERFORM
+
END-PERFORM
+
+
END-READ
+
END-PERFORM.
+
CLOSE input-file.
+
DISPLAY result.
+
STOP-RUN.
+
+63
2025/day_03.cbl
···
+
IDENTIFICATION DIVISION.
+
PROGRAM-ID. day_03.
+
AUTHOR. Trey Bastian.
+
ENVIRONMENT DIVISION.
+
INPUT-OUTPUT SECTION.
+
FILE-CONTROL.
+
SELECT input-file ASSIGN TO "./input.txt"
+
ORGANIZATION IS LINE SEQUENTIAL.
+
DATA DIVISION.
+
FILE SECTION.
+
FD input-file.
+
01 input-line PIC Z(4096).
+
WORKING-STORAGE SECTION.
+
01 idx PIC 9(4).
+
01 idx-2 PIC 9(4).
+
01 len PIC 9(4).
+
+
01 maxim PIC 9 VALUE 0.
+
01 digit PIC 9 VALUE 0.
+
+
01 joltage PIC XX.
+
01 result PIC 9(10) VALUE 0.
+
+
+
01 eof PIC X.
+
88 eof-y VALUE "Y".
+
88 eof-n VALUE "N".
+
+
PROCEDURE DIVISION.
+
OPEN INPUT input-file.
+
SET eof-n to TRUE.
+
PERFORM UNTIL eof-y
+
READ input-file AT END
+
SET eof-y to TRUE
+
NOT AT END
+
MOVE FUNCTION LENGTH(FUNCTION TRIM(input-line)) TO len
+
MOVE 0 TO maxim
+
*first pass leave something on the right
+
PERFORM VARYING idx FROM 1 UNTIL idx > len - 1
+
MOVE FUNCTION NUMVAL(input-line(idx:1)) TO digit
+
IF maxim < digit
+
MOVE digit TO maxim
+
MOVE idx TO idx-2
+
END-IF
+
END-PERFORM
+
* need the next index
+
MOVE maxim TO joltage(1:1)
+
MOVE 0 TO maxim
+
ADD 1 TO idx-2
+
PERFORM VARYING idx-2 FROM idx-2 UNTIL idx-2 > len
+
MOVE FUNCTION NUMVAL(input-line(idx-2:1)) TO digit
+
IF maxim < digit
+
MOVE digit TO maxim
+
END-IF
+
END-PERFORM
+
MOVE maxim TO joltage(2:1)
+
ADD FUNCTION NUMVAL(joltage) TO result
+
END-READ
+
END-PERFORM.
+
CLOSE input-file.
+
DISPLAY result.
+
STOP-RUN.
+
+64
2025/day_03_part2.cbl
···
+
IDENTIFICATION DIVISION.
+
PROGRAM-ID. day_03_part2.
+
AUTHOR. Trey Bastian.
+
ENVIRONMENT DIVISION.
+
INPUT-OUTPUT SECTION.
+
FILE-CONTROL.
+
SELECT input-file ASSIGN TO "./input.txt"
+
ORGANIZATION IS LINE SEQUENTIAL.
+
DATA DIVISION.
+
FILE SECTION.
+
FD input-file.
+
01 input-line PIC Z(4096).
+
WORKING-STORAGE SECTION.
+
01 idx PIC 9(4) VALUE 1.
+
01 idx-2 PIC 9(4).
+
01 len PIC 9(4).
+
+
01 maxim PIC 9 VALUE 0.
+
01 digit PIC 9 VALUE 0.
+
01 remaining PIC 99 VALUE 12.
+
01 rem-idx PIC 99 VALUE 1.
+
+
01 joltage PIC X(12).
+
01 result PIC 9(32) VALUE 0.
+
+
+
01 eof PIC X.
+
88 eof-y VALUE "Y".
+
88 eof-n VALUE "N".
+
+
PROCEDURE DIVISION.
+
OPEN INPUT input-file.
+
SET eof-n to TRUE.
+
PERFORM UNTIL eof-y
+
READ input-file AT END
+
SET eof-y to TRUE
+
NOT AT END
+
MOVE FUNCTION LENGTH(FUNCTION TRIM(input-line)) TO len
+
MOVE 1 TO idx
+
MOVE 12 TO remaining
+
MOVE 1 TO rem-idx
+
PERFORM UNTIL remaining < 1
+
MOVE 0 TO maxim
+
PERFORM VARYING idx FROM idx UNTIL idx >
+
(len - remaining + 1)
+
MOVE FUNCTION NUMVAL(input-line(idx:1)) to digit
+
IF maxim < digit
+
MOVE digit TO maxim
+
MOVE idx TO idx-2
+
END-IF
+
END-PERFORM
+
MOVE maxim TO joltage(rem-idx:1)
+
ADD 1 TO rem-idx
+
SUBTRACT 1 FROM remaining
+
MOVE idx-2 TO idx
+
ADD 1 TO idx
+
END-PERFORM
+
ADD FUNCTION NUMVAL(joltage) TO result
+
END-READ
+
END-PERFORM.
+
CLOSE input-file.
+
DISPLAY result.
+
STOP-RUN.
+
+5 -2
README.md
···
# Advent of Code Repo
This repository contains my solutions to the Advent of Code challenges.
-
I stream all my solutions live on Twitch at [twitch.tv/treybastian](https://twitch.tv/treybastian).
+
## 2025 - COBOL
+
You'll need to install GNUCobol to run these solutions.
+
+
On MacOS you can install it with Homebrew: `brew install gnucobol`
## 2024 - Fortran
You'll need GNUFortran to run these solutions.
-
On MacOS, you can install it with Homebrew with `brew install gcc`.
+
On MacOS, you can install it with Homebrew: `brew install gcc`.