Adds day 10

This commit is contained in:
Dennis Brentjes 2025-02-28 18:15:13 +01:00
parent 8c116cb59a
commit 56219c16ac
4 changed files with 187 additions and 2 deletions

59
resources/input10.txt Normal file
View File

@ -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

125
src/days/day10.rs Normal file
View File

@ -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<Vec<u8>>,
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::<String>(path)?.iter().map(|s| {
s.chars().map(|c| c.to_digit(10).unwrap() as u8).collect::<Vec<u8>>()
}).collect::<Vec<Vec<u8>>>();
part1.width = part1.grid[0].len();
part1.height = part1.grid.len();
Ok(())
}
fn solve_part1(part1: &mut Part1) -> Result<String, AdventError> {
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::<Vec<(usize, usize)>>();
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::<Vec<(usize, usize)>>()
}
fn read_input_part2(part2: &mut Part2, path: &Path) -> Result<(), AdventError> {
read_input_part1(part2, path)
}
fn solve_part2(part2: &mut Part2) -> Result<String, AdventError> {
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::<Vec<(usize, usize)>>();
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;

View File

@ -24,7 +24,7 @@ pub mod day6;
pub mod day7;
pub mod day8;
pub mod day9;
pub mod day10;
pub mod day14;
/*

View File

@ -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()),