Added day 9 code for part 1 and 2

Signed-off-by: Louis Vallat <louis@louis-vallat.xyz>
This commit is contained in:
Louis Vallat 2021-12-11 22:55:09 +01:00
parent 126637b438
commit 677004739f
No known key found for this signature in database
GPG Key ID: 0C87282F76E61283
4 changed files with 194 additions and 0 deletions

View File

@ -43,3 +43,8 @@ day-8:
stage: build
script:
- cd day8; cargo run --release ./input
day-9:
stage: build
script:
- cd day9; cargo run --release ./input

8
day9/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "day9"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

100
day9/input Normal file
View File

@ -0,0 +1,100 @@
4323999434356678989012399854245901359876432101298901239876569892012345896567996545678912345689998921
6319898921234589878923987653129892349989949212347892398765498765423456789469884326789923468998997890
5498767892945678967899876543256789998999898943456789987654329878534567994398765434567894579997876789
7598756789896789656799988654347897897898787899969894198969210989675679865789987645678965989986845678
9987642356789995345789999767658966956987676987898943019898921299789789989898998759789996899895434567
8765421234597893234567899878979654645696545545787892198797993459895995797967439867899989998756523456
9873210123456789145978967989989743234985432123456953987676889567994379976543123978969878987643212677
8654321234599891059899656196899820189876541034567999876545678978989457898991034989454569899876543467
8765432346789932129789543245698721278987632175679789985434899299879768909989549994323798789997654578
9876543459999943398656959366797632368999543286789679876545789349768979219978998943212345695498765679
8987654567899854987847898997987543456987655399896598987656999998657894398769876543101456789329876789
7998766678998769876236987789998787567898867899989467898789679876546796987654989654212567893210989894
6879878789439898765134896578999898678999978999876347999892498765435689996543498765323989964348994943
5667989894323949873256789459899969989799989298765276789901999976523499989432369878554899979767893212
4456998976210239954367892365797654395689990198754345890199898765434678978943458987675789989989989103
3347897654321298765458921234998753234567891259869656789989729879656789567954667898789895698794567924
2256998985434349999567890147899432145678942345998969999877610998789893457895978989899924997643457895
0197899876579569878998921356987553269789653496987898998765431239898921238989989876968999876432346796
1989921989698998767889432387898769998997654989976767999865432378997632345678998765656789997321245989
9879899998997897658978943499949898787898769878765657892976543456796543458989987654245894395460349878
8768778987986986546569765678934987656789898765454345991097694567987654567999998742134589987651298766
7656567996765987432458979899929876545689997654343234789198989798998785688958999821023678987542987654
8543457895454599543567898987898965432398789543210123678999978989109898799767898762124589998963499763
7432568976323987654678987896587898751987678954621234567899868878998969899878987654355678999654598754
6563678996454598785789876543456789899896567976542545689988759767897653978989698776456789498775679876
7674569987887679899899998954587893998765456897678766789977648956789792368994569897568992349896789987
8789678998998799987978989899998941987654347998989877899866537845678989457893556998989641239987896599
9996989469239899976567976798889432398743257789995989999654326534989878968942445989899932398998965456
9765794345999998655456985697778943469854345679954197898765410129798956899321239876787899497899999999
7654654239878899543257894986567954567965466789893246799987654397657645965490399865676798976789987878
6543210198768789954145993214456895699876587898789345678998766498543237896989988754545987545698986767
7659323498756567893239872102345696989987679987678956989999987987632126789879876543234985434767895456
8798944987643476789398765213456989878998793236567897899897899876543245998765987656129876323456789346
9997955698652345679459854323469878767899892105478898998766976987654346789654598761034987654979893234
9986896789821239896567967469598765457894999212345789999845275698766457896543469878236798899897992123
8875989899843345798999897578999854346795698923458897898732154569899598987674878989345899988756789634
7654678998764466989987789989899965234896987894567976987621013456987699698765999999456999879645899546
8463567899876577978996578898659894365689876789678965496434154789998789549896899898767898766434578957
4322456799988789467986459789548789456790245678989654398645865699899899932987998789998999654323467898
3210345989999891239874345678937578968921576789998763219856776789799999891098997656569998765634678959
4421299876789999498763234589425467899432347999899865498987887895679998789129986543467949976545689646
5542989665678998987654345678912348997543598998799986597898998954598987679298765432599234987898795431
6743976564567796598765466789323556789954689898678999986569899323987896567999877653789345698939894310
7769865433475689439876578895434667899899797654589998777476789012396543457899998789898959899323965621
9898764321234678912987889976545978998798976543478997654365692126597632349789109898967898989459875432
6969875430345799323498998797667899457657897652367898743234589987698721234589299987654987678998998745
5456989561256789534679967698799954312445679721458999892123678999899830145678989976543498899897897656
3237898762347897645789854549899543101239998932369898989294569767998764234889679885432459998786789767
6545679654456798789999753234997653212398887893456797679989678955349854345796598754101345987675679878
7656799765767899899899875123989964329987676799569986568678989844239965566897399543212659976564568999
8767949879878999956798765234567895498766565688998765454567897632198987677979987674353598989323656789
9878933989999997345987654347978987987657474567899864323456789543987798789657898765674987643212347898
2989212399899976499899765456789598999843323456798543412345897689976579896546989978786799532101234567
1099923456789897988769896567893459988732012347987632101276889798865456965435678989897899744312345678
2989894569898789876553987878932349876543123457898543242345678997655329876323468996998998765423456899
9878789678987678965432398989321956987654234567998765953456889896543212965414567895469999876536567893
8767679789876569896543459999939897899776876678929878767967996795432109876525678994356987987897678954
7654568998965456789654597899898789999897898789213989879979645689643234987987989789249876598998989865
6543457976434345678969986789787678989969959892102398998796534679865359898998995678998765459789999986
7532369865421237789998995897678459876553345943234567895679845989877899789999434567897654345678998987
8643456976510175893987654589541234985432237899765678954598759992989987678985326789999543256899987799
9754567984323234992199867678920349894321018989887899943698767921399976569876434697698954387929876545
9965678999654345689023978789321298765732147678998999892349878992349989678998556789567895998934984334
9896789698765456795434989897632349876654234567899998789759989789498798789987667898488976789949893213
8789996539876568976765699976543456987769645778998987698998795678997629899998979987569987899898789323
8678789623987878989876789987656567898998756789987654597899654578987510949879989097698998987678678934
6577678910198989099987899999878978999459867897898769986898943139995421234569992198987989766534567965
5464569923239099198798978987989989989234978976789898765567892098986532345678943469876878954323588976
6323467894549198999659767896590195678949899965878987653467894987987645456799654979765767893212789987
7467878995698987888943656987321234789998799894569876542345695986799656777898769898954456794325678999
9878989789987656567892346895499995894987676789678984321237989875678967888959998767893345689634789343
9989795678976545456789498976987889963298545798789995452345678964569898999543989656921239796545895212
8799654345987432367898569299876978954987656789896976563456789543456789212959876967892398987656954101
5698743239874321298987694398765767896799767899965698754689897632345898909899765898993987898787893212
8789842198765453456998789987654656789899879999854569869793998943458967898798654789989796789898965337
9898651019976764567899899876553234899999998999763579878892349894967898987698765678979655679929598656
8999532124987989678921999765454123689998987688932389989921498789898999876549876799768443458913459767
7987693535698998799210198754321014599997698567893499995210988679789498765434987897654312367904599898
6298989545679129898921239895932135679876542348954569874329876565699349954323698998766423778912989989
5129878996989098987892398989893234598765430567895678965498765434598998766464569239976534567899878879
4298767789998997645789997868689395987654321789989789876989954323457979887575698999988785678998767656
9987656679987673234669876546578989998865439896578999989879765545568967998786987989999876799987654343
8764346567895432123456987432446678969976546965456789998769877696678957899899876878913987891098765212
9843213457897641012349996551234569655987697892347999879656989987889345679999985467899999942139876909
9874326567999973253598987767897678934598788901256789765345699898998956798798754376788987659245989898
8765534567899654345696598988969789012479999432346789654236987649567897897649654234567898798967998767
9876645678958987656985459199459892123467987656759896543129876533456789986539867545678989987899879756
1989856789767898769874321012389943234568998767867987321013976512356899876621998656789679876789769845
0198967899878959998765453125678974345899459898978998534123497301245798765433498767896567965398654976
1987698901999239879876875234569865456789345949989987643294989212398999879754699878965459876797743988
9876569892999398767987864345678976567899276932994398784989978934567891989876789999894323987896532399
8765456789878999856998875457899987679998999899875999899876867897678910199997890123789412398965321246
9984345898768897645879987568999998793467989799989899988965456998989329988998943235694325499984210123
9765457987656789734567898979998879912399865689998789877652347899395498977899876545789434989875331234
9876569876545678923456789989987762101987754679987698768341236789219987656789998756789649878989445678
8997699997656789212345898795496543212976763567896549854210145678997697545899989867899998767898986789
7698989698767892101256987656398654323965432356789430969321234567976543234878978998999894854567997891
3569876569898976412345896546239876579876321245695321298763367898965432123458965459998763213458998942
2345965412969994324456789634123998689988432357976763497654456999976543234567898567987654101556789543
0156976323456789534567994321014569795499543568987954698767767894397654545798987678996543232345678954

