Day 14 Part 2 Complete -> First solution took agest to run but added the hashmap to detect cycles in the rotations. Thanks reddit :)

This commit is contained in:
Luke Else 2023-12-14 18:19:21 +00:00
parent a3b2847d6b
commit 505ea3771a

View File

@ -1,3 +1,5 @@
use std::collections::HashMap;
use super::Solution;
pub struct Day14 {}
@ -19,9 +21,28 @@ impl Solution for Day14 {
fn part2(
&self,
_input: &mut Vec<String>,
input: &mut Vec<String>,
) -> Result<Box<dyn std::fmt::Display + Sync>, Box<dyn std::error::Error>> {
Ok(Box::new("Ready"))
let mut rock_formation = input
.iter()
.map(|r| r.chars().collect::<Vec<_>>())
.collect::<Vec<_>>();
let mut rotations: HashMap<Vec<Vec<char>>, usize> = HashMap::new();
for i in 1..=1_000_000_000 {
for _ in 0..4 {
self.pull_north(&mut rock_formation);
rock_formation = self.rotate(&rock_formation);
}
if let Some(rotation) = rotations.insert(rock_formation.clone(), i) {
if (1_000_000_000 - i) % (i - rotation) == 0 {
break;
}
}
}
Ok(Box::new(self.get_load(&rock_formation)))
}
fn get_day(&self) -> u8 {
@ -59,6 +80,17 @@ impl Day14 {
})
.sum::<usize>() as u32
}
// Function that rotates the given vector through 90 degrees clockwise
fn rotate(&self, cave: &Vec<Vec<char>>) -> Vec<Vec<char>> {
let mut new_cave = vec![vec![' '; cave.len()]; cave[0].len()];
for row in 0..cave.len() {
for col in 0..cave[0].len() {
new_cave[col][cave.len() - row - 1] = cave[row][col];
}
}
new_cave
}
}
/// Test from puzzle input
@ -98,6 +130,25 @@ mod test {
.unwrap()
.to_string();
assert_eq!(answer, "Ready");
assert_eq!(answer, "64");
}
#[test]
fn rotation_test() {
let challenge = day14::Day14 {};
let mut arr = vec![
vec!['a', 'b', 'c', 'd'],
vec!['d', 'e', 'f', 'g'],
vec!['h', 'i', 'j', 'k'],
vec!['l', 'm', 'n', 'o'],
];
let ans = arr.clone();
for _ in 0..4 {
arr = challenge.rotate(&arr);
}
assert_eq!(arr, ans);
}
}