Day 15 Complete -> Nice and easy :)
This commit is contained in:
parent
505ea3771a
commit
0bead087c3
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@
|
|||||||
|
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7
|
@ -0,0 +1 @@
|
|||||||
|
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7
|
@ -22,7 +22,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
Box::new(day12::Day12 {}),
|
Box::new(day12::Day12 {}),
|
||||||
Box::new(day13::Day13 {}),
|
Box::new(day13::Day13 {}),
|
||||||
Box::new(day14::Day14 {}),
|
Box::new(day14::Day14 {}),
|
||||||
// Box::new(day15::Day15 {}),
|
Box::new(day15::Day15 {}),
|
||||||
// Box::new(day16::Day16 {}),
|
// Box::new(day16::Day16 {}),
|
||||||
// Box::new(day17::Day17 {}),
|
// Box::new(day17::Day17 {}),
|
||||||
// Box::new(day18::Day18 {}),
|
// Box::new(day18::Day18 {}),
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::str;
|
||||||
|
|
||||||
use super::Solution;
|
use super::Solution;
|
||||||
|
|
||||||
pub struct Day15 {}
|
pub struct Day15 {}
|
||||||
@ -5,16 +7,42 @@ pub struct Day15 {}
|
|||||||
impl Solution for Day15 {
|
impl Solution for Day15 {
|
||||||
fn part1(
|
fn part1(
|
||||||
&self,
|
&self,
|
||||||
_input: &mut Vec<String>,
|
input: &mut Vec<String>,
|
||||||
) -> Result<Box<dyn std::fmt::Display + Sync>, Box<dyn std::error::Error>> {
|
) -> Result<Box<dyn std::fmt::Display + Sync>, Box<dyn std::error::Error>> {
|
||||||
Ok(Box::new("Ready"))
|
let pre_hashes = input[0].split(',').collect::<Vec<_>>();
|
||||||
}
|
|
||||||
|
|
||||||
|
let ans = pre_hashes
|
||||||
|
.iter()
|
||||||
|
.map(|h| self.hash(h, 17, 256))
|
||||||
|
.sum::<u32>();
|
||||||
|
Ok(Box::new(ans))
|
||||||
|
}
|
||||||
fn part2(
|
fn part2(
|
||||||
&self,
|
&self,
|
||||||
_input: &mut Vec<String>,
|
input: &mut Vec<String>,
|
||||||
) -> Result<Box<dyn std::fmt::Display + Sync>, Box<dyn std::error::Error>> {
|
) -> Result<Box<dyn std::fmt::Display + Sync>, Box<dyn std::error::Error>> {
|
||||||
Ok(Box::new("Ready"))
|
let pre_hashes = input[0].split(',').collect::<Vec<_>>();
|
||||||
|
let mut boxes: Vec<Vec<(String, u32)>> = vec![vec![]; 256];
|
||||||
|
|
||||||
|
pre_hashes
|
||||||
|
.iter()
|
||||||
|
.for_each(|ins| self.sort_lenses(&mut boxes, ins));
|
||||||
|
|
||||||
|
let ans = boxes
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(box_num, lenses)| {
|
||||||
|
lenses
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(lens_num, (_, focal_length))| {
|
||||||
|
self.get_focussing_power(box_num + 1, lens_num + 1, *focal_length)
|
||||||
|
})
|
||||||
|
.sum::<u32>()
|
||||||
|
})
|
||||||
|
.sum::<u32>();
|
||||||
|
|
||||||
|
Ok(Box::new(ans))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_day(&self) -> u8 {
|
fn get_day(&self) -> u8 {
|
||||||
@ -22,7 +50,53 @@ impl Solution for Day15 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Day15 {}
|
impl Day15 {
|
||||||
|
/// function to generate the predefined hash outlined in the challenge
|
||||||
|
fn hash(&self, input: &str, seed: u32, divisor: u32) -> u32 {
|
||||||
|
let mut hash = 0u32;
|
||||||
|
|
||||||
|
for c in input.bytes() {
|
||||||
|
hash += c as u32;
|
||||||
|
hash *= seed;
|
||||||
|
hash = hash % divisor;
|
||||||
|
}
|
||||||
|
|
||||||
|
hash
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sort the lenses in the boxes based in instructions given
|
||||||
|
fn sort_lenses(&self, boxes: &mut Vec<Vec<(String, u32)>>, instruction: &str) {
|
||||||
|
let bytes = instruction.as_bytes();
|
||||||
|
|
||||||
|
// '-' Logic or '=' Logic
|
||||||
|
if bytes[bytes.len() - 1] == b'-' {
|
||||||
|
let label = str::from_utf8(&bytes[..bytes.len() - 1 as usize]).unwrap();
|
||||||
|
let hash = self.hash(label, 17, 256);
|
||||||
|
boxes[hash as usize].retain(|(lens, _)| lens != label);
|
||||||
|
} else {
|
||||||
|
let mut parts = instruction.split("=");
|
||||||
|
let label = parts.next().unwrap();
|
||||||
|
let focal_length = parts.next().unwrap().parse::<u32>().unwrap();
|
||||||
|
|
||||||
|
let hash = self.hash(label, 17, 256);
|
||||||
|
|
||||||
|
let old_position = boxes[hash as usize]
|
||||||
|
.iter()
|
||||||
|
.position(|(existing_label, _)| existing_label == label);
|
||||||
|
if let Some(old_position) = old_position {
|
||||||
|
boxes[hash as usize][old_position] = (label.to_string(), focal_length);
|
||||||
|
} else {
|
||||||
|
boxes[hash as usize].push((label.to_string(), focal_length));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function that determines the focussing power of a lens given its box,
|
||||||
|
/// position and focal length
|
||||||
|
fn get_focussing_power(&self, box_num: usize, slot_num: usize, focal_length: u32) -> u32 {
|
||||||
|
box_num as u32 * slot_num as u32 * focal_length
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Test from puzzle input
|
/// Test from puzzle input
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -44,7 +118,7 @@ mod test {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.to_string();
|
.to_string();
|
||||||
|
|
||||||
assert_eq!(answer, "Ready");
|
assert_eq!(answer, "1320");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -61,6 +135,14 @@ mod test {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.to_string();
|
.to_string();
|
||||||
|
|
||||||
assert_eq!(answer, "Ready");
|
assert_eq!(answer, "145");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hash_test() {
|
||||||
|
let challenge = day15::Day15 {};
|
||||||
|
|
||||||
|
// Test the hash
|
||||||
|
assert_eq!(challenge.hash("HASH", 17, 256), 52);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user