This commit is contained in:
nora 2023-12-18 19:58:06 +01:00
parent 4a45b157dd
commit f341362bed
7 changed files with 120 additions and 0 deletions

15
2023/day15/Cargo.toml Normal file
View file

@ -0,0 +1,15 @@
[package]
name = "day15"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nom.workspace = true
helper.workspace = true
divan.workspace = true
[[bench]]
name = "benches"
harness = false

View file

@ -0,0 +1,3 @@
fn main() {
day15::bench();
}

1
2023/day15/input.txt Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7

79
2023/day15/src/lib.rs Normal file
View file

@ -0,0 +1,79 @@
use helper::{Day, Variants};
pub fn main() {
helper::main::<Day15>(include_str!("../input.txt"));
}
struct Day15;
helper::define_variants! {
day => crate::Day15;
part1 {
basic => crate::part1;
}
part2 {
basic => crate::part2;
}
}
impl Day for Day15 {
fn part1() -> Variants {
part1_variants!(construct_variants)
}
fn part2() -> Variants {
part2_variants!(construct_variants)
}
}
fn part1(input: &str) -> u64 {
input.trim_end().split(",").map(hash).sum()
}
fn hash(s: &str) -> u64 {
s.bytes()
.fold(0, |state, b| ((state + u64::from(b)) * 17) % 256)
}
fn part2(input: &str) -> u64 {
let mut boxes = vec![Vec::<(&str, u64)>::new(); 256];
for step in input.trim_end().split(',') {
if let Some(label) = step.strip_suffix('-') {
let b = &mut boxes[hash(label) as usize];
b.retain(|lens| lens.0 != label);
} else {
let (label, number) = step.split_once("=").unwrap();
let number = number.parse().unwrap();
let b = &mut boxes[hash(label) as usize];
if let Some(existing) = b.iter().position(|lens| lens.0 == label) {
b[existing] = (label, number);
} else {
b.push((label, number));
}
}
}
boxes
.iter()
.enumerate()
.flat_map(|(box_idx, b)| {
b.iter().enumerate().map(move |(lens_idx, lens)| {
(1 + (box_idx as u64)) * ((lens_idx as u64) + 1) * lens.1
})
})
.sum()
}
helper::tests! {
day15 Day15;
part1 {
small => 1320;
default => 513643;
}
part2 {
small => 145;
default => 265345;
}
}
helper::benchmarks! {}

3
2023/day15/src/main.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
day15::main();
}

18
Cargo.lock generated
View file

@ -224,6 +224,24 @@ dependencies = [
"nom", "nom",
] ]
[[package]]
name = "day12"
version = "0.1.0"
dependencies = [
"divan",
"helper",
"nom",
]
[[package]]
name = "day15"
version = "0.1.0"
dependencies = [
"divan",
"helper",
"nom",
]
[[package]] [[package]]
name = "divan" name = "divan"
version = "0.1.4" version = "0.1.4"