Skip to content

Commit

Permalink
Merge pull request #17 from gchazot/2023_days13-16
Browse files Browse the repository at this point in the history
2023 days 13 to 16
  • Loading branch information
gchazot authored Nov 2, 2024
2 parents dbdd410 + effecd3 commit c27d3c6
Show file tree
Hide file tree
Showing 9 changed files with 2,700 additions and 0 deletions.
1,343 changes: 1,343 additions & 0 deletions year_2023/src/day13/mine.txt

Large diffs are not rendered by default.

297 changes: 297 additions & 0 deletions year_2023/src/day13/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,297 @@
use crate::utils;
use std::fmt;

#[test]
fn test_mine() {
execute()
}

pub fn execute() {
let mut patterns: Vec<Pattern> = utils::read_lines("src/day13/mine.txt")
.split(|line| line.len() == 0)
.map(|pattern_lines| Pattern::from_lines(pattern_lines.to_vec()))
.collect();

assert_eq!(100, patterns.len());
assert_eq!(
28651,
patterns
.iter()
.map(|pattern| { pattern.symmetry_score().unwrap() })
.sum::<usize>()
);
assert_eq!(
25450,
patterns
.iter_mut()
.map(|pattern| { pattern.new_symmetry_score().unwrap() })
.sum::<usize>()
);
}

#[derive(Clone)]
struct Pattern {
rows: Vec<Vec<bool>>,
}

impl fmt::Debug for Pattern {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"{}",
self.rows
.iter()
.map(|row| -> String {
row.iter()
.map(|&val| -> String {
match val {
true => String::from("#"),
false => String::from("."),
}
})
.collect::<Vec<_>>()
.join("")
})
.collect::<Vec<_>>()
.join("\n")
)
}
}

impl Pattern {
fn from_lines(lines: Vec<String>) -> Pattern {
let rows = lines
.iter()
.map(|line| line.chars().map(|ch| ch == '#').collect())
.collect();
Pattern { rows }
}

fn new_symmetry_score(&mut self) -> Option<usize> {
let orig_row_symmetries = self.row_symmetries();
let orig_col_symmetries = self.col_symmetries();
assert_eq!(1, orig_row_symmetries.len() + orig_col_symmetries.len());

for j in 0..self.rows.len() {
for i in 0..self.rows[j].len() {
self.rows[j][i] = !self.rows[j][i];

let row_symmetries: Vec<usize> = self
.row_symmetries()
.into_iter()
.filter(|row| !orig_row_symmetries.contains(row))
.collect();

if row_symmetries.len() == 1 {
return Some(row_symmetries.into_iter().sum());
} else if row_symmetries.len() > 1 {
return None;
}

let col_symmetries: Vec<usize> = self
.col_symmetries()
.into_iter()
.filter(|col| !orig_col_symmetries.contains(col))
.collect();
if col_symmetries.len() == 1 {
return Some(col_symmetries.into_iter().sum::<usize>() * 100);
}

self.rows[j][i] = !self.rows[j][i];
}
}
println!("No smudge found\n{:?}", self);
None
}

fn symmetry_score(&self) -> Option<usize> {
let row_symmetries = self.row_symmetries();
let col_symmetries = self.col_symmetries();
assert_eq!(1, row_symmetries.len() + col_symmetries.len());

if row_symmetries.len() == 1 {
return Some(row_symmetries.iter().sum());
} else if row_symmetries.len() > 1 {
return None;
}
if col_symmetries.len() == 1 {
return Some(col_symmetries.iter().sum::<usize>() * 100);
}
None
}

fn is_row_symmetric(&self, (x, y): (usize, usize)) -> bool {
let row = &self.rows[y];
if x < 1 || x >= row.len() {
return false;
}

let mut i = 0;
while x + i < row.len() && x >= i + 1 {
if row[x + i] != row[x - i - 1] {
return false;
}
i += 1;
}
true
}

fn row_symmetries(&self) -> Vec<usize> {
let width = self.rows[0].len();
let height = self.rows.len();
assert!(self.rows.iter().all(|row| row.len() == width));
let mut result: Vec<usize> = (1..width).collect();
for j in 0..height {
result.retain(|&i| self.is_row_symmetric((i, j)));
}
result
}

fn is_col_symmetric(&self, (x, y): (usize, usize)) -> bool {
let col: Vec<bool> = self.rows.iter().map(|row| row[x]).collect();
if y < 1 || y >= col.len() {
return false;
}

let mut j = 0;
while y + j < col.len() && y >= j + 1 {
if col[y + j] != col[y - j - 1] {
return false;
}
j += 1;
}
true
}

fn col_symmetries(&self) -> Vec<usize> {
let width = self.rows[0].len();
assert!(self.rows.iter().all(|row| row.len() == width));
let height = self.rows.len();

let mut result: Vec<usize> = (1..height).collect();
for i in 0..width {
result.retain(|&j| self.is_col_symmetric((i, j)));
}
result
}
}

#[test]
fn test_from_lines() {
assert_eq!(0, Pattern::from_lines(vec![]).rows.len());
assert_eq!(1, Pattern::from_lines(vec!["".to_string()]).rows.len());

let example1 = _example1();

assert_eq!(7, example1.rows.len());
assert_eq!(9, example1.rows.iter().map(|row| row.len()).min().unwrap());
assert_eq!(9, example1.rows.iter().map(|row| row.len()).max().unwrap());
assert_eq!(
vec![true, false, true, true, false, false, true, true, false],
example1.rows[0]
);

let example2 = _example2();
assert_eq!(7, example2.rows.len());
assert_eq!(9, example2.rows.iter().map(|row| row.len()).min().unwrap());
assert_eq!(9, example2.rows.iter().map(|row| row.len()).max().unwrap());
assert_eq!(
vec![true, false, false, false, true, true, false, false, true],
example2.rows[0]
);
}

fn _example1() -> Pattern {
Pattern::from_lines(vec![
"#.##..##.".to_string(),
"..#.##.#.".to_string(),
"##......#".to_string(),
"##......#".to_string(),
"..#.##.#.".to_string(),
"..##..##.".to_string(),
"#.#.##.#.".to_string(),
])
}

fn _example2() -> Pattern {
Pattern::from_lines(vec![
"#...##..#".to_string(),
"#....#..#".to_string(),
"..##..###".to_string(),
"#####.##.".to_string(),
"#####.##.".to_string(),
"..##..###".to_string(),
"#....#..#".to_string(),
])
}

#[test]
fn test_is_row_symmetric() {
let example1 = _example1();

let symmetries = vec![
(5, 0),
(7, 0),
(1, 1),
(5, 1),
(1, 2),
(5, 2),
(1, 3),
(5, 3),
(1, 4),
(5, 4),
(1, 5),
(3, 5),
(5, 5),
(7, 5),
(5, 6),
];

for j in 0..example1.rows.len() {
for i in 0..example1.rows[j].len() {
let coords = (i, j);
let result = example1.is_row_symmetric(coords);
if symmetries.contains(&coords) {
assert!(result, "{:?} is not symmetric", &coords);
} else {
assert!(!result, "{:?} is symmetric", &coords);
}
}
}
}

#[test]
fn test_row_symmetries() {
let example1 = _example1();
let symmetries1 = example1.row_symmetries();
assert_eq!(1, symmetries1.len());
assert_eq!(5, symmetries1[0]);

let example2 = _example2();
let symmetries2 = example2.row_symmetries();
assert_eq!(0, symmetries2.len());
}

#[test]
fn test_col_symmetries() {
let example1 = _example1();
let symmetries1 = example1.col_symmetries();
assert_eq!(0, symmetries1.len());

let example2 = _example2();
let symmetries2 = example2.col_symmetries();
assert_eq!(1, symmetries2.len());
assert_eq!(4, symmetries2[0]);
}

#[test]
fn test_new_score() {
let mut example = vec![_example1(), _example2()];
assert_eq!(
400,
example
.iter_mut()
.map(|pattern| { pattern.new_symmetry_score().unwrap() })
.sum::<usize>()
)
}
100 changes: 100 additions & 0 deletions year_2023/src/day14/mine.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
.OO.#.....#..O.O.O#....O....#....O....#..##.#...#..O....#.....O...##O...O#.O.#O.O....O......O.....OO
.......#........O...O..#.....O....O.#..#O#.#.##O.#O.#..O.O....O.###O.........#.O.O......O....#O.....
O..O.OOO....#O..#.#......OOO.#O#O.OO..#.O#.O.....O....#O.O####...##O..O....O#..O#...#..#......O..#..
.#.#.##...#.O.#...O##..O....#........#..#.#.O...O.......#.OO...#........#...O#.#.......O..OO.OO.OO##
....O.O.O#.....O#.OO..O...........O.OO..#.........O...O........#.OOOO..##.#....#.#..O..O#..O#.#O..OO
#.#...O##.##...#.#O.OO..O.##O.#.##O...#O#....#OOOO.O........#......O.....O#....O....O..O#.OO#.O.....
......O..O.O...O...#..OOO##...O.OO....#......OO.#.....OOO##..##.#.#..#OOO.......#O.#....O....O...#.#
O..........OOO#.O.O.#.....OO...O.#..#...OO....OO#O.#OOO..OO..#.OO.....#O##.O..#.OOO...#.#O#...#.OO..
....O..#O...........#.O..OO##....#..................O....O.O.O.#.O.......O.O.#.....O..#O..#..#......
....##OO.#.....#OO...O......O#.....O.OO#....O..O.###.##.OO.#O....#.OO#O#.O......##O#..O...O#.#.O..O.
#....OO.##...#.....O.O....#O.O#...OO#..#.O.O.#..O......###.O..O......#..........O...#.O.#O#OO..O.O.#
........#....O..O###.#.#...OO##.#.....#O.O..........#...O..O...OO##....O#..O.#O......#..O..O...#..O#
..O.#..O......#......O..#......#...O.#O...O...O.#..#.OO.O.O...O...O.O.#....#O...O#..##..O..O......O.
...OO.............O....#O.O..O...OOO....O..#...O....#..#.O#.#..OO..#......O.....OOO....O..##..O#....
O.#O#.#O#.#..#.O.#....#..O...#..O#O..#.#.O..O...OO.....O...O....#.O.#OO.OOO#.O.....O..O#.O..#.OO##..
.....#..#.O.O##O.#O..O..OO.#O..O....O..O.....O..#.##..O.............#......O...###...O.....O....#...
O...O..O#O..#O.#O.O#.O...#O#.......O.......#...O.#.#.O#.......O.#.OO.O.#O..O..........O#...O.OO..#..
..O.O#.O.....O.OO..O#O...#.#....#..O.OO.....O.........O.O#...#....##......OO............O.O......#..
...O#OO.....OOO.........#OOO.O.......O.....O....O....#OO##.O##...#.................O....#O...#......
#.O#OO.#..#.......O.O.###O....O..O.....#.O.OOO.#.O#.#..O....#..#...#.O#.O#..##..#...##OO..O#...#...#
O...#.......O##.OO...#O..#......O.......O..#.....#..#.#..OO....#.#.#O..OO..#.OO.#..##OO#.O#OO..#...#
...O...#...O.#O....#.......O..OO.O..O.......O.#....#O..#O#.#...#....#.#....#....O.O......O.O........
#..O...OOOO.......#.....O..O...##O...#OO...OO..OO#O.O..#.....#O...#..#.....O.#O.#...#....#...O#....#
.O.#O.....#...#...O.OOO#...O#..##O#OO##.#.#...O#.....#O..O#..#OO....#O...O.#..O..#.....#.#.OO...O.#.
..#..OO......#..O..#.O.O..O.#...#.#....#.......O.#O#....O.#.O#.O.O.O..O.###O.OOO...#O....O#..O.#...#
....O.#.....#.....OO.......O#O.O..OO#..O.O...OOOO....OO..O.#..O.....OOO.O#O.O......#..#O.O....O.#..O
..#......#O##....O.O.OO..#.#.....O.#.#O#.....OO#......###..#.O.O#....#O...O...O...OO...OO..O.#...O.O
#...#.....O.#..##.......#.OO......#O..O.........O#.#O#.#..#O.O......O.O..O.OO#...O.#..O...O..O.O....
O.#..##...O.O..O....O.O.OO......O...O.O....#..#.O.....OO...O.OO.O....O....O.O.O........O..O#...OO.O.
....O..O.O...OO#O..O..........OO#...O..O.O#...#O......#.#.#...#..O.....O..O.#O#.....O.#O.O..O#.....O
#O...O...O..O.#.O#OO.......O#.....O.#..O.OO.#.........O..OO.....OO.OO#OO...O.#.O....#...#..#.##.O...
##O...#.##...OO.......##..#.#.#..OO.....OO#.....OOO.OO.......O.#.O...#..O.OO.#.....##.#.#........#.#
...OO..#....#..O...O........OO.O...##.......O...#O#..O...#....#O....#....#O..##.#O.#..O.....##OO#.O.
.O.#.O#O.#...#..O.##.#....OO..........O.#.O.O#O...#......O.O....O#.O.#.....O...##...O.#.O.O.#O##.O..
...#.....O....#.OO.#.#..#..#..###.....#.......#.O...O#...O..#.O#O##O.O....#.O.#....O............O...
#.##..##....#...O.....#.O.....OO....OOO......#...O.#....OO.#....O...##..#OO.#....O..O.O#O.O..#...O#.
O##....OO...#.#..O...#......#.##..O......#........O.O.O.#O..#.#..O..#.....#O.O.....##OO.O..O..#.....
.....O#..O.#.#..#O#.O.......OO.O.....#.....##...O..#...OO.O.OO....OOO........O#OO...O..#.OO##OO#.O#.
...#.O#O......O....O#................#O.....#..O.OO#.......#.#.O##......OO.#..#..O#...OO..#.#.O#O.#.
O......#.#....O.O...O.#.O......#.#.O..OOO.O..........#..O....#..O.O.#.O.##OO..#O#.O....#O..###...#..
..##..#...#..#.#O.#.#..#O#.#.....O.#..#OO....OOO#O...O##O..#.##.O..O..O#O..........O.#..#....O#.....
O.....#OO#...OO#O..O......#O.O..........O####.#.....#..#.....#...#..O#...#...#O#...#..O..#.O#......O
....O###.OOO...O.O...O#...O##....OO..O..O#..O.#.OO.O#.#...#O.#......##.O.......O...#.O.O.#.......O.#
O..O.....##....#OO#.OO....##.O#.O..#.#.......O......#....#O#.O.......OO..O.#..#.O..#..........OO..OO
.......O.O......O.....#O..#.....#....#O#...#...O..#...O#....#O.O.....O...#OO...#......#...##...OOO..
#..O.....#O.O..O.O...#.O...O.O.#.#OO.....OOO....O.........OO..O.OO#...O#..O...#.#..#.##.#..OO...#...
...O..OO.#O...OOOOOO..O#....#.OO...O#...O.....#.#.O.....O..O.O#O.#.#.O..#....O..#.#...OO#.......#O..
..............O.OO#.........##..............O..#........##....O...#.#.##O#.O....O#.OO....O.#O.OO.O.O
....O....#..O..O....O##...OO...O....O#..#O#.....OO...#.OOO#....#.O..O..O...#.....#..OO#.#O....O.O#..
#O#...O..O#.OO..OO....#.......O#.........##.....OOO......O..#....O.#.#.O.O..O.O..O...#.#..O.#......O
O....O...#..##...OO.....#.#.#.........OO..#..#...O...O..#..#.OOOO....#O..O##.O.O#....#....O.##.O..O.
....O..#.OO.##...O.OOO.O.O#.....#..O..O....#.#O...#O#O.....O..##...##.O.#O...#.....OO.#..#O#.O.#.O..
O..O#.....O..OO........OO...##....O#OO#.O..OO.....O.....O...O.##..#..#O..O.#.OO....#.........O...#.O
#...O.O..O..O........#OOOO......#..O...#..O.....OO#.....O.......O#...O..O.....##O.....OOO#...#..##O.
#.##...##O.#....#.OO#.OO.#..OO#...#...O..O.O#..##..O.....O.OO.#OO#....#.#.O.#...OO..#.##O...#.....#O
..#.O.....O##.....O.O#O.#O#..#...O...O#.......#O..OO.O..O..O.##O...O...........#..#....O............
..O.#O....O...#O....#....O...OO.OO...#O.O..O.....O.........##.....#..#O.O.OO..O..#....#.............
..#...O.OO.......#....OO.O...#.O...#O.O#......O..#..............#O......#.O#..#...O.......#......O..
..O..O....O.....O#O....OO.....O.O##O...O....#..OO...O.OO....O.O...O.O.......#..#O.O..O.........#.#..
...O..O#.......#..#...OOOO...O.###..#O.OO..O#.O.O.OOO.#.O..O.#......#OO....O....#..#O..O......O....O
....##OO###.......OO.##O.....##.#.OOOO.#OO#...#.#.O..#.....O.#.##O..#OOO.#OO.OO#OO.......O.#...#O...
....O.O.OO.O.#O...#.O.O.....OO#.OO....O.......O.O.O...##OO....O....#.#..#O###...OO..O...#.#.O.O.O.#.
....O....O....#...O..O#.OO..O.OOO...#.......###O#....##O.O#..O...O.#.O.O.......O.###..O#.#.O.O.....#
..#..O...O..O.......O..#.#O.O..O...O.........#.O......#....O..O..O#.O..O..#.O.......#...#...O#.OO..#
O....OO#O..#....O.#OOO..O.....O...O.O....O.O#O..#........OOO..#O..O.O.....O#O...#.#.....#.O.O......#
##OO.O#..#O#.....O.........O..O.#.......OO.....O...#........###.OO...O..#..OO.O#.O#O....#..##....O.O
.#OOO........O#...O.#..O.O.O..#.....#..OOO...#.....O........#.........O.O.....#.#.O.O#O.#.#...#...#.
.O.....#.#....O.O...#O..O###...O..#...#O#.O.O...........#.O....#O.OO......O....O..OO....#....#..##O#
....#..O#...#....#.O..O.#......OOO.........O....#....O...O#......#.#...OO..O..#.#O.#......#.O.#.#...
O.O.......O.O#OOO#.O......O#.O......OO.O..O.......##O....O...#.O...O..#....###.####...OO...OO..O..OO
#..#.....O.....O..O.#....#O....O.OO..#...O.O.....O.O..#O...O#....O##...O.....#OO#..OO#..#.O..O.###..
O##..#...O..#...........OO...#..#....#...#.O.....OOO...O.OO...O.#.#..O...OO.....OO#O...#O...#..#...O
....O....#.....O.#.#.OO..#.........#..........O#..O#O.#....###..O.....#.......O..#.#.....OOOO.......
O.O.O.#........#.#.O.#..##O.OO..O...#O#OO.....O...O.#.#.O#O......#O.....O...O..O##.##.#......O..#...
....O.......O..#.OO###..#.O#....#O.OO#..OO...#.#...###...#OO#..#...........#OO#..O.#..#....O#....O.O
....#O..#...#O..O..O...#....O....#....OOO.OO.O..#...OO.O#.....OO.O..#..#...O.#.#.O..#.#O.O#O.O......
.OO....#.OO.............#..###.#...O...#O...OO#...OO#O..#...##.#..........O..#...#.....O.....O...O..
#.O....#O....O#..#O......#####O....O..O....O#.......#..O.#..#....O...##..#.........O..O.....#.O#.O..
...O.O.....#....O.#O....#....O..........###....O.#.O.O#O.#.#.O..#.O.O...#.###...OOO...##..O.#.O..O#.
.##...#..O..O.#....O..OO..O.....#..O.##O#O.........OO#...#.......O#....O............#O.##.OO#..O.#..
.O.........O.#O.......#O..O....#.##.O.O...##....#.##...#O#.#.....O#O.#...#..O.#.O...O..##..O.#.O.O..
...O.#.O.O#.OO..OO#.O...O.O.O...O.O.###O.O..O.O.O........#.O....#....O.#.#OO.....OO.#.....##..#OO...
....OO##...#O.#..#.....#.#..##O.O##..O...OO#O...........O..O.#.OO..O...OO.##.O.#..#.##OO...#..O.....
...#....O....#..#.O....O..#....O...#....#O...O.O..#O#O..O.......#..O......#OO..OO.OO......#.##O...O.
...O......O.....OO#.O.#..O..O..O.O.....O...........O....#.###...O.#......O....O.##..#....O...#.#.#..
..O.O.#.O......OO..##.O......O#..#O.....##O.O#....#.#....O.....OO.#.....O.O#.#..O...O.#....O#...O..#
O...OO#O.......#..#O#........#.#.##.O........#O...#..#O..#.....#....O#O.#......##O....O.OO.O........
.#..O.....OO..O.#..O.O........O.......#.#.#.....O.OO.....#......O.......O##.O...#....#O....O........
.O.OO....O.O.##..........O.....O.##.#.......OO....O.O....#........##O..O.O##.O......#.#.#.....OO.O#.
O.....OOO.O###...OO.##.............#..O.#.....#O.....O..OO..O#....##....OO.....#.O.#OO......OO...O##
O........###.##..O......O#.....O.O#O......#....O#..O........O..O.#.......OO......O..##..OOO.O..O.O#.
OO.#O......OO...O..O..#..##O..#...O......#..............O..............O..#......#.#O....O...#...O..
.O..O#.O#..O.#..O..OO#..#.##O.....O.O.#......##O#..O....O......#.#.O..#.....O#.O..O.#.##.......#....
....OO.#....O..O...OO..#O..#...###..OO.......O##.##.#OO..OOO...#.O..O......O........##..#...OO...#..
....#O........#.O......O##...##O......#.O..O.O........##...#.O.......O..#OOOOO..#......O###..O..O.O.
#.#..O.#.........O#...#O.##..O.....#..O...........##......O..#...O......#.................OO...#O.#.
..O..#OO...OOO...O.#...#.......#OOOO#...#...O....O..#........OO....O..O..##.OO.O#....OO#O#..#....O..
.O.O..........OOOO.#.#......O##...............#.O.OO.###.#....O..O.O#O...OO..O#O........#.O.....O#.O
...#......#.#.....#........#O#.........#O....#O.O..#.###.....O#OOO#O#.#.O..#.#OOO..O.#....#O......#.
O..O...#O.O.....O..O.#.#......O.#O#...#.....#..OO#.....OO.O#.O.....#....O.#...O...O.OO.....O....O#..
Loading

0 comments on commit c27d3c6

Please sign in to comment.