81
day9/src/main.rs Normal file
View File

@ -0,0 +1,81 @@
use std::{fs, env};
fn read_input(path: &str) -> String {
return fs::read_to_string(path).expect("Cannot read file.");
}
fn parse_input(s: &str) -> Vec<Vec<u32>> {
return s.lines()
.map(|l| l.chars().filter_map(|e| e.to_digit(10)).collect())
.collect();
}
fn find_lowest_points(m: &Vec<Vec<u32>>) -> Vec<(usize, usize, u32)> {
let mut p = vec![];
for l in 0..m.len() {
for c in 0..m[l].len() {
let i = m[l][c];
if c > 0 && m[l][c - 1] <= i { continue; }
if c < m[l].len() - 1 && m[l][c + 1] <= i { continue; }
if l > 0 && m[l - 1][c] <= i { continue; }
if l < m.len() - 1 && m[l + 1][c] <= i { continue; }
p.push((l, c, i));
}
}
return p;
}
fn compute_total_risk_level(v: &Vec<(usize, usize, u32)>) -> u32 {
return v.iter().map(|x| x.2 + 1).sum();
}
fn get_size_of_basin(m: &Vec<Vec<u32>>, l: usize, c: usize, e: &mut Vec<(usize, usize)>) -> u32 {
if e.contains(&(l, c)) || l >= m.len() || c >= m[l].len() {
return 0;
}
let i = m[l][c];
if i == 9 { return 0; }
e.push((l, c));
let mut s = 1;
if l > 0 { s += get_size_of_basin(m, l - 1, c, e); }
if c > 0 { s += get_size_of_basin(m, l, c - 1, e); }
s += get_size_of_basin(m, l + 1, c, e);
s += get_size_of_basin(m, l, c + 1, e);
return s;
}
fn get_sum_size_basins(m: &Vec<Vec<u32>>, l: &Vec<(usize, usize, u32)>) -> u32 {
let mut p = vec![0; 3];
let v = l.iter()
.map(|e| get_size_of_basin(m, e.0, e.1, &mut vec![]))
.collect::<Vec<u32>>();
for i in v {
if i > p[0] {
p[2] = p[1];
p[1] = p[0];
p[0] = i;
} else if i > p[1] {
p[2] = p[1];
p[1] = i;
} else if i > p[2] {
p[2] = i;
}
}
return p[0] * p[1] * p[2];
}
fn main() {
let args: Vec<String> = env::args().collect();
for arg in args.iter().skip(1) {
let input = read_input(&arg);
let vec_in = parse_input(&input);
let lowest = find_lowest_points(&vec_in);
println!("[{}]", &arg);
println!("\t[Part 1] => Answer is '{}'.", compute_total_risk_level(&lowest));
println!("\t[Part 2] => Answer is '{}'.", get_sum_size_basins(&vec_in, &lowest));
}
}