mirror of
https://github.com/Noratrieb/advent-of-code.git
synced 2026-01-14 17:45:02 +01:00
day 15
This commit is contained in:
parent
4a45b157dd
commit
f341362bed
7 changed files with 120 additions and 0 deletions
15
2023/day15/Cargo.toml
Normal file
15
2023/day15/Cargo.toml
Normal 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
|
||||
3
2023/day15/benches/benches.rs
Normal file
3
2023/day15/benches/benches.rs
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
fn main() {
|
||||
day15::bench();
|
||||
}
|
||||
1
2023/day15/input.txt
Normal file
1
2023/day15/input.txt
Normal file
File diff suppressed because one or more lines are too long
1
2023/day15/input_small.txt
Normal file
1
2023/day15/input_small.txt
Normal 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
79
2023/day15/src/lib.rs
Normal 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
3
2023/day15/src/main.rs
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
fn main() {
|
||||
day15::main();
|
||||
}
|
||||
18
Cargo.lock
generated
18
Cargo.lock
generated
|
|
@ -224,6 +224,24 @@ dependencies = [
|
|||
"nom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "day12"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"divan",
|
||||
"helper",
|
||||
"nom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "day15"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"divan",
|
||||
"helper",
|
||||
"nom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "divan"
|
||||
version = "0.1.4"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue