Adds day 10
This commit is contained in:
parent
8c116cb59a
commit
56219c16ac
59
resources/input10.txt
Normal file
59
resources/input10.txt
Normal 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
125
src/days/day10.rs
Normal 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;
|
@ -24,7 +24,7 @@ pub mod day6;
|
|||||||
pub mod day7;
|
pub mod day7;
|
||||||
pub mod day8;
|
pub mod day8;
|
||||||
pub mod day9;
|
pub mod day9;
|
||||||
|
pub mod day10;
|
||||||
pub mod day14;
|
pub mod day14;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -13,6 +13,7 @@ use day6::Day6;
|
|||||||
use day7::Day7;
|
use day7::Day7;
|
||||||
use day8::Day8;
|
use day8::Day8;
|
||||||
use day9::Day9;
|
use day9::Day9;
|
||||||
|
use day10::Day10;
|
||||||
use day14::Day14;
|
use day14::Day14;
|
||||||
|
|
||||||
|
|
||||||
@ -51,7 +52,7 @@ fn main() -> Result<(), AdventError> {
|
|||||||
Box::new(Day7::new()),
|
Box::new(Day7::new()),
|
||||||
Box::new(Day8::new()),
|
Box::new(Day8::new()),
|
||||||
Box::new(Day9::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()),
|
Box::new(DummyDay::new()),
|
||||||
Box::new(DummyDay::new()),
|
Box::new(DummyDay::new()),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user