Compare commits

..

3 Commits

Author SHA1 Message Date
Matej Janezic 000002707d
fix: tests for day 11 2023-12-13 15:01:34 +01:00
Matej Janezic 0000026098
fix: tests for day 9 2023-12-13 14:46:33 +01:00
Matej Janezic 000002508c
solution: day 13 2023-12-13 14:44:59 +01:00
4 changed files with 90 additions and 10 deletions

15
data/examples/13.txt Normal file
View File

@ -0,0 +1,15 @@
#.##..##.
..#.##.#.
##......#
##......#
..#.##.#.
..##..##.
#.#.##.#.
#...##..#
#....#..#
..##..###
#####.##.
#####.##.
..##..###
#....#..#

View File

@ -78,10 +78,13 @@ mod tests {
use super::*; use super::*;
#[test] #[test]
fn test_part_one() { fn test_part_one() {
assert_eq!(part_one(&aoc::template::read_file("examples", 9)), None); assert_eq!(
part_one(&aoc::template::read_file("examples", 9)),
Some(114)
);
} }
#[test] #[test]
fn test_part_two() { fn test_part_two() {
assert_eq!(part_two(&aoc::template::read_file("examples", 9)), None); assert_eq!(part_two(&aoc::template::read_file("examples", 9)), Some(2));
} }
} }

View File

@ -2,20 +2,16 @@ use std::collections::HashSet;
fn parse_input(input: &str) -> (Vec<(usize, usize)>, HashSet<usize>, HashSet<usize>) { fn parse_input(input: &str) -> (Vec<(usize, usize)>, HashSet<usize>, HashSet<usize>) {
let mut galaxies = Vec::new(); let mut galaxies = Vec::new();
let mut rows = HashSet::new(); let mut rows = HashSet::from_iter(0..input.lines().count());
let mut columns = HashSet::from_iter(1..(input.lines().next().unwrap().len())); let mut columns = HashSet::from_iter(0..input.lines().next().unwrap().len());
for (y, line) in input.lines().enumerate() { for (y, line) in input.lines().enumerate() {
let mut found = false;
for (x, c) in line.chars().enumerate() { for (x, c) in line.chars().enumerate() {
if c == '#' { if c == '#' {
galaxies.push((y, x)); galaxies.push((y, x));
found = true; rows.remove(&y);
}
columns.remove(&x); columns.remove(&x);
} }
if !found {
rows.insert(y);
} }
} }

66
src/bin/13.rs Normal file
View File

@ -0,0 +1,66 @@
fn mirror_h(shape: &Vec<Vec<char>>, smudges: usize) -> Option<usize> {
(1..shape.len())
.filter(|&i| {
shape
.iter()
.skip(i)
.zip(shape.iter().take(i).rev())
.map(|(x, y)| {
x.iter()
.zip(y.iter())
.map(|(xx, yy)| (xx != yy) as usize)
.sum::<usize>()
})
.sum::<usize>()
== smudges
})
.max()
}
fn mirror_v(shape: &Vec<Vec<char>>, smudges: usize) -> Option<usize> {
let shape = (0..shape[0].len())
.map(|col| (0..shape.len()).map(|row| shape[row][col]).collect())
.collect();
mirror_h(&shape, smudges)
}
fn solve(input: &str, smudges: usize) -> usize {
input
.split("\n\n")
.map(|x| x.lines().map(|line| line.chars().collect()).collect())
.map(|shape| {
let v = mirror_v(&shape, smudges).unwrap_or_default();
let h = mirror_h(&shape, smudges).unwrap_or_default();
v + h * 100
})
.sum()
}
pub fn part_one(input: &str) -> Option<usize> {
Some(solve(input, 0))
}
pub fn part_two(input: &str) -> Option<usize> {
Some(solve(input, 1))
}
aoc::solution!(13);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_one() {
assert_eq!(
part_one(&aoc::template::read_file("examples", 13)),
Some(405)
);
}
#[test]
fn test_part_two() {
assert_eq!(
part_two(&aoc::template::read_file("examples", 13)),
Some(400)
);
}
}