Added day 15 code for part 1 and 2

Signed-off-by: Louis Vallat <louis@louis-vallat.xyz>
This commit is contained in:
Louis Vallat 2021-12-21 21:47:48 +01:00
parent 70389d9e5f
commit 30dc247106
No known key found for this signature in database
GPG Key ID: 0C87282F76E61283
4 changed files with 176 additions and 0 deletions

View File

@ -73,3 +73,8 @@ day-14:
stage: build
script:
- cd day14; cargo run --release ./input
day-15:
stage: build
script:
- cd day15; cargo run --release ./input

8
day15/Cargo.toml Normal file
View File

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

100
day15/input Normal file
View File

@ -0,0 +1,100 @@
2331388323638161787399391263569123115292618342227141295826631182191129426253118171436238115111124362
8329311651253148931214679312159191282297394511936411514975191845522598161261792128373372964255217623
5213996517311119375469717261791142598367189818137751564212444658171138245154643871418242984159164719
3261939455331818312911416132186221132321568221122492545597298133872134993351311999312265952833225595
5114894127689414631321151717117981112191451649143987312267584216922145142912231221181254138984353619
8317953617943139627171182229512313116498152122111715112193229613912451432949947421437869512929111533
7346597213791139114811111729819641351164484293149919499181923111312242243621944519235621423223918131
8471435541514253262128911215486613121917239411191311318922652863619488911222231298631381722241462127
1626114218162522973115882121194869183168693245229811114152758125413224845114411914146712614134811156
4149895923531224511952638143822416688399811214819118852213516842422229333221613481364245726739111864
4638958152311545152179625233196891575823191141919467518892318292425531542113357113255616193318355147
1821249355121523129219211114415681151124655211871421665423731279528348391518661727226142287731365142
8413559611119363323614181472261911675123312911172351627741431495721399113364294516212129617148322891
5551317411648134419511366211727611151681113423721331491614741518312715858718317526211181212111714127
8911717279115491242677142481122122921469121134391211162636471231193261334112652261315782214359719348
4391767161119431264111836243663789121118963411942396214212291221758412511522717319293571186382293351
2684627241961834768541144419312441479224717375243628129627942981325793331111925438915569394112134731
1114162814298182615125394318411227531332847921317227374128227313271428932116413111113411185117916881
2859558751269189119214763954923212116112568598691111825112141348132942696121464868712294174912945119
3331194912154241448534211328211592373463331114681161421131969731464932715931521112819235713716148121
2419152281333711234482291291127652183831941911819285417289416162311441331629152111415752521213286621
2338187119794239119111171711913134166583318438183953573176551324313321129299521293471311233543693138
8427916973226194311418414191141815332937912118653339726628272231616461115149397655943556851435811742
3194191911322328338911713382556126255619784115679241112629124111323399276339524912128889123781732391
5283641716316291146175232381844113145111917211741895694211454911653768178731711951143712131813126432
3526132881494293171611151148148115511121625152769751412225231961314154714211229962561333227413181129
2231173658926187291742396213168822911986848413642729272326131529357296943461119461939335231894153549
1421381179114212224597271754917294792113811241732117121168211621919131125627891662166212291249133912
3574259918296381137781428111331334572591621542782211994171252933691339749221811632247523121118115416
4637962271333341118523414932319811114711182774391931231217653164252351633264343321119792349615491761
6171127773639615241118529314115637453184613341134515234123799126812115142951165164213162111212952111
3194279342118127567318149911711795841724155299749142811551412652616415414129134643621231139273332956
1119152939341516178399128141294522359133271732211111941945346119429159185415312214422118349147894479
6731998835914512311928861172839162157824393141731941168131681649917241249511827592849711591211553261
7291825322116926612125171151121419792985312223759991511496122211371572243239414632139935919731211126
5231112632156976323459141531841538695241113541959671917111223191898212119196111993561884689117331869
8116513159881924972112152125215911922276311144442995532198132613823448137852923171186841851128351161
1911929296211217235123111944258211136127114162396111241143952241518965811161775488392311925859249412
2261962892122482851989143122561474611588225211121692162291115474813281121116616111927911595111151251
8244832422126789296999314195811451259318972243111167365694341116399912217124215373523831387131352931
1853311151516591716219792228578133193941664942111684412533585128434692332222473659142281765787621138
9537851675123143211254384515612313819157127968531245552472141769281312213317126279813354529942191529
1141116261511243841336616189229732419662333929431152411316327496525123952914132534182849618212259615
5212129135355974379191112317221251911633159921671124917134637536155122122463974671741914675524111192
3536351927157121812412511287122282994113328861124314333897211351113737932171951331153721948439148123
8122721112922911192171191411141779221882187933186431179119236298323432496116193463341521892121394791
1174615131611222429397228112416911318479856462136173899396359212111215354228939116491237912291879354
5143198771712179261652441172132334496813937911518119116742812169231987226419112247214949125224316632
1291249312218614141149931141919285711811823827762639169412482915715213719517145191991972382963116143
3628713162563278519269726352712171263661216771218146124584112932481121621815154131911182111417511247
7119589917319532131231259944423311131121823441211144132141116912167261151841168817273919267216132317
2682588417311117111428111721183128211912171341512113541411191148788625511187919966428145478111146431
5712471119433113112956932711793966283486213315871413147925494871313363242334119191221132179945643219
1413144174858192981331211113912134318433912118511729731229118899116722223252834913126362628218722926
2677691297988621154239141972154569191821482211916629333433121423241294876291613113176419144225211912
1243446191935215393133235427164517149444889232331272522123977181624839744132118125319763861228234656
7142814181185129341212713213641812481579593512312717113835741356411921334129162128551619212187111391
2896172447819622251434121552197843881566317713225958412115651313421672128191153111325228392413114386
9522821169115122532144311113194129833135511128458418511316889372256915141258511136322914141916115116
7585995191216321624558573928919631517132274693121711141111155544283492541316536199862111277177114359
6161629818791453821698899372431347971231521311139311721113354271387353426129993688424435496332611637
9865254212697314671436471321422442794688322691411911182161868213259647418695911567376222572117176953
9119991151125413352235611331762922111415865913177957211312832942251617125241141432254795951544882913
8711931139115422441911223419444371944353269182714121448326131218114474131812112162314245936269913113
5511155412529391431111348811465427243911114757567852148645114248911692935661116141393174112185731165
3897171672274113524321178231151241122654348182477879431621117411228194711919111143192412212131377281
2567948419641115769121453142586116841892845833419762611815112431933181679513759163117116943152135712
1214919441225715121198162339431121326711999118312165622215183743461895225319954192171226822641511267
1325311917911488991212491113281322123561171489393178618119791335641612366472791113444785342554912169
7149113311148949119599817294857152311312199113763371119132531191112929715235133733723521133114433614
9716428791617211319218441141683478292374525319819252415928188911712191231731539483665387131821415119
7761142623691912236213811174278782273621742191192278195311183732161172489372731292157112591251651922
1723862352229281142132211211115313339159442672841181559637187351998151432175895811531721977181429154
8232971449518151321212261688453413961364984562661211711449346944364932346111881212114111322538818216
2133711322131361291911951251332159252297117319124312381867431183518791194971656286469394199613282941
1791834418333119215121241695912162475851393129129272833318324391659791521211957811962137933921921172
4211881814412523191861824314912113116441614693613468692649282965146551544621884879344819851821196289
4239934411879317281461993916212418592669129435754241141443791559232422341147864715185731173151112348
2278515211119833259531189141257182899522149415162225516823181614835171948111132791219637215114739319
6111791351361541662255193898217142391242113969612113198911122247796936977131111742221689739621713311
9812123351219181139337922111819541588534111311262115215144123159138489421339611161699924617856137417
1122631413493173914413141939694182481111233924475437229841396231226174336227677171511415131347953373
9311221919485212177184171257146292521271915854242911111521178414621112712132121818584391934875126896
1949461911533111919951733122161131519431189251112617211678219844732361941985814765136334739612363322
1912315561836316169111127235223862981499131112833659732167334325163789612155411242574121761428241829
3431132521197319216417211319961461995412112546133283157111288971181113125937811869444193641239255169
8272128161944812371451127913329972728611399466628112462411465893561975591157152599497218629715241173
5929613292142529182113299825358632281894673135231342523641128339869918282114368411722256158712311217
1613984821985188114169613413195221248757458129911422119545114125913239899112531175211359713559411461
1841144121251597386994119516254123387269162154657382219941511191319629819651151233553198556131158319
6181486282549195127382569891291911145525492132413512532115548123122114931381144971673232178461692241
2122931131552576121211214269519112318141119669497172691711419711829684188216741961166423362114211763
7331249612114924111139849955721214636832111559983458112217919118362371613762113182211695213568776151
8839116538213331742413272581583112567925592551159141127221333119844972117444633188513121313132186116
1449163396715312116378711719987129521114341224536914414993212639721138591112512598219355179521252164
1162361871117422823359213425112346372893191111733991943311731128169855181183246114153159158759811551
1496274421162915212192943813121362369923161249623166391314619497283319214511185211641111825312892553
1821111931141395137619416345127152199118541251197225895217856156445231633941321398318194115629913292
2461131231965974129721167115524443521891352525461448321145339316647126211269238831498512659298396159
6112851322783221514154142291126293349181211111135663126974495414222811141375711391289743412348124497

