Solve 2021/09

master
Alfred Melch 3 years ago
parent 50812b3890
commit 5b973ddf86

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "day09"
version = "0.1.0"

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

@ -0,0 +1,46 @@
https://adventofcode.com/2021/day/9
## \--- Day 9: Smoke Basin ---
These caves seem to be [lava tubes](https://en.wikipedia.org/wiki/Lava_tube).
Parts are even still volcanically active; small hydrothermal vents release
smoke into the caves that slowly settles like rain.
If you can model how the smoke flows through the caves, you might be able to
avoid it and be that much safer. The submarine generates a heightmap of the
floor of the nearby caves for you (your puzzle input).
Smoke flows to the lowest point of the area it's in. For example, consider the
following heightmap:
[code]
2 _1_ 9994321 _0_
3987894921
98 _5_ 6789892
8767896789
989996 _5_ 678
[/code]
Each number corresponds to the height of a particular location, where `9` is
the highest and `0` is the lowest a location can be.
Your first goal is to find the _low points_ \- the locations that are lower
than any of its adjacent locations. Most locations have four adjacent
locations (up, down, left, and right); locations on the edge or corner of the
map have three or two adjacent locations, respectively. (Diagonal locations do
not count as adjacent.)
In the above example, there are _four_ low points, all highlighted: two are in
the first row (a `1` and a `0`), one is in the third row (a `5`), and one is
in the bottom row (also a `5`). All other locations on the heightmap have some
lower adjacent location, and so are not low points.
The _risk level_ of a low point is _1 plus its height_. In the above example,
the risk levels of the low points are `2`, `1`, `6`, and `6`. The sum of the
risk levels of all low points in the heightmap is therefore `_15_`.
Find all of the low points on your heightmap. _What is the sum of the risk
levels of all low points on your heightmap?_

@ -0,0 +1,5 @@
2 _1_ 9994321 _0_
3987894921
98 _5_ 6789892
8767896789
989996 _5_ 678

@ -0,0 +1,100 @@
3498899019878754677899876434987898910234679986778932468999412767899921249978987543456799987899987876
4597678929765833445943989759976567891465798765869893459997323459999890198767898792347899876999876645
9986567898654421237891094998765347976587987663656789598986537568998789397646999989499998765899865434
8763456799543210948942123999654236897799876542345699987987656789987658989534789879987899986789996323
9852165987654399899653439899954345679899988651234799895698967899896547678965698767996789498896987534
7541034598765989789864598789865466789998798742398986744569878998765432567896789459875489699954598976
5432123459879875678975798677976567997897659876567895432979999549898543456789992359876578976543239987
6543334599989954567896987556988678956798543987678986759898989921987676567893210123987799989876136799
8654456789999843456789875445999989239987562398989099898787678899898797688954321254599893498964345689
9875598899988732347898654333878992198765421239699124987685457789759899789875434675679901987895496793
2986789999876521456987543212668943019843210134568949986545345697545999899986545786789929876789989932
1987998798765435587896432101457892198767521235679998697632158789434589999987656799999899965396879321
0299899659876656678987545232345793899899432349789876598794377895323478998798867988989789654245568910
1298778943987887889998654353476965789976545498990997469876456789212567896569879877875678965123457891
2979667892398999998998765467987899896989769987991984367989767994346789965456998766434789996534968932
9867458943489023457899976699798999935799898956789875457999879976557898654356789954321246789649899543
7654347895678934668901989789559789424589987645698989598989991397968997655246699865310137898659797665
9765236896789549789542999896445696537679896435787897699678992989899876442123469954323245998798679789
9896144589899998997659898991234589648998765323676798789567989878789989321012398767454356899897598999
6941023478999867898798787889945678959899994212545699895429876767679998992534569898768769986996456789
5432124567989756789898656667896789998789789301234589997698765654598977989645678999899978975987867899
6553734679876545899997543556789893987674679912547678998987654423987865678959889996945989964598998998
7696545989997656789987632345899932398543467894758989899876543319876434567896999985436799893239989987
8987656899998967893098641012799541987656878976769998767987432109965323458945678977321298789549878966
9399897978999878932159892323678992399787989497878999654597644298764212969434767965410989678959769345
1298969459986989543246993934568989459898991298989899543459756789872101894325457894329877567897657239
2987654349895498754347989896679678967999432989796798432349897999989237789212399965698765435689642128
9899765459679999899499876789894569999998999876655987321234998999994345678924987897987654323899951037
9765989998567899998989924678943456987897978965434595210123489998765456789434976789999766445999872156
9834599887456789887978913459652349876566467899323984321235678999876867896559875689999878576789653245
8945798765387898765459904589101259865454348678919876533546789999998978997997654677895989687999877656
7896999643228999876246895678912346965321234589323989854689899987799989989876543456964598798934988767
6989898954019987542134989789924956987540455695456798765789999875689997878987651348976799899127699978
5876797892123498431013778999875789998432567897978899979897899954578986768998910256899987977934569989
4345676889234599545124567898976990976545778989899999989956598768678965456789321345698786556899698792
3257345678945987656234579976999891987657889679789998797643459879789874345895432566987675345998976543
2101234689656998764346889345789799998768996598699987698764769998999985456976543456989554234767897794
3212345699987899885456793219897678899889865487589997569879898987999876869899676579975433123456789999
5333459999898989876567899398923456789999654396467895456989987986789989998798987898754321012345998798
7569998789799876989688998987934567994598763212356789347597896565678998987677898989865432124456789697
8698889676689999898799987756895678979999854323767892123456998424799986976545799979879753234578994556
9987674565578998769899976548789789459889876434789943254569876534999875568925689769998764345699543434
9876543234467899656998767434678999398768976545678954565879987695789954321014578957889885456989432323
1987652102345678943239654323489988999544987796789765776989698986898766535123489945679976769978921012
0199863243458999453198765464599767898432098989899879887993569997909877645234567896798989998767892523
9239954867567954321099986765678956987643129878901991998921345998912998784345678989987698765452679434
8998767898689765692987987876789545698754298767899892359210167899439999895567899778996579876321567999
7899878998799876989875598999899959798767987656789789459321379997698987987678965656889456985432345678
6895989469902997976753459899999898999879876545345678998932998999987696799889654345678999976569496789
5694398979899889765442356789398787899996999631234789877899887899876565679998767976789988997998989994
3789457898798678954321467892197676789975698742649895756798796796543434568999898987899967989987879893
4567967987656567965435698989986545678954987653458954247986545965432123457998989298989855679875658789
7689878998943456896546789679876434589543398954567932123965437896543437689986679019876744598654345696
8789989999732345989687894598764323678932198768799899439876545987859549898775568999865432987643256795
9991099987621265778998943569843212367893349879898798945987687899998956798654348789886540198732134894
9989129876540124567979964579976301456789459989989667896798789945987897899886234598765431469543456902
9878939986521569879769875798765412348996598998976456789899893239896689998765495679986562359876587893
8769898765432478989654986969876523657899987697654367896934991098765568999886788797987679767989698954
7659769876546599697923999853987798769998765498765478945795989139954457899997899896598899898999899995
7649853987658943466899899764799899878909964349876567899979878998732356789998945997439934959789996986
6534954599767892355998798765679934989219875656987978998968967789540245699999659986321012345698785497
5429765679878910234597659878794325299924998787898989997956545678954357999898798765432129596987654329
3212987794989321296789543989943210199895989899959799976844234569765456789789999976573298989898843212
3101498943495433387997642396794321989789875935345679865432143568976789997657989899954987879789943209
4212349932398544499896521345689439778678954321236789987545012379899899754349879767899896768678999998
4363457893987659598789432467896598653578965432447892399653123456792998965598765456789765454579988787
9456789954598998987679943598987989432345696643456890198764334569891987897899894323898754323459879656
8769899866789997656567894789998976545456789754567899239895456678999865679999989219989843212398765545
9997998988999876543456789898789998666567999765679978945976578989987654567979678998765432101987654234
9886797999498765432326678987678899898678978976789669957897689999876543568964569999986954312398765101
9765656789319854321014567896566789979989767897893459898998797999998662789543467892199875429459893212
7654545678998765432123459975445698654393456789912399789019896798987653497651498993246976598999954343
8943234567929876543275678954323459543212767893201988689323987987798765689320239789345987976789876458
9895395678912989654586789995445668986543468954329876578939999876549876795432445678967899875345987967
8796989989101292986797899987856899997854578965934985467898898765432998997544556789878986543234599898
7679979893212391097898968998967899998765678979899876328246789986521019789678967898999598632123498799
6598767789324989998929459999998999879876899998798765410135690198745123678989878967965439643245987689
5432545689939878899102399898789998965987999987659876721248791987656234567899989656896019865459976578
4321234567899767789293989765698987894299689998743987533367989998754345678999991347992139876798765469
3210355879999645678989978974987876989103569879651987544569878999876556799778930456789246998999864345
4323796789878924567977567895986645879212398765510198656789969899987667894569321367894356979987543234
6435697896567895979865457989995434567923999864323498767899656789798798923498936568965469865698965676
9876789923456896893974345678976312459899898765434569898998767896679899014567899689876598754349876789
9987895312345797954985657789875401346789799877555678999439898934599984323678998796998789743210989896
7899986453456998969876767893986212468998678988669899878924999623459876544567929965349899655439898965
6432097568967899978987889901297326579765459599778965767895989510569998697678909893234987996598767464
6593198789898945899899997892398438989899679499989954655689879431458798789789998789399656789679955353
9989349999769236798789486899459549992998792987699893244588968942345679899899857678988745898798843212
8878959898954126797678365678998757891369990996548789123467957793459798910998743569976324999987654523
7967899767893235986543234769999898990156789875437678965678945689598987892987632457895436789998787634
5456998656994467897652123456893969789245698765323569896789234579987696789765421346789597899869898745
4349876545989578999653245767892345679367899972103456789892124569876554998653210145699989997654949856
3234987439878989398769356978901956789878999864212389899943434598765432359986321234899878976543234987
2136796545967893219898967899899897991989789974363478999854545998654321239875434345998767975432124598
6545987659878999423987998999776799890195698765455569298765669899766510129876589456789656896594234599
7659899867999988939876789988645698799234589876566689129879898769854321234987676567899545699989995678
9998654978989877898765899876434789678945678987679791012989987655987642345698987899998732488979789789
9876543989876865789996999995321234567896889798789895423497896543499873486789999978987521267965678990
2995432598765934456789398765452345689997897659892986434986987632198764678999876569876410149894569521
1986543497654321345891239976563456893198976543901296549765498743459876789101983469865321235789789433

@ -0,0 +1,177 @@
use std::collections::HashSet;
use std::io::stdin;
use std::io::BufRead;
fn main() {
let arg = std::env::args().nth(1).unwrap_or("part2".to_string());
match arg.as_str() {
"part1" => part1(),
_ => part2(),
}
}
fn part1() {
println!("Part 1");
let mut numbers = Vec::new();
let mut width = 0;
let mut height = 0;
for line in stdin().lock().lines() {
let line = line.unwrap().replace(" ", "").replace("_", "");
width = line.len();
println!("{}", line);
let mut parsed: Vec<u8> = line
.chars()
.map(|c| c.to_string().parse().unwrap())
.collect();
numbers.append(&mut parsed);
height += 1;
}
dbg!(width, height);
let field = Field::new(numbers, width, height);
let mut risk_level: i32 = 0;
for x in 0..height {
for y in 0..width {
let value = field.get((x, y));
let neighbors = field.neighbors((x, y));
if neighbors.iter().all(|&n| n > value) {
risk_level += 1 + *value as i32;
print!("\x1b[31m{}\x1b[0m", value);
} else {
print!("{}", value);
}
}
println!();
}
dbg!(risk_level);
}
fn part2() {
println!("Part 2");
let mut numbers = Vec::new();
let mut width = 0;
let mut height = 0;
for line in stdin().lock().lines() {
let line = line.unwrap().replace(" ", "").replace("_", "");
width = line.len();
println!("{}", line);
let mut parsed: Vec<u8> = line
.chars()
.map(|c| c.to_string().parse().unwrap())
.collect();
numbers.append(&mut parsed);
height += 1;
}
dbg!(width, height);
let field = Field::new(numbers, width, height);
let mut basin_sizes = Vec::new();
for x in 0..height {
for y in 0..width {
let value = field.get((x, y));
let neighbors = field.neighbors((x, y));
if neighbors.iter().all(|&n| n > value) {
basin_sizes.push(field.basin_size((x, y)));
print!("\x1b[31m{}\x1b[0m", value);
} else if *value == 9 {
print!("\x1b[33m{}\x1b[0m", value);
} else {
print!("\x1b[37m{}\x1b[0m", value);
}
}
println!();
}
basin_sizes.sort();
dbg!(&basin_sizes);
let solution = basin_sizes.iter().rev().take(3).fold(1, |acc, el| acc * el);
dbg!(solution);
}
struct Field {
width: usize,
height: usize,
numbers: Vec<u8>,
}
impl<'a> Field {
fn new(numbers: Vec<u8>, width: usize, height: usize) -> Field {
Field {
width,
height,
numbers,
}
}
fn get(&'a self, pos: (usize, usize)) -> &'a u8 {
let (x, y) = pos;
let idx = x * self.width + y;
self.numbers.get(idx).unwrap()
}
fn neighbor_coords(&'a self, pos: (usize, usize)) -> Vec<(usize, usize)> {
let (x, y) = pos;
let mut coords = Vec::new();
let is_top = x == 0;
let is_bot = x == self.height - 1;
let is_left = y % self.width == 0;
let is_right = (y + 1) % self.width == 0;
if !is_top {
coords.push((x - 1, y));
}
if !is_bot {
coords.push((x + 1, y));
}
if !is_left {
coords.push((x, y - 1))
}
if !is_right {
coords.push((x, y + 1))
}
coords
}
fn neighbors(&'a self, pos: (usize, usize)) -> Vec<&'a u8> {
self.neighbor_coords(pos)
.iter()
.map(|&pos| self.get(pos))
.collect()
}
fn basin_size(&self, pos: (usize, usize)) -> i32 {
let mut size = 0;
let mut coords_to_check = HashSet::new();
let mut coords_checked = HashSet::new();
coords_to_check.insert(pos);
while !coords_to_check.is_empty() {
let pos = *coords_to_check.iter().next().unwrap();
coords_to_check.remove(&pos);
coords_checked.insert(pos);
if *self.get(pos) == 9 {
continue;
}
size += 1;
let neighbor_set = HashSet::from_iter(self.neighbor_coords(pos));
coords_to_check.extend(&neighbor_set - &coords_checked);
// for neighbor in self.neighbor_coords(pos) {
// if !coords_checked.contains(neighbor){
// coords_to_check.add(neighbor)
// }
// }
}
size
}
}
Loading…
Cancel
Save