From b8f91dee008ba4ee47a191698584c46c5fd78e61 Mon Sep 17 00:00:00 2001 From: Cassandra de la Cruz-Munoz Date: Wed, 13 Dec 2023 16:45:18 +0100 Subject: [PATCH] Day 13 complete --- src/13part1.rs | 107 +++++++++++++++++++++++++++++++++++++++++++ src/13part2.rs | 121 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 228 insertions(+) create mode 100644 src/13part1.rs create mode 100644 src/13part2.rs diff --git a/src/13part1.rs b/src/13part1.rs new file mode 100644 index 0000000..99750c3 --- /dev/null +++ b/src/13part1.rs @@ -0,0 +1,107 @@ +use std::fs; + +fn main() { + let file_path = "input/13input.txt"; + let contents = fs::read_to_string(file_path).expect("should read file"); + let mut lines = contents.lines(); + let mut matrices: Vec>> = vec![Vec::new()]; + loop { + let line = lines.next(); + if line.is_none() { + break; + } + if line.unwrap() == "" { + matrices.push(Vec::new()); + continue; + } + let matrices_len = matrices.len(); + matrices[matrices_len-1].push(line.unwrap().chars().collect()); + } + let mut total = 0; + for i in 0..matrices.len() { + let mut mirrored_lower = false; + let mut mirrored_upper = false; + let mut center_lower = matrices[i].len()/2; + let mut center_upper = matrices[i].len()/2+1; + while center_lower > 0 && center_upper < matrices[i].len() { + mirrored_lower = true; + mirrored_upper = true; + let mut first_pointer_low = center_lower-1; + let mut second_pointer_low = center_lower; + while second_pointer_low < matrices[i].len() && mirrored_lower { + mirrored_lower &= matrices[i][first_pointer_low] == matrices[i][second_pointer_low]; + if first_pointer_low > 0 { + first_pointer_low -= 1; + } else { + break; + } + second_pointer_low += 1; + } + if mirrored_lower { + total += 100*center_lower; + break; + } + let mut first_pointer_up = center_upper-1; + let mut second_pointer_up = center_upper; + while second_pointer_up < matrices[i].len() && mirrored_upper { + mirrored_upper &= matrices[i][first_pointer_up] == matrices[i][second_pointer_up]; + if first_pointer_up > 0 { + first_pointer_up -= 1; + } else { + break; + } + second_pointer_up += 1; + } + if mirrored_upper { + total += 100*center_upper; + break; + } + center_lower -= 1; + center_upper += 1; + } + if mirrored_upper || mirrored_lower { + continue; + } + center_lower = matrices[i][0].len()/2; + center_upper = matrices[i][0].len()/2+1; + while center_lower > 0 && center_upper < matrices[i][0].len() { + mirrored_lower = true; + mirrored_upper = true; + let mut first_pointer_low = center_lower-1; + let mut second_pointer_low = center_lower; + while second_pointer_low < matrices[i][0].len() && mirrored_lower { + for j in 0..matrices[i].len() { + mirrored_lower &= matrices[i][j][first_pointer_low] == matrices[i][j][second_pointer_low]; + } + if first_pointer_low == 0 { + break; + } + first_pointer_low -= 1; + second_pointer_low += 1; + } + if mirrored_lower { + total += center_lower; + break; + } + let mut first_pointer_up = center_upper-1; + let mut second_pointer_up = center_upper; + while second_pointer_up < matrices[i][0].len() && mirrored_upper { + for j in 0..matrices[i].len() { + mirrored_upper &= matrices[i][j][first_pointer_up] == matrices[i][j][second_pointer_up]; + } + if first_pointer_up == 0 { + break; + } + first_pointer_up -= 1; + second_pointer_up += 1; + } + if mirrored_upper { + total += center_upper; + break; + } + center_lower -= 1; + center_upper += 1; + } + } + println!("{}", total); +} diff --git a/src/13part2.rs b/src/13part2.rs new file mode 100644 index 0000000..6d5876e --- /dev/null +++ b/src/13part2.rs @@ -0,0 +1,121 @@ +use std::fs; + +fn main() { + let file_path = "input/13input.txt"; + let contents = fs::read_to_string(file_path).expect("should read file"); + let mut lines = contents.lines(); + let mut matrices: Vec>> = vec![Vec::new()]; + loop { + let line = lines.next(); + if line.is_none() { + break; + } + if line.unwrap() == "" { + matrices.push(Vec::new()); + continue; + } + let matrices_len = matrices.len(); + matrices[matrices_len-1].push(line.unwrap().chars().collect()); + } + let mut total = 0; + for i in 0..matrices.len() { + let mut center_lower = matrices[i].len()/2; + let mut center_upper = matrices[i].len()/2+1; + let mut smudge_count = 0; + while center_lower > 0 && center_upper < matrices[i].len() { + smudge_count = 0; + let mut first_pointer_low = center_lower-1; + let mut second_pointer_low = center_lower; + while second_pointer_low < matrices[i].len() && smudge_count < 2 { + if matrices[i][first_pointer_low] != matrices[i][second_pointer_low] { + for j in 0..matrices[i][first_pointer_low].len() { + if matrices[i][first_pointer_low][j] != matrices[i][second_pointer_low][j] { + smudge_count += 1; + } + } + } + if first_pointer_low == 0 { + break; + } + first_pointer_low -= 1; + second_pointer_low += 1; + } + if smudge_count == 1 { + total += 100*center_lower; + break; + } + smudge_count = 0; + let mut first_pointer_up = center_upper-1; + let mut second_pointer_up = center_upper; + while second_pointer_up < matrices[i].len() && smudge_count < 2 { + if matrices[i][first_pointer_up] != matrices[i][second_pointer_up] { + for j in 0..matrices[i][first_pointer_up].len() { + if matrices[i][first_pointer_up][j] != matrices[i][second_pointer_up][j] { + smudge_count += 1; + } + } + } + if first_pointer_up == 0 { + break; + + } + first_pointer_up -= 1; + second_pointer_up += 1; + } + if smudge_count == 1 { + total += 100*center_upper; + break; + } + center_lower -= 1; + center_upper += 1; + } + if smudge_count == 1 { + continue; + } + center_lower = matrices[i][0].len()/2; + center_upper = matrices[i][0].len()/2+1; + while center_lower > 0 && center_upper < matrices[i][0].len() { + smudge_count = 0; + let mut first_pointer_low = center_lower-1; + let mut second_pointer_low = center_lower; + while second_pointer_low < matrices[i][0].len() && smudge_count < 2 { + for j in 0..matrices[i].len() { + if matrices[i][j][first_pointer_low] != matrices[i][j][second_pointer_low] { + smudge_count += 1; + } + } + if first_pointer_low == 0 { + break; + } + first_pointer_low -= 1; + second_pointer_low += 1; + } + if smudge_count == 1 { + total += center_lower; + break; + } + smudge_count = 0; + let mut first_pointer_up = center_upper-1; + let mut second_pointer_up = center_upper; + while second_pointer_up < matrices[i][0].len() && smudge_count < 2 { + for j in 0..matrices[i].len() { + if matrices[i][j][first_pointer_up] != matrices[i][j][second_pointer_up] { + smudge_count += 1; + } + } + if first_pointer_up == 0 { + break; + } + first_pointer_up -= 1; + second_pointer_up += 1; + } + if smudge_count == 1 { + total += center_upper; + break; + } + center_lower -= 1; + center_upper += 1; + } + } + println!("{}", total); +}