diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 03a0373..371ec3a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -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 diff --git a/day15/Cargo.toml b/day15/Cargo.toml new file mode 100644 index 0000000..f52c8dc --- /dev/null +++ b/day15/Cargo.toml @@ -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] diff --git a/day15/input b/day15/input new file mode 100644 index 0000000..88734b9 --- /dev/null +++ b/day15/input @@ -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 diff --git a/day15/src/main.rs b/day15/src/main.rs new file mode 100644 index 0000000..7997703 --- /dev/null +++ b/day15/src/main.rs @@ -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> { + return s.lines() + .map(|l| l.chars().filter_map(|e| e.to_digit(10)).collect()) + .collect(); +} + +fn expand_map(m: &Vec>) -> Vec> { + 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>, 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 = 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)); + } +} +