summaryrefslogtreecommitdiffstats
path: root/2020/day9
diff options
context:
space:
mode:
Diffstat (limited to '2020/day9')
-rw-r--r--2020/day9/input1000
-rw-r--r--2020/day9/xmas_encoder.pl70
2 files changed, 1070 insertions, 0 deletions
diff --git a/2020/day9/input b/2020/day9/input
new file mode 100644
index 0000000..c27e1a4
--- /dev/null
+++ b/2020/day9/input
@@ -0,0 +1,1000 @@
130
217
344
45
510
633
719
831
922
1025
1139
1249
131
1426
1538
1636
1714
1827
1915
2050
2128
2241
2320
2434
2518
266
2724
2816
2911
3081
317
328
3363
3465
3558
369
37109
3810
3913
4026
4186
4217
4357
4432
4514
4615
4742
4822
4921
5030
5140
5239
5328
5437
5520
5616
5718
5824
5919
6023
6135
6233
6325
6456
6529
6631
6734
6892
6975
7064
7161
7236
7338
7441
7542
7678
7743
7839
7944
8048
8137
8297
8359
8455
8562
8658
87106
88105
8979
9060
9187
9293
9373
94114
9574
9675
97149
98116
9999
100108
10182
10276
103162
10481
105110
106118
107150
108113
109220
110120
111131
112133
113213
114134
115142
116147
117148
118196
119221
120156
121151
122157
123181
124175
125242
126158
127186
128214
129384
130233
131231
132244
133251
134253
135254
136352
137467
138276
139281
140347
141304
142299
143308
144313
145307
146309
147315
148475
149783
150389
151575
152400
153445
154464
155477
156482
157624
158504
159851
160622
1611079
162923
1631251
164704
165603
166606
167795
168620
1691158
170616
171773
172715
173789
1741477
175834
1761794
177845
178909
179941
180986
1811318
1821695
1831981
1841209
1851219
1861222
1871223
1881226
1891307
1902304
1912012
1921236
1931549
1941331
1951786
1961488
1971504
1982649
1992272
2001679
2013183
2022727
2032131
2042177
2052195
2062428
2072431
2083667
2092432
2102445
2112905
2123874
2132543
2142567
2152724
2162785
2174862
2183932
2193635
2202992
2213167
2224584
2234563
2245423
2255159
2264308
2274326
2284859
2296521
23010285
2316080
2325110
2334877
2344975
2354988
2365267
2375291
2387895
23910153
2407773
2415777
2427730
2436627
24413196
2457751
24610887
2478892
2488634
2499167
2509185
2519314
2529203
25310126
2549963
2559865
25610255
2579852
25810144
25910242
26010279
26116492
26211068
26314378
26412404
26514944
26613507
26716622
26815261
26916385
27016954
27117526
27217801
27317819
27425695
27518388
27618517
27728796
27820534
27919717
28019996
28120131
28220094
28326734
28420521
28524657
28623472
28726012
28841995
28935392
29028451
29133339
29243119
29334186
29447184
29534773
29638611
29735620
29845729
29940251
30062126
30139811
30239713
30358328
30439848
30544653
30643993
30740615
30856141
30955294
31048129
31151923
31261404
31389480
31483706
31561790
316102321
31795989
31868959
31970393
32073384
32174231
32275333
32379524
32479561
325114846
32679659
32780328
32880463
32983841
33084608
33188744
33292538
333100052
334107217
335109533
336113327
337131797
338130749
339179711
340136021
341144292
342172099
343139352
344257619
345272151
346149564
347154857
348159085
349352479
350164304
351159987
352207269
353176379
354168449
355231890
356181282
357244344
358340548
359291784
360276089
361268184
362262546
363275041
364275373
365280313
366283644
367429877
368318013
369304421
370495405
371308649
372366354
373323389
374328436
375324291
376336366
377344828
378491838
379460233
380544273
381425626
382519385
383607033
384543225
385537587
386551828
387642304
388550414
389555686
390641402
391847646
392613070
393805061
394627810
395632038
396632940
397659755
398647680
399972638
400660657
401681194
402895242
4031099959
4041073303
4051230687
4061479684
4071056972
4081080812
4091089415
4101168756
4111811060
4121210169
4131293597
4141183496
4152458740
4161246010
4171508312
4181259848
4192597727
4201620318
4211737095
4221905765
4231328874
4241341851
4251555899
4261576436
4271984657
4282146387
4292130275
4302137784
4312900475
4322170227
4332352252
4342258171
4353356556
4362393665
4372836284
4382983105
4394428398
4402884773
4412505858
4423518019
4433430075
4442670725
4452897750
4463890422
4473461664
4484758949
4495335357
4503132335
4514122441
4525967522
4534268059
4544300502
4556558673
4564522479
4579429186
4588319774
4594651836
4605176583
4614899523
4627251164
4635390631
4645568475
4655403608
4665935933
4678012863
4685803060
4697549586
4706030085
4716593999
4727254776
4738919895
4747400394
4759477085
4768390500
47714832794
4789422002
4798822981
4809174315
4819551359
4829828419
48313496357
48411770582
48514598585
48610290154
48710794239
48811738993
48910972083
49017674926
49111833145
49212397059
49312624084
49413284861
49513430479
49614984499
49715645276
49815790894
49916574709
50028263273
50140660332
50222046086
50354156689
50417997296
50522564821
50619379778
50721567412
50821084393
50933306405
51021262237
51121766322
51222533232
51354390798
51422805228
51543028559
51624230204
51726715340
51825908945
51928269360
52028414978
52141425864
52231436170
52350461064
52439259533
52542227500
52637377074
52739081689
52839564708
52945492441
53040464171
53140642015
53244100644
53342346630
53459910306
53561025855
53644299554
53750948210
53863447243
53986447274
54054323923
54150139149
54252624285
54359851148
54456684338
54572515622
54670517859
54783360177
54883381243
54978019089
55076458763
55177841245
55278646397
553130465530
55484763725
55595247764
55684742659
55786646184
55893294840
559109308623
560111165004
561136586423
562101087359
563102763434
564123142144
565104463072
566106823487
567112475433
568116535486
569133143101
570148359104
571155105160
572155860334
573154300008
574154477852
575197239158
576156487642
577187506093
578197218092
579191587212
580219298920
581171388843
582199121617
583223358973
584220473627
585203850793
586205550431
587207226506
588323761992
589235617577
590211286559
591344429660
592229010919
593374951479
594404672048
595302659112
596353078426
597312347976
598401089951
599310965494
600353726800
601360338435
602370510460
603382675402
604362976055
605423149713
606375239636
607434739194
608409401224
609673941549
610518192000
611412776937
612783765353
613440297478
614446904136
615646025753
616400480901
617687587612
618783156303
619613624606
620615007088
621623313470
622975345523
623664692294
624720366718
625714065235
6261036774319
627733486515
628772377279
629875036672
630775720537
631840778379
632809882125
633847385037
634813257838
6351616498916
636853074415
637887201614
6381014105507
6391310718047
6401023794371
6411015487989
6421310901082
6431228631694
6441236938076
6451238320558
6461378757529
6471942696929
6481385059012
6491453853233
6501700459452
6512510341577
6521505863794
6531548097816
6541588978375
6551623105574
6561623139963
6572198102696
6581876868786
6592429756754
6602125522172
6611740276029
6622253808547
6632029593496
6643094842169
6653408351025
6662244119683
6672465569770
6682466952252
6692475258634
6702617078087
6712763816541
6722933156828
6733171237779
6742959717027
6755426669279
6765338961852
6773053961610
6784815180783
6793329254404
6803246245537
6813363415992
6823769869525
6835046834841
6843865798201
6854357354116
6866013678637
6874273713179
6885203836710
6894709689453
6904711071935
6914719378317
6924932522022
6936288971431
6945092336721
6956296572820
6965696973369
6975892873855
6986130954806
69912189446675
7007133285517
7016300207147
7026383216014
7036575499941
7046609661529
7057016115062
7067635667726
7078043582704
70812193081002
70910849213120
7108631067295
7118983402632
7128984785114
71310024858743
7149429067770
7159430450252
71612431161953
71715558902573
71810789310090
71910985210576
72011589847224
72111827928175
72212023828661
72322379157314
72412683423161
72512875707088
72612909868676
72716040111781
72814211167667
72921614705967
73023860917664
73134650227754
73216674649999
73339901029445
73420814168833
73517614469927
73617968187746
73724273270385
73829558034970
73918859518022
74033527090319
74122617238265
74223417775399
74324703635263
74422575057800
74523613675885
74623851756836
74724899535749
74854341259152
74925559130249
75041887740312
75127121036343
75281788769757
75330885817666
75434289119926
75542318105190
75635534168021
75734642837745
75842711274858
75941466226763
76035582657673
76183784331953
76241434575822
76397052534010
76452386608341
76547031451284
76682614108957
76745992833199
76852020572092
76965501416197
77081674289029
77148751292585
77250458665998
77352680166592
77484177501621
77579507644684
77676968743843
77777017233495
77868931957671
779113796764610
78070177005766
78170225495418
78276109064508
78377048884436
78481575490872
78584333950258
786149684650450
78788466027106
78893024284483
789130170334820
790116169838965
79194744125784
792104700738684
793102479238090
794149733140102
795128789231100
79699209958583
797164921131550
798122905662010
799169993028326
800169386964349
801139157453089
802139108963437
803223442913695
804164575091614
805140402501184
806195503522573
807153157948944
808197223363874
809238199167208
810183210152890
811181490311589
812187675985689
813292315402033
814193954084367
815201689196673
816199444864468
817207179976774
818279511464621
819322743315467
820222115620593
821238318922020
822262014625447
823363947112693
824278266416526
825500213792655
826304977592798
827321892812773
828293560450128
829352251077303
830323612654074
831380935176057
832347112033311
833460434542613
834369166297278
835364700464479
836387120850157
837381630070056
838393398948835
839423804817266
840566389661152
841477711280994
842445498898794
843484130246040
844500333547467
845500382037119
846531879372148
847540281041973
848921216218030
849615453262901
850598538042926
851770916850577
852617173104202
853784047196687
854913501694463
855704547830131
856711812497790
8571000715584586
858751821314636
859901516098260
860746330534535
8611093442567846
862775029018891
863817203766101
864924186854385
865923210179788
866929629144834
867945880935913
8681445381066611
8691157454146175
8701032261409267
8711130417415074
8721401220300889
8731215711147128
8741213991305827
8751388089954779
8761321720934333
8771363503638737
8781416360327921
8791450878364666
8801456369144767
8811698239198679
8821592232784992
8832722941235222
8841741390620486
8852672080291895
8861699215873276
8872138532657628
8881763084702014
8891847397034173
8901852839324622
8914060170246674
8921978142345180
8932162678824341
8942189715555442
8952664869670493
8962344408720901
8973303717689288
8982429702452955
8993403706861269
9002685224573070
9012738081262254
9023104894259223
9032872729472688
9042907247509433
9053594901802395
9063887954754121
9075652403031666
9084384440446346
9094568235110583
9103462300575290
9113546612907449
9127979342248741
9133610481736187
9144015518148963
9156237279770968
9164140821169521
9175610810734942
9186295706309257
9194534124276343
9205790118832293
9215977623731911
9225167783715209
9236795202263554
9246147525148360
9257291687955779
9266419342380137
9278757297290889
9288129026078738
9296369548084723
9309699580346258
9317625999885150
9327008913482739
93314084020792604
93411363437374137
9357072782311477
9367157094643636
9377751302905708
9389183301864172
93911400929567235
9408674945445864
94110511748008254
9429701907991552
94311537331799932
94410903672361066
94510957902547502
94617684856948292
94711315308863569
94813214544643691
94913773525033510
95013378461567462
95112788890464860
95213442330396200
95313526642728359
95414698782196627
95514824085217185
95614166008126375
95714229876955113
95814908397549344
95919695049872426
96016774690303029
96115832040089500
96216426248351572
96318376853437416
96419186693454118
96530530822286127
96620213655999806
96720605580352618
96822441004160998
96921861574908568
97022273211411071
97124529853507260
97235651672978533
97328038629860876
97426167352032322
97528620930554360
97626231220861060
97756762043147187
97828225424924986
97928395885081488
98030592256477947
98136121298223998
98229138274504457
98330740437638844
98435527089961926
98533200938654601
98640650064848487
98734803101788988
98839400349453924
98939792273806736
99058756247211113
99140819236352424
99246836801213678
99344134786319639
99446391428415828
99546803064918331
99675319363768662
99754205981893198
99852398572893382
99954392776957308
100059213187032307
diff --git a/2020/day9/xmas_encoder.pl b/2020/day9/xmas_encoder.pl
new file mode 100644
index 0000000..4fdcb9b
--- /dev/null
+++ b/2020/day9/xmas_encoder.pl
@@ -0,0 +1,70 @@
1use strict;
2use warnings;
3use DDP;
4use Smart::Comments;
5use Tie::File;
6use List::Util qw(min max);
7
8tie my @xmas, 'Tie::File', "input" or die "no input present, $!";
9
10my %preamble;
11# because it's easier this way trust me
12my @also_queue;
13my $goalnum;
14
15foreach my $idx (0 .. $#xmas) {
16 if ($idx < 25) {
17 my $t = int($xmas[$idx]);
18 $preamble{$t} = 1;
19 push @also_queue, $t;
20 } else {
21 my $nextnum = int($xmas[$idx]);
22 my $tester = 0;
23 foreach my $num (keys %preamble) {
24 $tester++;
25 if (exists $preamble{$nextnum - $num}) {
26 my $old = shift @also_queue;
27 delete $preamble{$old};
28 push @also_queue, $nextnum;
29 $preamble{$nextnum} = 1;
30 last;
31 }
32 }
33
34 if (not scalar grep { $_ == $nextnum } @also_queue) {
35 $goalnum = $nextnum;
36 print("XMAS weak num: $goalnum\n");
37 last;
38 }
39 }
40}
41
42# find the contiguous set
43
44my @contiguous;
45my $total = 0;
46
47foreach my $curr (@xmas) {
48 if ($total + $curr < $goalnum) {
49 $total += $curr;
50 push @contiguous, $curr;
51 } elsif ($total + $curr > $goalnum) {
52 while ($total + $curr > $goalnum) {
53 my $evictee = shift @contiguous;
54 if (not defined $evictee) {
55 last;
56 }
57 $total -= $evictee;
58 }
59 push @contiguous, $curr;
60 $total += $curr;
61 }
62
63 if ($total == $goalnum) {
64 print(min(@contiguous) + max(@contiguous));
65 p @contiguous;
66 exit;
67 }
68}
69
70untie @xmas;