day13
This commit is contained in:
parent
be7ca6666d
commit
ffb43d4860
113
src/day13.rs
Normal file
113
src/day13.rs
Normal file
@ -0,0 +1,113 @@
|
||||
use std::collections::HashSet;
|
||||
use aoc_runner_derive::{aoc, aoc_generator};
|
||||
|
||||
type Coordinates = (i32, i32);
|
||||
|
||||
#[aoc_generator(day13)]
|
||||
fn parse(input: &str) -> Vec<HashSet<Coordinates>> {
|
||||
input.split("\n\n")
|
||||
.map(|pattern| {
|
||||
let mut map: HashSet<Coordinates> = HashSet::new();
|
||||
for (y, line) in pattern.lines().into_iter().enumerate() {
|
||||
for (x, char) in line.chars().enumerate() {
|
||||
if char == '#' {
|
||||
map.insert((x as i32 + 1, y as i32 + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
map
|
||||
}).collect::<Vec<_>>()
|
||||
}
|
||||
|
||||
fn reflection((x, y): &Coordinates, pattern: &HashSet<Coordinates>, max_x: i32, max_y: i32, axis: &i32, is_column: bool) -> bool {
|
||||
if is_column {
|
||||
x <= axis && (2 * axis - x + 1 > max_x || pattern.contains(&(2 * axis - x + 1, *y)))
|
||||
|| x > axis && (2 * axis - x + 1 < 1 || pattern.contains(&(2 * axis - x + 1, *y)))
|
||||
} else {
|
||||
y <= axis && (2 * axis - y + 1 > max_y || pattern.contains(&(*x, 2 * axis - y + 1)))
|
||||
|| y > axis && (2 * axis - y + 1 < 1 || pattern.contains(&(*x, 2 * axis - y + 1)))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fn calc_summary(pattern: &HashSet<Coordinates>) -> usize {
|
||||
let max_x = pattern.iter().max_by(|a, b| a.0.cmp(&b.0)).unwrap().0;
|
||||
let max_y = pattern.iter().max_by(|a, b| a.1.cmp(&b.1)).unwrap().1;
|
||||
|
||||
((1..max_x)
|
||||
.find(|column| {
|
||||
pattern.iter()
|
||||
.all(|coords| {
|
||||
reflection(coords, pattern, max_x, max_y, column, true)
|
||||
})
|
||||
}).unwrap_or(0)
|
||||
+ 100 * (1..max_y)
|
||||
.find(|row| {
|
||||
pattern.iter().all(|coordinates| {
|
||||
reflection(coordinates, pattern, max_x, max_y, row, false)
|
||||
})
|
||||
})
|
||||
.unwrap_or(0)) as usize
|
||||
}
|
||||
|
||||
|
||||
#[aoc(day13, part1)]
|
||||
fn part1(input: &Vec<HashSet<Coordinates>>) -> usize {
|
||||
input.iter().map(calc_summary).sum()
|
||||
}
|
||||
|
||||
fn calc_summary_part2(pattern: &HashSet<Coordinates>) -> usize {
|
||||
let max_x = pattern.iter().max_by(|a, b| a.0.cmp(&b.0)).unwrap().0;
|
||||
let max_y = pattern.iter().max_by(|a, b| a.1.cmp(&b.1)).unwrap().1;
|
||||
|
||||
((1..max_x)
|
||||
.find(|column| {
|
||||
pattern.iter().filter(|coords| {
|
||||
reflection(coords, pattern, max_x, max_y, column, true)
|
||||
}).count() == pattern.len() - 1
|
||||
}).unwrap_or(0)
|
||||
+ 100 * (1..max_y)
|
||||
.find(|row| {
|
||||
pattern.iter().filter(|coordinates| {
|
||||
reflection(coordinates, pattern, max_x, max_y, row, false)
|
||||
}).count() == pattern.len() - 1
|
||||
})
|
||||
.unwrap_or(0)) as usize
|
||||
}
|
||||
|
||||
#[aoc(day13, part2)]
|
||||
fn part2(input: &Vec<HashSet<Coordinates>>) -> usize {
|
||||
input.iter().map(calc_summary_part2).sum()
|
||||
}
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
const EX: &str = r"#.##..##.
|
||||
..#.##.#.
|
||||
##......#
|
||||
##......#
|
||||
..#.##.#.
|
||||
..##..##.
|
||||
#.#.##.#.
|
||||
|
||||
#...##..#
|
||||
#....#..#
|
||||
..##..###
|
||||
#####.##.
|
||||
#####.##.
|
||||
..##..###
|
||||
#....#..#";
|
||||
|
||||
#[test]
|
||||
fn part1_example() {
|
||||
assert_eq!(part1(&parse(EX)), 405);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_example() {
|
||||
assert_eq!(part2(&parse(EX)), 400);
|
||||
}
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
mod day13;
|
||||
mod day12;
|
||||
mod day4;
|
||||
mod day2;
|
||||
|
Loading…
Reference in New Issue
Block a user