day(13): add solution
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
dab87eeb22
commit
327a2d1df4
2 changed files with 103 additions and 0 deletions
15
samples/day13.txt
Normal file
15
samples/day13.txt
Normal file
|
@ -0,0 +1,15 @@
|
|||
#.##..##.
|
||||
..#.##.#.
|
||||
##......#
|
||||
##......#
|
||||
..#.##.#.
|
||||
..##..##.
|
||||
#.#.##.#.
|
||||
|
||||
#...##..#
|
||||
#....#..#
|
||||
..##..###
|
||||
#####.##.
|
||||
#####.##.
|
||||
..##..###
|
||||
#....#..#
|
88
src/bin/day13.rs
Normal file
88
src/bin/day13.rs
Normal file
|
@ -0,0 +1,88 @@
|
|||
use std::cmp::min;
|
||||
|
||||
use aoc_2023::*;
|
||||
use itertools::iproduct;
|
||||
|
||||
type Output1 = i32;
|
||||
type Output2 = Output1;
|
||||
|
||||
struct Pattern {
|
||||
map: Vec<Vec<char>>,
|
||||
}
|
||||
|
||||
impl From<&[String]> for Pattern {
|
||||
fn from(value: &[String]) -> Self {
|
||||
Self {
|
||||
map: value.iter().map(|l| l.chars().collect_vec()).collect_vec(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Pattern {
|
||||
fn check_vertically(&self, allowed_error: usize) -> Option<i32> {
|
||||
(0..self.map[0].len() - 1)
|
||||
.find(|&x| {
|
||||
let d = min(x + 1, self.map[0].len() - x - 1);
|
||||
|
||||
iproduct!(0..self.map.len(), (0..d))
|
||||
.filter(|&(y, dx)| self.map[y][x - dx] != self.map[y][x + dx + 1])
|
||||
.count()
|
||||
== allowed_error
|
||||
})
|
||||
.map(|x| (x + 1) as i32)
|
||||
}
|
||||
|
||||
fn check_horizontally(&self, allowed_error: usize) -> Option<i32> {
|
||||
(0..self.map.len() - 1)
|
||||
.find(|&y| {
|
||||
let d = min(y + 1, self.map.len() - y - 1);
|
||||
|
||||
iproduct!(0..self.map[y].len(), (0..d))
|
||||
.filter(|&(x, dy)| self.map[y - dy][x] != self.map[y + dy + 1][x])
|
||||
.count()
|
||||
== allowed_error
|
||||
})
|
||||
.map(|y| 100 * (y + 1) as i32)
|
||||
}
|
||||
|
||||
fn score(&self, allowed_error: usize) -> i32 {
|
||||
if let Some(s) = self.check_vertically(allowed_error) {
|
||||
s
|
||||
} else if let Some(s) = self.check_horizontally(allowed_error) {
|
||||
s
|
||||
} else {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Day13 {
|
||||
patterns: Vec<Pattern>,
|
||||
}
|
||||
impl Solution<Output1, Output2> for Day13 {
|
||||
fn new<P: AsRef<Path>>(pathname: P) -> Self {
|
||||
let lines: Vec<String> = file_to_lines(pathname);
|
||||
|
||||
let patterns = lines
|
||||
.split(|l| l.is_empty())
|
||||
.map(|m| m.into())
|
||||
.collect_vec();
|
||||
|
||||
Self { patterns }
|
||||
}
|
||||
|
||||
fn part_1(&mut self) -> Output1 {
|
||||
self.patterns.iter().map(|p| p.score(0)).sum()
|
||||
}
|
||||
|
||||
fn part_2(&mut self) -> Output2 {
|
||||
self.patterns.iter().map(|p| p.score(1)).sum()
|
||||
}
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
// Day13::run("sample")
|
||||
Day13::main()
|
||||
}
|
||||
|
||||
test_sample!(day_13, Day13, 405, 400);
|
Loading…
Reference in a new issue