Solved day 10
This commit is contained in:
52
input/day10.txt
Normal file
52
input/day10.txt
Normal file
@@ -0,0 +1,52 @@
|
||||
5678543238765121087216787432128921016563210454323433
|
||||
4169654119654037892107894549017430457654782369412812
|
||||
3018767001843246543210787678186543368945691078908903
|
||||
2189678914980158934345698187098901275632100165001894
|
||||
3434589125678767891016521096167872984789321874112765
|
||||
7823678034569876780123434545252766543215476903233456
|
||||
6910167012423495679654321032341057630306985012945101
|
||||
5401986543410584508765678211352348921437894123876298
|
||||
4323877892543673210104569300235496530890123434565387
|
||||
3210967871652598789213075410145687432765210123432456
|
||||
0101454960701659654322186703456710101854321076501201
|
||||
1012343459898741023763099812769823478923212987655652
|
||||
4323012321101232212854210129876012569012503234234743
|
||||
5011001410765540101940110238787112876503414105109892
|
||||
6722340543894691001233221045698108976434565696589321
|
||||
9821059652023782317874536789587012885325676787678780
|
||||
9778968701110678498965945893496543494018989801210690
|
||||
8769878889231589567767893672109824323561234892309541
|
||||
1454399998342490430850104589678012012370348763458032
|
||||
0141287107654321521943213212565503123987659654567123
|
||||
1230236256565410101237870101419654598543210508948910
|
||||
2340145348978321253210965432308765687696501417654323
|
||||
3986501567899010344789876323219454766787432321078890
|
||||
5677432450987432455670189410012349845696501434569701
|
||||
0548901321976501964563208231987210036723109621435652
|
||||
1239678100823457877854010145676210129814918730898543
|
||||
4310369234710165756905423210122305610905825623567678
|
||||
3423456765600874543814554761201456723876734514410569
|
||||
2102109894321984562323669854398556894985232305320438
|
||||
3076521003965433871234778034567647895894101476761023
|
||||
4585412312870122930129872129867634456783230585872310
|
||||
5694303456781211123123401256798521065656187694965432
|
||||
6783201019892100054076540346543438980521090123456501
|
||||
0340112387653456963981639457832523671439876101219602
|
||||
1258903490144327870190128768901214512112725614308712
|
||||
2569876589231016983278787434980108903003014525456893
|
||||
1876767676546781074349896523076587654394523496327854
|
||||
0945778789035690165234765014123496543487621087018969
|
||||
1239869876124789234105676543287017012567634589829678
|
||||
9018756765453210785411085010196528921298565676543549
|
||||
8723605034301305696532398923483437430143476589762138
|
||||
7634514125212154387783437654589016521052187679854023
|
||||
6501323896521093210598568943078723632367098512763210
|
||||
7432454787436789765677678732189654045458963403892001
|
||||
8901343474345658894389589823476902102167872354301123
|
||||
7623676543216743001210438214567813458054961065689054
|
||||
5012389012109812123309321301054324569123452876548765
|
||||
4589438729001901014578010102344567078212556989231076
|
||||
3676567438782342145665430230133898167901665476102989
|
||||
2109652145699654398765421321212101237810174345603478
|
||||
1078743034328765219876323478903894376521089298714565
|
||||
2167634145410898701101210569816765489432100107623434
|
||||
8
input/day10_example.txt
Normal file
8
input/day10_example.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
89010123
|
||||
78121874
|
||||
87430965
|
||||
96549874
|
||||
45678903
|
||||
32019012
|
||||
01329801
|
||||
10456732
|
||||
108
src/day10.rs
Normal file
108
src/day10.rs
Normal file
@@ -0,0 +1,108 @@
|
||||
use crate::day_solver::DaySolver;
|
||||
#[cfg(test)]
|
||||
use crate::util::read_file;
|
||||
use crate::util::{Coord, Grid};
|
||||
use itertools::Itertools;
|
||||
use std::collections::HashSet;
|
||||
|
||||
pub struct Day10 {
|
||||
map: Grid<u8>
|
||||
}
|
||||
|
||||
impl Day10 {
|
||||
|
||||
pub fn create(input: String) -> Self {
|
||||
Day10 {
|
||||
map: Grid {
|
||||
data: input.lines().join("").chars().map(|c| (c as u8) - b'0').collect(),
|
||||
width: input.lines().next().unwrap().len(),
|
||||
default: Some(255)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn calculate_score(&self, trailhead: Coord<usize>) -> usize {
|
||||
// Since paths have an even, gradual, uphill slope, we can just go up in height and see what we can reach
|
||||
let mut last_layer: HashSet<Coord<usize>> = HashSet::new();
|
||||
last_layer.insert(trailhead);
|
||||
|
||||
for h in 1..10 {
|
||||
let mut cur_layer = HashSet::new();
|
||||
for pos in last_layer.clone() {
|
||||
// Check which neighbors are height h
|
||||
if self.map.get(pos.x + 1, pos.y) == &h { cur_layer.insert(Coord::new(pos.x + 1, pos.y)); };
|
||||
if pos.x > 0 && self.map.get(pos.x - 1, pos.y) == &h { cur_layer.insert(Coord::new(pos.x - 1, pos.y)); };
|
||||
if self.map.get(pos.x, pos.y + 1) == &h { cur_layer.insert(Coord::new(pos.x, pos.y + 1)); };
|
||||
if pos.y > 0 && self.map.get(pos.x, pos.y - 1) == &h { cur_layer.insert(Coord::new(pos.x, pos.y - 1)); };
|
||||
}
|
||||
last_layer = cur_layer;
|
||||
}
|
||||
|
||||
last_layer.len()
|
||||
}
|
||||
|
||||
fn update_pos(&self, new_x: usize, new_y: usize, target_height: &u8, cur_paths_to_pos: usize, cur_layer: &mut HashSet<Coord<usize>>, paths_to_pos: &mut Grid<usize>) {
|
||||
|
||||
if self.map.get(new_x, new_y) == target_height {
|
||||
cur_layer.insert(Coord::new(new_x, new_y));
|
||||
paths_to_pos.set(new_x, new_y, paths_to_pos.get(new_x, new_y) + cur_paths_to_pos);
|
||||
}
|
||||
}
|
||||
|
||||
fn calculate_score_pt2(&self, trailhead: Coord<usize>) -> usize {
|
||||
|
||||
let mut last_layer: HashSet<Coord<usize>> = HashSet::new();
|
||||
last_layer.insert(trailhead);
|
||||
|
||||
let mut paths_to_pos: Grid<usize> = Grid {
|
||||
data: vec![0; self.map.data.len()],
|
||||
width: self.map.width,
|
||||
default: Some(0),
|
||||
};
|
||||
paths_to_pos.set(trailhead.x, trailhead.y, 1);
|
||||
|
||||
for h in 1..10 {
|
||||
let mut cur_layer = HashSet::new();
|
||||
for pos in last_layer.clone() {
|
||||
let cur_paths_to_pos = paths_to_pos.get(pos.x, pos.y).to_owned();
|
||||
self.update_pos(pos.x + 1, pos.y, &h, cur_paths_to_pos, &mut cur_layer, &mut paths_to_pos);
|
||||
if pos.x > 0 { self.update_pos(pos.x - 1, pos.y, &h, cur_paths_to_pos, &mut cur_layer, &mut paths_to_pos); };
|
||||
self.update_pos(pos.x, pos.y + 1, &h, cur_paths_to_pos, &mut cur_layer, &mut paths_to_pos);
|
||||
if pos.y > 0 { self.update_pos(pos.x, pos.y - 1, &h, cur_paths_to_pos, &mut cur_layer, &mut paths_to_pos); };
|
||||
|
||||
}
|
||||
last_layer = cur_layer;
|
||||
}
|
||||
|
||||
last_layer.iter().map(|l| paths_to_pos.get(l.x, l.y)).sum()
|
||||
}
|
||||
}
|
||||
|
||||
impl DaySolver for Day10 {
|
||||
|
||||
|
||||
fn solve_part1(&mut self) -> String {
|
||||
self.map.find_positions(&|d| d == &0)
|
||||
.map(|c| self.calculate_score(c))
|
||||
.sum::<usize>().to_string()
|
||||
|
||||
}
|
||||
|
||||
fn solve_part2(&mut self) -> String {
|
||||
self.map.find_positions(&|d| d == &0)
|
||||
.map(|c| self.calculate_score_pt2(c))
|
||||
.sum::<usize>().to_string()
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part1() {
|
||||
let mut day = Day10::create(read_file("input/day10_example.txt"));
|
||||
assert_eq!("36", day.solve_part1());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part2() {
|
||||
let mut day = Day10::create(read_file("input/day10_example.txt"));
|
||||
assert_eq!("81", day.solve_part2());
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
extern crate core;
|
||||
|
||||
use std::time::Instant;
|
||||
use crate::day10::Day10;
|
||||
use crate::day1::Day1;
|
||||
use crate::day2::Day2;
|
||||
use crate::day3::Day3;
|
||||
@@ -24,6 +25,7 @@ mod day6;
|
||||
mod day7;
|
||||
mod day8;
|
||||
mod day9;
|
||||
mod day10;
|
||||
|
||||
const DEFAULT_BENCHMARK_AMOUNT: u32 = 100;
|
||||
|
||||
@@ -104,7 +106,7 @@ fn build_day_solver(day: u8, input: String) -> Option<Box<dyn DaySolver>> {
|
||||
7 => Some(Box::new(Day7::create(input))),
|
||||
8 => Some(Box::new(Day8::create(input))),
|
||||
9 => Some(Box::new(Day9::create(input))),
|
||||
// 10 => Some(Box::new(Day10::create(input))),
|
||||
10 => Some(Box::new(Day10::create(input))),
|
||||
// 11 => Some(Box::new(Day11::create(input))),
|
||||
// 12 => Some(Box::new(Day12::create(input))),
|
||||
_ => None
|
||||
|
||||
Reference in New Issue
Block a user