aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--input091000
-rw-r--r--src/main.rs64
2 files changed, 1062 insertions, 2 deletions
diff --git a/input09 b/input09
new file mode 100644
index 0000000..703f026
--- /dev/null
+++ b/input09
@@ -0,0 +1,1000 @@
+12
+36
+37
+31
+33
+25
+48
+39
+6
+7
+23
+41
+21
+13
+8
+14
+29
+43
+10
+17
+16
+42
+3
+11
+19
+9
+56
+12
+15
+61
+18
+58
+20
+22
+24
+25
+27
+23
+21
+13
+49
+28
+14
+26
+29
+17
+33
+63
+30
+31
+85
+32
+34
+35
+40
+46
+36
+37
+41
+38
+39
+42
+91
+27
+76
+43
+45
+82
+66
+52
+44
+65
+61
+57
+71
+100
+59
+62
+109
+112
+70
+80
+86
+68
+69
+72
+79
+84
+120
+87
+88
+102
+96
+111
+101
+103
+116
+118
+119
+129
+121
+127
+150
+137
+138
+168
+140
+156
+253
+200
+159
+180
+171
+184
+175
+189
+203
+246
+204
+217
+221
+234
+259
+248
+250
+258
+455
+275
+277
+278
+296
+299
+336
+330
+334
+376
+346
+378
+359
+379
+536
+564
+533
+829
+467
+1069
+689
+498
+609
+791
+735
+844
+552
+555
+675
+642
+680
+664
+867
+832
+1003
+705
+737
+877
+846
+1173
+1535
+1324
+965
+1313
+1050
+1441
+1107
+1273
+1194
+1583
+1197
+1870
+1260
+1306
+1797
+1344
+1678
+2127
+1442
+1997
+2320
+1614
+1723
+1811
+2301
+2159
+4098
+2015
+2586
+2470
+2304
+2367
+3607
+2811
+3501
+2457
+2566
+2604
+4117
+2786
+6568
+3056
+4281
+6703
+3773
+3337
+3629
+5372
+4319
+6418
+6276
+4382
+4581
+4671
+9070
+4908
+7173
+5023
+6839
+5513
+5061
+5170
+8011
+7067
+5842
+8245
+9142
+7948
+6966
+11582
+9841
+8210
+9579
+8900
+8963
+9732
+16911
+15121
+9694
+10865
+10231
+14864
+10574
+10683
+12808
+16974
+11012
+12909
+23491
+25986
+18105
+14914
+15176
+15929
+17110
+17173
+20597
+17863
+18594
+19646
+19426
+19925
+30772
+20268
+20805
+46583
+23820
+37770
+25597
+23921
+25926
+45686
+33039
+30090
+30843
+35278
+32024
+40193
+33102
+50269
+35767
+36457
+38668
+52748
+39072
+39694
+47741
+67860
+49417
+88085
+57023
+62993
+128278
+101661
+91416
+56016
+161317
+60933
+89963
+62867
+123440
+69559
+73295
+151078
+72224
+74435
+110892
+89111
+78766
+86813
+112284
+97158
+123926
+105433
+113039
+118883
+116949
+133157
+123800
+125575
+128240
+165579
+244049
+132426
+147730
+197221
+175924
+231922
+146659
+161335
+153201
+272227
+167877
+183971
+192246
+258732
+273082
+222382
+218472
+229988
+387961
+240749
+249375
+252040
+253815
+260666
+472671
+279085
+330630
+343801
+299860
+407846
+314536
+329212
+337172
+345447
+351848
+376217
+402443
+512706
+474422
+470737
+759694
+448460
+674431
+754291
+540609
+501415
+589212
+630490
+539751
+578945
+593621
+1253376
+614396
+629072
+643748
+651708
+681060
+1220811
+697295
+1198710
+1080360
+850903
+1711416
+945159
+919197
+949875
+1311691
+1182833
+1041166
+1738461
+1090627
+1118696
+2140008
+1133372
+1172566
+1208017
+1258144
+2223999
+2148585
+1824274
+1332768
+1796062
+1548198
+1896005
+1770100
+1800778
+1864356
+1869072
+3322841
+1960363
+2910238
+2131793
+2159862
+2174538
+2252068
+3036922
+2968628
+3072373
+3508561
+2380583
+3620336
+2590912
+5454634
+2880966
+3197124
+3318298
+3344260
+3929962
+8651758
+3730463
+3665134
+3733428
+3829435
+5042031
+4092156
+5055504
+4306331
+6515422
+4426606
+4632651
+5452956
+4971495
+8884939
+5261549
+10026999
+6078090
+6541384
+7976911
+6611429
+8971993
+10097535
+8797216
+8036794
+7395597
+7398562
+7494569
+7562863
+14958460
+8398487
+8518762
+8732937
+11582924
+12824412
+9398101
+12609562
+10233044
+12367092
+11339639
+11802933
+12619474
+12689519
+18978521
+14007026
+14009991
+16128534
+18131038
+16555556
+21128324
+14890166
+16295800
+19077493
+15961350
+20321695
+22017575
+43145899
+18965981
+19631145
+25359451
+27509640
+21572683
+28985319
+23142572
+25308993
+24422407
+26626500
+27579685
+28897192
+36027566
+29971341
+37424124
+32516906
+30851516
+31185966
+51988916
+32257150
+52939136
+34927331
+67184481
+38597126
+44053552
+40538664
+41203828
+44715255
+45995090
+59143406
+47564979
+48451565
+63019533
+51048907
+94205499
+93560069
+58868533
+74686596
+60822857
+72795814
+140200589
+73460978
+63443116
+70854276
+111807669
+73524457
+96016544
+87198918
+79135790
+85257380
+158781837
+85919083
+232306294
+159372648
+98613886
+222392181
+99500472
+119691390
+109917440
+122311649
+124265973
+181180182
+131677133
+133618671
+136904094
+136967573
+195174820
+134297392
+205151668
+329417641
+152660247
+164393170
+243528960
+165054873
+171176463
+219191862
+184532969
+198114358
+208531326
+236468045
+327463317
+209417912
+229608830
+318151640
+479997005
+466076875
+315477574
+348926139
+338770339
+271201486
+317715120
+350774605
+318830361
+548609503
+372924496
+317053417
+329448043
+455659907
+336231336
+355709432
+503363330
+382647327
+407532270
+527569552
+439026742
+480619398
+500810316
+672762849
+586679060
+666252179
+588254903
+725247390
+588916606
+1023537454
+634768537
+691940768
+635883778
+646501460
+653284753
+665679379
+905970023
+910895600
+1001910715
+1055410176
+886010657
+790179597
+675280050
+1318427870
+919646140
+1069536004
+1223685143
+1233180520
+1174933963
+1175595666
+2399280809
+1177171509
+1224800384
+1850875716
+1270652315
+1281269997
+1282385238
+1289168531
+2190298455
+2110811041
+3574876475
+1465459647
+1830541740
+1561290707
+1676190254
+1850214013
+1594926190
+1900080434
+2200916137
+1989182144
+2244469967
+2350529629
+2457319201
+3399979572
+2352767175
+2401971893
+2466340040
+2513968915
+3515122282
+2551922312
+2563655235
+2571553769
+2850459238
+3296001387
+3026750354
+3141649901
+3060385837
+4980308955
+3156216897
+4750539672
+5910845075
+4250610063
+3889262578
+4190098281
+4233652111
+4594999596
+5402381550
+4754739068
+4819107215
+5316799278
+4915940808
+5029995275
+5065891227
+5115577547
+5414114473
+7318394303
+5422013007
+5877209592
+8639802250
+6087136191
+9147522028
+6216602734
+8845609659
+7045479475
+9311275585
+8079360859
+11296089538
+12732508776
+8423750392
+8828651707
+15527878319
+9573846283
+9670679876
+9735048023
+17571272420
+9945936083
+10095886502
+13194938406
+10529692020
+14932745850
+12093812326
+13262082209
+11964345783
+12303738925
+16356755060
+20792997490
+24506592133
+15124840334
+17141365977
+16503111251
+16908012566
+17252402099
+21685832601
+27145118703
+18402497990
+19244526159
+21538192066
+33498121037
+19680984106
+22833430945
+23724630426
+38042587661
+34759253050
+22494037803
+48430866887
+24058158109
+40088330591
+24268084708
+29445104902
+31481595394
+38041303317
+31627951585
+33527338324
+36184095357
+43302684268
+34160414665
+51413203411
+38925510265
+37647024149
+43949068814
+61371654575
+41219176172
+56331551982
+42175021909
+45327468748
+79486779625
+57253290853
+46762122511
+46552195912
+58218572774
+48326242817
+68370615167
+53713189610
+60926700296
+81990372131
+65155289909
+65788366250
+67687752989
+78866200321
+80949708417
+73085924930
+81100532174
+76572534414
+79822046058
+83394198081
+86546644920
+87771372084
+151081951070
+121997067967
+91879664660
+93314318423
+94878438729
+122083804777
+102039432427
+159632569850
+133535235668
+114639889906
+118868479519
+126081990205
+130943656159
+132843042898
+133476119239
+140773677919
+154186457104
+149658459344
+168452199074
+169886852837
+171165570165
+163216244139
+169940843001
+259558109444
+179651036744
+185193983083
+209518328635
+195353750850
+188192757152
+216679322333
+240721880111
+304641689404
+233508369425
+275740449549
+273616720817
+271717334078
+257025646364
+263786699057
+492834446556
+358569994989
+290432137263
+303844916448
+312874703483
+331668443213
+341052423002
+351409001291
+512439214189
+473305027692
+364845019827
+645694112406
+373386740235
+457401202444
+383546508002
+404872079485
+581524342160
+497747526475
+490534015789
+523940506688
+530642367181
+520812345421
+714439163237
+547457783627
+742116502991
+594277053711
+603306840746
+641841138554
+986746535408
+644543146696
+993250139845
+894199085656
+1015227878789
+1351591555235
+738231760062
+769717099312
+1195632962506
+1008178920231
+1232650518780
+895406095274
+1994925455639
+988281542264
+1386659649687
+1341538600808
+1044752852109
+1238820200407
+1591588383010
+1141734837338
+2547224517741
+1197583894457
+1236118192265
+1245147979300
+1286384285250
+1382774906758
+3377700362397
+1507948859374
+1632430845718
+2349717521039
+1633637855336
+1757998641576
+3857666380413
+1883687637538
+1903585015505
+2220932061044
+2037140932612
+3516118483256
+3391636496912
+2289900831409
+2733323220348
+2636341235119
+2339318731795
+2377853029603
+2433702086722
+2442731873757
+6235519410016
+3537222870841
+2531532264550
+3817916549800
+3390429487294
+3141586714710
+3140379705092
+3266068701054
+3517325492874
+4047899472985
+4435117280055
+4173588468947
+4326419511295
+5167025307070
+4598785090647
+5430280536501
+4975659966914
+4667753861012
+6607290555669
+4717171761398
+4773020818517
+5699770787776
+4811555116325
+6281966419802
+4974264138307
+5671911969642
+8820710023795
+9873359256723
+6406448406146
+15040384563793
+6407655415764
+8492985459788
+9573049228954
+8234497254272
+13468645426702
+8985143585272
+8500007980242
+10142685273984
+11006440506411
+9266538951659
+9384925622410
+9440774679529
+14906456386388
+9490192579915
+9528726877723
+9584575934842
+10674034926083
+9785819254632
+15980704644718
+12078360375788
+12814103821910
+19113302812565
+14640945660418
+16550340689748
+14642152670036
+14900640875552
+19928504528616
+16734505234514
+17219640839544
+17766546931901
+31192493359784
+27362326113528
+18651464574069
+24172995338047
+18707313631188
+24435183264111
+27408540160597
+19276011834547
+21607087253511
+28180191451792
+49787278705303
+24427971924668
+27552366186533
+30621650305136
+54794645643183
+55627676623895
+37695051460517
+31450981565300
+29542793545588
+38826728093055
+31635146110066
+85987139002967
+43079436498737
+41392636177591
+49159453440044
+37358778205257
+37927476408616
+103954099083227
+37983325465735
+40314400884699
+40883099088058
+67722941045296
+70936051189835
+46035059178179
+51980338111201
+68993924315323
+68809759770557
+57095159732121
+60164443850724
+60993775110888
+69330197570583
+61177939655654
+63086127675366
+66901571750845
+77670205288245
+69562622518682
+112642059017419
+78751414382848
+97978258820179
+75286254613873
+75342103670992
+75910801874351
+78297726350434
+81197499972757
diff --git a/src/main.rs b/src/main.rs
index 635a672..ff4ac74 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,7 +3,8 @@
use std::fs;
use std::hash::{Hash, Hasher};
use std::cmp;
-use std::collections::{HashSet, HashMap};
+use std::collections::{HashSet, HashMap, VecDeque};
+use std::iter::FromIterator;
use regex::Regex;
fn read_file(file: &str) -> String {
@@ -31,6 +32,13 @@ fn read_numbers(file: &str) -> Vec<i32> {
.collect()
}
+fn read_numbers_64(file: &str) -> Vec<i64> {
+ read_file(file).split('\n')
+ .filter(|x| !x.is_empty())
+ .map(|x| x.parse::<i64>().unwrap())
+ .collect()
+}
+
fn find_pair_with_sum(numbers: &HashSet<i32>, goal: i32) -> Option<(i32, i32)> {
for i in numbers {
if numbers.contains(&(goal - i)) {
@@ -580,8 +588,49 @@ fn day8() {
println!("8b: {}", console.repair());
}
+fn find_xmas_number(input: &[i64], prev_count: usize) -> i64 {
+ let mut queue = VecDeque::from_iter(input.iter().copied().take(prev_count));
+
+ for number in input.iter().skip(prev_count) {
+ match queue.iter().find(|x| queue.contains(&(number - *x))) {
+ None => return *number,
+ Some(_) => {
+ queue.pop_front();
+ queue.push_back(*number);
+ },
+ }
+ }
+ panic!("nothing found");
+}
+
+fn find_xmas_weakness(input: &[i64], goal: i64) -> i64 {
+ for (i, _) in input.iter().enumerate() {
+ let mut min = goal;
+ let mut max = 0;
+ let mut sum = 0;
+ for val_j in input.iter().skip(i) {
+ min = cmp::min(min, *val_j);
+ max = cmp::max(max, *val_j);
+ sum += val_j;
+ if sum == goal {
+ return min + max;
+ }
+ }
+ }
+ panic!("nothing found");
+}
+
+fn day9() {
+ let input = read_numbers_64("input09");
+
+ let number = find_xmas_number(&input, 25);
+ println!("9a: {}", number);
+
+ println!("9b: {}", find_xmas_weakness(&input, number));
+}
+
fn main() {
- day8();
+ day9();
}
#[cfg(test)]
@@ -758,4 +807,15 @@ mod tests {
console.reset();
assert_eq!(console.repair(), 8);
}
+
+ #[test]
+ fn test_day9() {
+ let input = [35, 20, 15, 25, 47, 40, 62, 55, 65, 95, 102, 117, 150, 182, 127, 219, 299, 277, 309, 576];
+ let input = Vec::from_iter(input.iter().copied());
+
+ let number = find_xmas_number(&input, 5);
+ assert_eq!(number, 127);
+
+ assert_eq!(find_xmas_weakness(&input, number), 62);
+ }
}