My attempts to solve puzzles of Advent of Code
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(2022): day 8

+288 -2
+99
2022/data/day8.txt
··· 1 + 000110211310120301121312200301013204213433321324454125534120411314221421432204213123312010120220212 2 + 020012220322312203320423330100141123432232555552131513413333243201041414120414404222300212031212210 3 + 012220223030033030244430211234220045555352514254335343332514243345202201013120303123003031322301122 4 + 122212123203002004034001203313232515112543525251445353434224414533524014020242242322320223010131111 5 + 221102333103333221411324203034235135343455415425134251221521352512445343444242410343133031022213111 6 + 012230110220232130043321130142424543415542352534155145434324432553532253510101043422110311302133322 7 + 121211332110331222432012225134422432341112144421535153351545122134242232152130110334114400332212301 8 + 021003020222222304114022552315552411255554221162455263643351112333322235214353424140101110301013303 9 + 211101331332303134320025235254523341134225246335554356533426415514344521433235223100024100322012213 10 + 333121033001133202211331144545334545442426462335662255342342626524313432432255113203322322002312200 11 + 010322322141333044304115552115413253563353625666244464226452656243424545525555553333333441121311231 12 + 032330304041422420432124324244236264255242536445626642464646454324353143112245143242140134012131113 13 + 113222323414023431235314252222246225364232452564335525523344525664226653522112244131121334130320322 14 + 121002342323322351314412423235433523643565644552335525522462425253643354453342113152132444223043001 15 + 303334322134140123154241513636446642663346536533667552624355222224332425555525121255313000110224301 16 + 220002230431013514545542433426226364623335746773567356566543235364324426533313525143244100121033121 17 + 000021230222223532342154546526322562455734556753354636566447345465225625536633243334425112234211423 18 + 100240131421551532143146364665353436655665676767645757767765365733656436442643144352144332403323231 19 + 231322213332442222125662224633422364634335777574764763343776757435645252662432644231412254011230044 20 + 120320134105242421434423353553635756666465645446464476746533434474737333355643266531333324433212400 21 + 040301032133333254244335264252755376435754666436667554445363634375377335452223443455551432333010144 22 + 122213043542434415443363356663454534757746355453573654756377543673443533255466446625122132310014334 23 + 404243133333412213345434336533364653576735676667576876848337555643553537554265552455111211141430132 24 + 443341301142235415336322424546477554637688787745866488887577434344636437734332223546335121555322312 25 + 010101032453544354452355447644336446437444776676584487868688446743777537543333245666541212524431033 26 + 130342114125121245655353346445355733446776587588784546588474685553536367574445523434254125522412333 27 + 201242125553223436463223777745535566487874456667845657466784588644655657455355352552555444112241410 28 + 234243354255336642454256767534444878687668756444875858587854778474484437455656353656253411335452400 29 + 314411514514125254223353563444477554768588585448654748855456656667558676453446723446433551542333323 30 + 320425133145356325256655577477467888556845884576957768675647786647464447677575756555366251552252023 31 + 402024545131232242524557435777674845786545558766585956759687647846545584454443736545244555225513404 32 + 221122211244626363325464534767668748756767978988996968588875755867566656577763547532353323245443324 33 + 241532435425235552535674564444576465866975867987658575886697775645646467874734565535246546512244511 34 + 003324252512442566553463345787864877859757886699855979689556865965885747456343365533654353244413223 35 + 212315155352232566544737454548674574998798699555866589956966599795788486474536636336336342425134412 36 + 415441242523246256336374766665674457785867567956675565789686897696764587674446666642422423644424325 37 + 003554554162525244354667375865755578679858897996697678587867758755877644755534673566366364215111142 38 + 125233324364265264545556378688676958976975966767698999896779575577774547466453456456443363332524521 39 + 133515233335323373765654467667486986756665797876767877886899897979969475847765767637544446523515551 40 + 423321431443554355375376748446757899656688998798978687676986796699688855776746674753723255464344423 41 + 135533214666522656775554775567665797957679899988997898976779768787598768878445373375735633533152423 42 + 424233114545442654745646856857767575855668667669968786879669768579688844877458655735443652256255431 43 + 122311356255465443775736754747756597959866677969777897778796669799996864878444747533472262262432453 44 + 444412515423634374457557568574698568569796689667999968899788697787968667768664344766546653236143151 45 + 152311513646633365333568844555559779697686687699777998989779788768756594585758837374575424224211225 46 + 432411444656462746443756865787956975798986999787977978996987778795768586656655473453364365634145515 47 + 512553242524235344467755668868885977997876879978998878787888776866887566586456466377353633526612112 48 + 115351124324666765477575484768566785899876668997898988879879687896986577677786744336653645225533134 49 + 521325356522544377445774755666867759866698988779997998778687879779588576866784766376455535443334445 50 + 433451166554445354353554886675567598968878879979777887878988976979689787756548837435743345242455141 51 + 251112342434644676347767747746557587886869778877788877789787767787779598548856756754774536542212331 52 + 255533535452264557543768667886686886969966689777797988888776799775755889645756557644656535253352415 53 + 324425154344254736457678866646677886667896679787789878898879666995998757877665757356457366362624453 54 + 133124434355236446553476678549686757888986787979777777777688968798699766877778645555763233323653111 55 + 222452162524456534544666745659767986569977869888798889797967869896588579678645466757742223536551125 56 + 424113153224246464437444666655586769888767899997999998888899787785789988565667547344466324245444121 57 + 342222535222265477673374467445978889589796696777887788896778866766575958886864746654456432465143345 58 + 343222443646553344666565758455597897568767997897989877768698886656896987444854633767335332566315312 59 + 031554353342263455343465844688566996587977697767668887776787776985778754456646747553435562222553224 60 + 433344426223464443364358688754655656655796979887796696799797776855755885854676557736723432655514323 61 + 013424132332422364434378758577758958968878668787687777668989797955778846555856344635566224523432451 62 + 425553255655633236466566556555858699675969687978968799698978595977567446657483654746364253324544543 63 + 432514124535636275635556647685849565689989686678799779666769657669586678877883365364425535653142315 64 + 234213331454244233774547658465845955685598696976697898886596997865578648447647767565654326321345225 65 + 033142335256632253667547655784646566787758855877679696866998778855965474867574633636266434253231343 66 + 433312355254243222736457466486484557878576698897857857878667659897748755645557367664665624322214245 67 + 414352553244643424464634565857556876595979575859559697897855757678648446474443347476454343621315123 68 + 142445323134524455344767565745845466776955777775867689676669795765547875554364474423523255433452550 69 + 420122443552465225677645453567777645666955697588578797786675779777688864467444476525625534353143351 70 + 013443533555256553426677376778475746848576769888786588999657647784787744733675443533555552342334414 71 + 041143134325455654456573473653567744748677959966765568889765584875786654736746477425243323345412331 72 + 432143141143446546334633656476476747668864878778688989957788768655568457357565474424624643255141123 73 + 433102225554544652566677347757675544755546776854548575485655786465456345347635444252452425412221021 74 + 323443424115135364655624436464533765445864646766688454775574785855547635756475456566323553413444404 75 + 040133323452356462366536677466667655766665575477656846545868855587636377637445452653223313533353431 76 + 112321424255322325434562636744647576545484488884676746485886457756657434733352222326531315442212112 77 + 414000041225332224365336457576353475444476854684468466666787764643346356664452563552325454125532334 78 + 333211225554233356326636546733667664766764488678465547455847554453346674333644366565122142144303010 79 + 201332104431213354534342624674574463634343535468776645455555777363557644444632234452452514524001241 80 + 221121011452151314652546563557737463367364573534653347663557476557753774362253653622553112413343020 81 + 301020124355152323443536262535766773343757377576554465333456475773466764562232455333212154220142002 82 + 322244112312155113454636553224336764436375336773533577673334677767346562553664626122341142230310021 83 + 023103242244551224134442622342463557736536665447475654776476664656746264566536561531213151202033312 84 + 000241244142514451335326646524645362354365656733573556434643567466354436652444155224421243124420312 85 + 211134103233321112311333366243566524426453645455335474755773645624422266326533321441535122300041202 86 + 010100412012005141235135226623364644564632374554665337675444336522352336344211133431343203034321031 87 + 120100431404011341421515543345452262445624345326474644544443332326425454424431513314250240023131303 88 + 302230432233042151414231553363365325522333634334265345542443426352642445554145124343411121104121203 89 + 303233311431323211311335332253563563355242335445366433543356662343656654554132224132234403131422203 90 + 113031120441440344151555331254253525425556245652343434526624622453624343111341315343030233140303323 91 + 113030023221043232305142142324135442534246224522233522334666345254334253143442354430224400423233033 92 + 031102021123340100023323433221314345163424223524353422623255522232122453215412122243144210131021220 93 + 123100111112040244104314311535251111141234335442354234236235354514311422435123332031213231120131013 94 + 221222103112033302010413133424335241315253243263446652241133155434215112225523013040443233102021312 95 + 000012122130221202130324443534215451343511144224113442315342555214421524454224402343214132100123030 96 + 112012230223002044203111222225321532514541153222214115443212344354545231533442344002011210202230120 97 + 221200232013222231032340233141433354514311213113224441111332422254143133440204220101431230200002121 98 + 211212213121303211020441232042142451254444244521121152121224435112515234204202321124222332312210022 99 + 202120032200122003044340422223002041534554215334252122413441432141223402244034330212233311001312221
+2 -2
2022/src/main.rs
··· 1 - use crate::solutions::year_2022::{Day2, Day3, Day4, Day5, Day6, Day7}; 1 + use crate::solutions::year_2022::{Day2, Day3, Day4, Day5, Day6, Day7, Day8}; 2 2 use aoc_lib::Solver; 3 3 pub mod solutions; 4 4 5 5 fn main() { 6 - let sol = Day7::solve_part2(); 6 + let sol = Day8::solve_part2(); 7 7 println!("{:?}", sol); 8 8 }
+185
2022/src/solutions/year_2022/day8.rs
··· 1 + use aoc_lib::{Input, Solver}; 2 + 3 + impl Solver for Day8 { 4 + fn day() -> u8 { 5 + 8 6 + } 7 + 8 + fn solution_part1(input: Input) -> Option<Self::OutputPart1> { 9 + let count = Day8::new(input) 10 + .reduce_grid( 11 + |xs| { 12 + xs.iter() 13 + .map(|x| x.0) 14 + .reduce(|a, b| a || b) 15 + .unwrap_or(false) 16 + }, 17 + true, 18 + ) 19 + .iter() 20 + .filter(|x| **x) 21 + .count(); 22 + 23 + Some(count) 24 + } 25 + 26 + fn solution_part2(input: Input) -> Option<Self::OutputPart2> { 27 + let count = Day8::new(input) 28 + .reduce_grid( 29 + |xs| { 30 + xs.iter() 31 + .map(|x| x.1.len()) 32 + .reduce(|a, b| a * b) 33 + .unwrap_or(1) 34 + }, 35 + 1, 36 + ) 37 + .iter() 38 + .copied() 39 + .max(); 40 + 41 + count 42 + } 43 + 44 + type OutputPart1 = usize; 45 + type OutputPart2 = usize; 46 + } 47 + 48 + #[derive(Debug)] 49 + struct TreesInDirection { 50 + left: Option<Vec<usize>>, 51 + right: Option<Vec<usize>>, 52 + top: Option<Vec<usize>>, 53 + bottom: Option<Vec<usize>>, 54 + } 55 + pub struct Day8 { 56 + grid_expanded: Vec<Vec<(usize, TreesInDirection)>>, 57 + } 58 + 59 + impl Day8 { 60 + fn new(input: Input) -> Self { 61 + let grid: Vec<Vec<usize>> = input 62 + .lines 63 + .iter() 64 + .map(|x| { 65 + x.chars() 66 + .map(|x| x.to_digit(10).unwrap_or(0) as usize) 67 + .collect::<Vec<_>>() 68 + }) 69 + .collect::<Vec<_>>(); 70 + 71 + let grid_expanded: Vec<Vec<(usize, TreesInDirection)>> = grid 72 + .iter() 73 + .enumerate() 74 + .map(|(row, ys)| { 75 + ys.iter() 76 + .enumerate() 77 + .map(|(col, c)| { 78 + let left = col.checked_sub(1).and_then(|co| { 79 + let ys = grid[row].iter().enumerate().take_while(|(i, _)| i <= &co); 80 + if ys.clone().count() == 0 { 81 + None // leftmost 82 + } else { 83 + Some({ 84 + let mut ys = ys.map(|(_, x)| *x).collect::<Vec<_>>(); 85 + ys.reverse(); 86 + ys 87 + }) 88 + } 89 + }); 90 + let right = grid.get(row).and_then(|ys| { 91 + let zs = ys.iter().enumerate().skip_while(|(i, _)| i <= &col); 92 + if zs.clone().count() == 0 { 93 + None // rightmost 94 + } else { 95 + Some(zs.map(|(_, x)| *x).collect()) 96 + } 97 + }); 98 + let top = { 99 + let rn = row.checked_sub(1); 100 + if rn.is_none() { 101 + None // topmost 102 + } else { 103 + rn.map(|t| { 104 + let l = grid.iter().take(t + 1); 105 + let mut xs = 106 + l.map(|cs| *cs.get(col).unwrap_or(&0)).collect::<Vec<_>>(); 107 + xs.reverse(); 108 + xs 109 + }) 110 + } 111 + }; 112 + let bottom = { 113 + let l = grid.iter().skip(row + 1); 114 + if l.len() == 0 { 115 + None // bottommost 116 + } else { 117 + Some(l.map(|cs| *cs.get(col).unwrap_or(&0)).collect()) 118 + } 119 + }; 120 + ( 121 + *c, 122 + TreesInDirection { 123 + left, 124 + right, 125 + top, 126 + bottom, 127 + }, 128 + ) 129 + }) 130 + .collect() 131 + }) 132 + .collect(); 133 + 134 + Day8 { grid_expanded } 135 + } 136 + 137 + fn reduce_grid<F, T: Copy>(&self, f: F, default_value: T) -> Vec<T> 138 + where 139 + F: Fn(Vec<(bool, Vec<usize>)>) -> T, 140 + { 141 + self.grid_expanded 142 + .iter() 143 + .flat_map(|x| { 144 + x.iter().map(|(c, ts)| { 145 + let TreesInDirection { 146 + left, 147 + right, 148 + top, 149 + bottom, 150 + } = ts; 151 + if left.is_none() || right.is_none() || top.is_none() || bottom.is_none() { 152 + default_value 153 + } else { 154 + f(vec![ 155 + check_sides(c, left.clone().unwrap()), 156 + check_sides(c, right.clone().unwrap()), 157 + check_sides(c, top.clone().unwrap()), 158 + check_sides(c, bottom.clone().unwrap()), 159 + ]) 160 + } 161 + }) 162 + }) 163 + .collect::<Vec<_>>() 164 + } 165 + } 166 + 167 + fn check_sides(c: &usize, xs: Vec<usize>) -> (bool, Vec<usize>) { 168 + let (b, xs, _) = xs.iter().fold( 169 + (true, vec![], false), 170 + |(b, mut acc, is_done): (bool, Vec<usize>, bool), x| { 171 + if c > x && b { 172 + if !is_done { 173 + acc.push(*x); 174 + } 175 + (true, acc, false) 176 + } else { 177 + if !is_done { 178 + acc.push(*x); 179 + } 180 + (false, acc, true) 181 + } 182 + }, 183 + ); 184 + (b, xs) 185 + }
+2
2022/src/solutions/year_2022/mod.rs
··· 5 5 mod day5; 6 6 mod day6; 7 7 mod day7; 8 + mod day8; 8 9 pub(crate) use day1::*; 9 10 pub(crate) use day2::*; 10 11 pub(crate) use day3::*; ··· 12 13 pub(crate) use day5::*; 13 14 pub(crate) use day6::*; 14 15 pub(crate) use day7::*; 16 + pub(crate) use day8::*;