Compare commits
2 commits
6a286a751e
...
3e9c1ee1c1
Author | SHA1 | Date | |
---|---|---|---|
3e9c1ee1c1 | |||
acea94bea5 |
6 changed files with 76 additions and 0 deletions
2
2023/data/day15.expected
Normal file
2
2023/data/day15.expected
Normal file
|
@ -0,0 +1,2 @@
|
|||
515210
|
||||
246762
|
1
2023/data/day15.input
Normal file
1
2023/data/day15.input
Normal file
File diff suppressed because one or more lines are too long
9
2023/day15/rust/Cargo.toml
Normal file
9
2023/day15/rust/Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "rust_2023_15"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
aoc = { path = "../../../common/rust" }
|
56
2023/day15/rust/src/main.rs
Normal file
56
2023/day15/rust/src/main.rs
Normal file
|
@ -0,0 +1,56 @@
|
|||
#![warn(clippy::pedantic)]
|
||||
|
||||
use std::io::{stdin, Read};
|
||||
|
||||
fn hash(s: &str) -> u8 {
|
||||
s.as_bytes()
|
||||
.iter()
|
||||
.copied()
|
||||
.fold(0, |acc, b| acc.wrapping_add(b).wrapping_mul(17))
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut input = String::new();
|
||||
stdin().read_to_string(&mut input).unwrap();
|
||||
let input = input.trim();
|
||||
|
||||
let steps = input.split(',');
|
||||
|
||||
println!(
|
||||
"{}",
|
||||
steps.clone().map(|s| { u64::from(hash(s)) }).sum::<u64>()
|
||||
);
|
||||
|
||||
let mut boxes: [Vec<(&str, usize)>; 256] = std::array::from_fn(|_| Vec::new());
|
||||
|
||||
for step in steps {
|
||||
let (label, focal_length) = if let Some(label) = step.strip_suffix('-') {
|
||||
(label, None)
|
||||
} else {
|
||||
let (label, focal_length) = step.split_once('=').unwrap();
|
||||
(label, Some(focal_length.parse().unwrap()))
|
||||
};
|
||||
|
||||
let b = &mut boxes[usize::from(hash(label))];
|
||||
if let Some(existing_pos) = b.iter().position(|&(l, _fl)| l == label) {
|
||||
if let Some(fl) = focal_length {
|
||||
b[existing_pos].1 = fl;
|
||||
} else {
|
||||
b.remove(existing_pos);
|
||||
}
|
||||
} else if let Some(fl) = focal_length {
|
||||
b.push((label, fl));
|
||||
}
|
||||
}
|
||||
|
||||
let focal_powers = boxes.into_iter().enumerate().flat_map(|(box_num, lenses)| {
|
||||
lenses
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
.map(move |(lens_num, (_label, focal_length))| {
|
||||
(box_num + 1) * (lens_num + 1) * focal_length
|
||||
})
|
||||
});
|
||||
|
||||
println!("{}", focal_powers.sum::<usize>());
|
||||
}
|
7
Cargo.lock
generated
7
Cargo.lock
generated
|
@ -695,6 +695,13 @@ dependencies = [
|
|||
"itertools 0.12.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rust_2023_15"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"aoc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.14"
|
||||
|
|
|
@ -36,4 +36,5 @@ members = [
|
|||
"2023/day8/rust",
|
||||
"2023/day9/rust",
|
||||
"2023/day11/rust",
|
||||
"2023/day15/rust",
|
||||
]
|
||||
|
|
Loading…
Reference in a new issue