WQSGERJR66LGKKRXQRN7TC44TDP4WIYBER46JEQ5ATG5IQLP345QC
const std = @import("std");
const PATH = "../input/day09.txt";
const PREAMBLE = 25;
pub fn first(allocator: ?std.mem.Allocator) anyerror!usize {
const input = try parseInput(allocator.?);
defer allocator.?.free(input);
return getInvalid(input);
}
fn getInvalid(data: []usize) usize {
for (data) |num, idx| {
if (idx < PREAMBLE) continue;
if (!valid(data, idx, num)) {
return num;
}
}
unreachable;
}
inline fn valid(data: []usize, idx: usize, num: usize) bool {
var x = idx - PREAMBLE;
while (x < idx) : (x += 1) {
var y = x + 1;
while (y < idx) : (y += 1) {
if (data[x] + data[y] == num) return true;
}
}
return false;
}
pub fn second(allocator: ?std.mem.Allocator) anyerror!usize {
const input = try parseInput(allocator.?);
defer allocator.?.free(input);
const weak = getInvalid(input);
var x: usize = 0;
while (x < input.len) : (x += 1) {
var sum: usize = input[x];
var min = sum;
var max = sum;
var y: usize = x + 1;
while (y < input.len) : (y += 1) {
sum += input[y];
if (input[y] < min) min = input[y];
if (input[y] > max) max = input[y];
if (sum == weak) return max + min;
if (sum > weak) break;
}
}
unreachable;
}
fn parseInput(allocator: std.mem.Allocator) ![]usize {
var ret = std.ArrayList(usize).init(allocator);
const file = @embedFile(PATH);
var lines = std.mem.tokenize(u8, file, "\n");
while (lines.next()) |line| {
try ret.append(try std.fmt.parseUnsigned(usize, line, 0));
}
return ret.toOwnedSlice();
}
test "day09a" {
try std.testing.expectEqual(@as(usize, 1930745883), try first(std.testing.allocator));
}
test "day09b" {
try std.testing.expectEqual(@as(usize, 268878261), try second(std.testing.allocator));
}
11
6
42
19
23
20
26
4
2
36
35
41
18
38
28
1
48
5
17
10
32
15
46
50
24
3
7
6
8
68
83
23
11
16
4
36
9
78
12
29
13
25
42
14
84
10
17
15
18
28
19
21
20
22
35
24
45
30
67
50
23
40
27
26
31
38
33
25
42
29
32
34
57
41
70
43
44
46
65
75
47
48
89
49
51
61
60
52
54
56
99
86
90
72
104
77
78
84
85
95
87
109
132
126
96
108
101
129
233
103
106
172
153
110
128
175
149
150
155
165
161
181
222
180
242
422
238
403
204
258
209
207
213
528
216
635
303
260
259
304
482
299
693
342
326
361
435
384
467
429
607
844
420
842
474
422
762
558
475
476
564
519
620
660
625
1100
641
668
837
745
781
804
903
1167
851
895
894
1587
950
1034
897
951
1039
994
1221
1083
1285
1245
1429
1472
1309
2061
1413
1695
1933
2423
1698
2172
1745
1985
3242
2738
1847
1848
1891
2239
1945
2328
2077
2304
2368
2530
3490
3170
3260
3004
3108
3111
3393
4313
3876
3443
3592
3593
3695
3738
3739
3968
3793
3836
6901
4249
4381
4445
5476
4898
5534
7871
6447
6112
6836
6219
10428
7132
7035
9857
7629
7185
7288
7477
9272
7532
7761
8042
15962
8630
8694
9279
15391
11981
13011
11646
12331
16304
14124
13404
13254
15049
14167
15293
14473
22034
19178
16756
16107
22515
16391
21025
41212
17324
35498
17973
20925
23627
23977
24657
24900
66112
27571
27421
26658
27727
29460
28640
29766
30580
32498
33147
32863
35297
34364
37316
38249
38898
44895
41600
41950
44552
57155
48634
49557
100476
61022
60590
54079
54385
89653
58100
62629
67227
74813
70463
67511
102190
83550
124017
118177
80498
172562
112063
91507
99105
108464
98191
129198
103636
160127
112179
181160
112485
117014
120729
125327
130140
224664
166320
137974
254988
172005
164048
195143
178689
192561
367051
189698
190612
197296
298162
315872
215815
242341
229193
394504
354826
552122
250869
263301
255467
268114
304294
856416
526831
414346
336053
342737
385755
369301
426489
380310
386994
465410
448165
740581
585078
458156
648424
480062
506336
518768
518983
514170
523581
559761
572408
640347
678790
705354
729731
1212755
712038
749611
756295
905977
999045
1275063
906321
962335
1104061
938218
964492
986398
994232
1066097
1037751
1033153
1384144
1083342
1638505
1284446
1319137
1839637
1441769
1461649
1468333
2096182
1787362
2030589
2121093
2024149
1844539
1870813
1900553
2501486
1902710
2248938
1980630
2027385
4054738
3299767
2317599
2845793
2525111
2603583
2726215
4065232
2903418
3717271
2929982
4438692
3631901
3658175
3715352
4051534
4427821
4008015
4276323
3881183
6900531
3883340
5975774
5327152
4552496
5656197
4842710
8257134
6609555
5128694
5329798
6995214
7206305
7357803
7541515
13604769
7598692
17236670
9180228
7596535
10656950
7764523
24261719
8157506
12670209
8435836
16021657
9395206
9681190
9882294
9971404
17277725
10458492
12325012
12334999
12536103
27934675
21716331
17240097
15138050
17646817
15195227
20089535
15361058
16991741
17838696
17552712
40470778
16593342
22296416
30163708
19076396
19366610
19563484
22418397
38708072
24861115
22783504
55699813
27473049
34437454
30333277
54069130
30499108
32747939
30556285
31788569
31954400
32352799
33585083
34146054
35669738
38889758
35959952
38443006
43937511
38639880
71456011
56003480
45201901
50256553
47644619
53116781
57806326
57972157
60832385
60889562
64141368
61055393
70231575
77529638
63742969
94640476
93932109
89139412
69815792
83841781
74402958
116169518
77082886
102781248
86284499
92846520
105616776
120072345
97901172
144897174
111088938
115778483
118861719
121721947
166922616
194475303
179912487
191833281
162662312
133558761
144218750
146898678
151485844
158244739
189065747
358755897
163367385
169929406
231181673
329584928
295690970
203517948
208990110
288791125
229950657
232810885
331398331
240583666
255280708
277777511
285044605
307586135
280457439
291117428
291803500
442589648
298384522
328174145
321612124
433468605
491541530
569581011
504681080
847358522
473394551
649786269
653010455
764201772
462761542
470534323
488091593
741054740
1183644388
533058219
562822116
755578928
571574867
572260939
590188022
613415624
626558667
961486144
784373666
1216746689
896230147
1040115334
933295865
936156093
943928874
950853135
1980948461
958625916
1033356439
1211589063
2173075207
1508417032
1189380783
1968018054
1153010138
1134396983
1143835806
1184990491
1720529759
2070553076
1869451958
1410932333
1884149000
1717669531
1847083282
1829526012
1877224739
1880084967
1887009228
1894782009
1909479051
2982536150
1991982355
3712512114
2278232789
2600313116
4155457528
1930745883
2287407121
2296845944
5589736853
2328826297
2595922824
3128601864
3258015615
3240458345
3295081333
3547195543
3789564018
3709610979
3774866976
4158317756
7084645351
3781791237
7877143974
3840224934
6006456923
3922728238
4208978672
4218153004
4227591827
4259572180
4526668707
4584253065
6553096948
6169051231
7504060005
5724524688
7163186583
7098240549
6535539678
7697595214
8366893641
7491402216
8041363417
10164774679
7622016171
7704519475
8802406069
10938465483
10458267916
9933503360
13228584693
12268955244
8445744831
11062208385
8786240887
9110921772
10308777753
11893575919
13873570706
12260064366
12822765237
13633780227
14157555849
16071413116
15113418387
15532765633
15195921691
15326535646
16067761002
16150264306
16490760362
17248150900
17231985718
17556666603
17897162659
18754522584
29701541229
19419699525
27791336076
27089497610
25082829603
30364331068
24153640285
60065872297
28018686928
28960315873
32562173478
29270974236
55108184538
30309340078
30522457337
34904786890
33706930909
33398415206
49121240754
33722746080
34788652321
48261493727
35453829262
36651685243
43837352187
43573339810
58231290109
49236469888
92958592941
52172327213
53113956158
62667246782
63865102763
56979002801
145130920154
62871513556
62977905145
60831797415
84025122209
63920872543
79291181449
112998112358
176983715150
68511398401
104405137225
94882975352
72105514505
137139078367
80225025053
93073822075
106240586592
107467759997
101408797101
113004124628
167383042370
110092958959
117810800216
250143202995
119850516357
167072384007
125849418701
126898777688
289987839778
132432270944
197478959300
151396695954
140616912906
148736423454
165179336580
152330539558
193229149681
173298847128
274707644229
181633822154
194482619176
312293419392
273049183850
211501756060
266466331607
227903759175
229943475316
237661316573
320127927369
297611607524
252748196389
258281689645
316576032534
281168694398
426104340183
300133119408
376116441330
289353336360
346813158734
380234298733
462802516552
354932669282
367781466304
646700630340
393135578214
405984375236
439405515235
441445231376
584876144598
518830010971
457847234491
467604791889
490409512962
558414809053
684386029828
570522030758
747200570851
581301813806
657285135728
773765841540
589486455768
636166495094
865643169705
701745828016
735166968015
858190979266
722714135586
799119953450
832541093449
834580809590
1028891971003
1028369265249
1266030581822
948256747453
925452026380
1413842907255
958014304851
1048824322015
1320552524922
1539316118657
1371333463109
1776092541854
1293451630822
1225652950862
1588357305291
1660618994395
1501809664799
1424459963602
1580905114852
1457881103601
1521834089036
1555255229035
1724571979830
2550633986814
2251465935673
1997081069468
1873708773833
1883466331231
1906271052304
1974276348395
2006838626866
2183667255713
2342275952837
3057064893834
3496110437431
4275205966644
2683534054463
3405300420267
2650112914464
4057376029546
2926269628401
2882341067203
2946294052638
3305477094682
3077089318071
4867201310176
3857742679626
3598280753663
5740598948297
3757175105064
3779979826137
3880547400699
6187818161885
3913109679170
3981114975261
6362541988516
4525943208550
5333646968927
6507855594090
5532453981667
5828635119841
5565875121666
5576382542865
10354578328391
7134465347617
5808610695604
5959430385274
6023383370709
6382566412753
7637722505763
8406490609249
10420965273260
7355455858727
8283118313614
7894224654431
7660527226836
7793657079869
12745108401269
9246756648097
10102325751415
9859590177477
10549326579259
10866100950594
14242548698888
11098329103333
17740048257178
23489305346985
13982873152114
11831994066313
13378839229436
28838377360511
11982813755983
14306501684323
18827455882509
24791875278147
15149112938596
20725691128071
17904782437986
15454184306705
17653247257346
16907283874933
17040413727966
20651652330674
19106346825574
22848914706577
27599638434655
21964430053927
40791885936436
22930323169646
23081142859316
23814807822296
25210833295749
40665017602454
25361652985419
26289315440306
27131926694579
29023227483949
29455614622919
32802360195942
30603297245301
33053895376582
34693660985312
32361468181638
32494598034671
33947697602899
36013630700507
58164013181361
52385937792565
41070776879501
44813344760504
44894753223573
55984218546228
70174997745923
62509509999501
46895950681612
50572486281168
52342759990328
51650968425725
54817267608338
53421242134885