diff --git a/resources/input10.txt b/resources/input10.txt new file mode 100644 index 0000000..92c55ed --- /dev/null +++ b/resources/input10.txt @@ -0,0 +1,59 @@ +10101129874567650034554321210765017892103407621078938900189 +25410056783218921125667210329834123765212518542362347612276 +36321141094303212986768011234123434354307629030451056543345 +47898232198701203479829323105012985894398438121267787012436 +56217659654654312563219453276983876783210567236358998743434 +54306148723343101014508764987878765654234500345443467654323 +45678034014546512425678755676779654342149611236912018941010 +30089121223467432338769101238988701289038723947801024562167 +21123210310598301449843212345679654374349654854383433873478 +39654303489621236556752101054541021265238765763298512901569 +78745414548710567845667698767632090780149459870187607832608 +69856789654789678956768907458952185699012343221545696543210 +54363898723652101349877812364343674018761450123456787654329 +23014578710503201231236587651254563023450761212101698765438 +10123669765414734320345698540160122198989810301032001894347 +03278754894325895610798701232873278987610167450123110983856 +14589343201286766778876534501994567876541258565874223672987 +45673498101898679869905425672887654301432349876965344521076 +67812567432763289752112310980569503452352210909879859652165 +56901056561654176543098723021078912348761232118701768701254 +65430145670323075212787032134567821059850141027632363212343 +50321232987214789100654123299851018968943256934546578921084 +21272101456105674101543234386798327877012367886757689872398 +18989872356796543232344335675647456965438943898898510765467 +09876965449887650198754326034556455540127652107001423451056 +12365054335678012267960012120345369834568941056122345432345 +01454101224589833457871457651234278923478930349234216781056 +12343232113074321012902368765445107610100121238543001894343 +87636549002155692101211079612301278543201056747652189801234 +98545678456766781012923985509210569430210149876343678900541 +01234012389858943223874346678327898121341234765454563219610 +76105654672107654114565287665456765023458985876312154398721 +85678783543765103005010196512349894311267876901203098989430 +94569892101894319876120123405432001200398701878714567876549 +03210712232101223965431893696501120165453212569210103478958 +12307803212101494367646764787017635676562343454320232167667 +05456954301092385458125655690198544387651458981011241056541 +34565766542389476329034504321239732298940567672454356787430 +23874897433476565016543213898369801107432398543963967898721 +10983218923567874387632012567456741016501476543876876987654 +32654103210898961298921253432125430323478987432101476898543 +01789034506781450101010765893036721217865430301212385301412 +32109127675650361215432894734589894306923421678903494212303 +47898008984321278926941323655678345645014984589876523424321 +56567211012454165437810015543067236732105873101017014735670 +35654343203763010121732104562170147899876562102328985898789 +43021052104892345430645243876783450147890412985403454587658 +52134569915651096584596432965692761236321309876012963210567 +67245678876720987893087341054301874345410214767623874789410 +78996567369812346782176016543210965634321323698501945674323 +89487601232109855693876127433456534565401214545432016323454 +78321032583098764102965438122167321876312300434332125412343 +65410545694567823211234349021098930989205421225649567507654 +78923210783245910340165452110187343232196510310758498678943 +67654569632156721451076326789543210143087893427867310987632 +76543678541043897569989015673434507654076596510901223898541 +89434105630012798178898724512523698723129887325877836767630 +90121234789410567016721013009618789610438798456756945478921 +81010389874323454325430122118709876321567012349843210521010 \ No newline at end of file diff --git a/src/days/day10.rs b/src/days/day10.rs new file mode 100644 index 0000000..bd31526 --- /dev/null +++ b/src/days/day10.rs @@ -0,0 +1,125 @@ +use std::path::Path; + +use advent_derive::advent_day; +use itertools::Itertools; +use itertools::iproduct; + +use crate::{error::AdventError, input::read_into_vec}; +use super::*; + + +struct Part1 { + grid: Vec>, + width: usize, + height: usize +} + +impl Part1 { + fn new() -> Self { + Self { + grid: vec![], + width: 0, + height: 0 + } + } +} + +type Part2 = Part1; + + +fn read_input_part1(part1: &mut Part1, path: &Path) -> Result<(), AdventError> { + part1.grid = read_into_vec::(path)?.iter().map(|s| { + s.chars().map(|c| c.to_digit(10).unwrap() as u8).collect::>() + }).collect::>>(); + part1.width = part1.grid[0].len(); + part1.height = part1.grid.len(); + Ok(()) +} + +fn solve_part1(part1: &mut Part1) -> Result { + let mut trail_heads = vec![]; + for y in 0..part1.height { + for x in part1.grid[y].iter().positions(|h| *h == 0) { + trail_heads.push((x, y)); + } + } + let mut answer = 0; + for trail_head in trail_heads.into_iter() { + let mut trails = vec![trail_head]; + for i in 0..9 + { + let mut new_trails = vec![]; + + for (x, y) in trails.iter() { + let reachable = generate_reachable(&part1, (*x, *y)); + let reachable_step = reachable.into_iter().filter(|(nx, ny)| { + part1.grid[*ny][*nx] == i+1 + }).collect::>(); + for x in reachable_step.into_iter() { + new_trails.push(x); + } + } + trails = new_trails; + } + answer += trails.iter().unique().count() + } + + Ok(answer.to_string()) +} + +fn generate_reachable(part1: &Part1, grid_point: (usize, usize)) -> Vec<(usize, usize)> { + let (x, y) = grid_point; + let mut x_coords = vec![]; + let mut y_coords = vec![]; + if x > 0 { + x_coords.push(x-1) + } + if x < part1.width - 1 { + x_coords.push(x+1); + } + if y > 0 { + y_coords.push(y-1) + } + if y < part1.height - 1 { + y_coords.push(y+1); + } + iproduct!(x_coords.into_iter(), vec![y].into_iter()).chain(iproduct!(vec![x].into_iter(), y_coords.into_iter())).collect::>() +} + +fn read_input_part2(part2: &mut Part2, path: &Path) -> Result<(), AdventError> { + read_input_part1(part2, path) +} + +fn solve_part2(part2: &mut Part2) -> Result { + let mut trail_heads = vec![]; + for y in 0..part2.height { + for x in part2.grid[y].iter().positions(|h| *h == 0) { + trail_heads.push((x, y)); + } + } + let mut answer = 0; + for trail_head in trail_heads.into_iter() { + let mut trails = vec![trail_head]; + for i in 0..9 + { + let mut new_trails = vec![]; + + for (x, y) in trails.iter() { + let reachable = generate_reachable(&part2, (*x, *y)); + let reachable_step = reachable.into_iter().filter(|(nx, ny)| { + part2.grid[*ny][*nx] == i+1 + }).collect::>(); + for x in reachable_step.into_iter() { + new_trails.push(x); + } + } + trails = new_trails; + } + answer += trails.iter().count() + } + + Ok(answer.to_string()) +} + +#[advent_day(Part1, Part2)] +struct Day10; diff --git a/src/days/mod.rs b/src/days/mod.rs index 26c8eb3..c790524 100644 --- a/src/days/mod.rs +++ b/src/days/mod.rs @@ -24,7 +24,7 @@ pub mod day6; pub mod day7; pub mod day8; pub mod day9; - +pub mod day10; pub mod day14; /* diff --git a/src/main.rs b/src/main.rs index 0cfd35b..e4ce6c8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ use day6::Day6; use day7::Day7; use day8::Day8; use day9::Day9; +use day10::Day10; use day14::Day14; @@ -51,7 +52,7 @@ fn main() -> Result<(), AdventError> { Box::new(Day7::new()), Box::new(Day8::new()), Box::new(Day9::new()), - Box::new(DummyDay::new()), + Box::new(Day10::new()), Box::new(DummyDay::new()), Box::new(DummyDay::new()), Box::new(DummyDay::new()),