63
day15/src/main.rs Normal file
View File

@ -0,0 +1,63 @@
use std::{fs, env, collections::HashMap};
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 expand_map(m: &Vec<Vec<u32>>) -> Vec<Vec<u32>> {
let mut t = vec![];
for l in 0..(5 * m.len()) {
t.push(vec![]);
for c in 0..(5 * m.len()) {
let x = (m[l % m.len()][c % m[0].len()] + (l / m.len() + c / m[0].len()) as u32) % 9;
t[l].push(if x == 0 { 9 } else { x });
}
}
return t;
}
fn get_shortest_risk(m: &Vec<Vec<u32>>, mut l: usize, mut c: usize) -> u32 {
let mut w = HashMap::new();
w.insert((l, c), 0);
let mut q = vec![(0, l, c)];
while !q.is_empty() {
let e = q.pop().unwrap();
l = e.1;
c = e.2;
let z = *w.get(&(l, c)).unwrap();
let mut p = vec![];
if c > 0 { p.push((l, c - 1)); }
if l > 0 { p.push((l - 1, c)); }
if c < m[l].len() - 1 { p.push((l, c + 1)); }
if l < m.len() - 1 { p.push((l + 1, c)); }
while !p.is_empty() {
let a = p.pop().unwrap();
let x = *w.get(&a).unwrap_or(&u32::MAX);
if x > z + m[a.0][a.1] {
w.insert(a, z + m[a.0][a.1]);
q.push((z + m[a.0][a.1], a.0, a.1));
}
}
q.sort_by(|a, b| b.cmp(a));
}
return *w.get(&(m.len() - 1, m[m.len() - 1].len() - 1)).unwrap_or(&u32::MAX);
}
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 exp = expand_map(&vec_in);
println!("[{}]", &arg);
println!("\t[Part 1] => Answer is '{}'.", get_shortest_risk(&vec_in, 0, 0));
println!("\t[Part 2] => Answer is '{}'.", get_shortest_risk(&exp, 0, 0));
}
}