day15 solution
parent
95003d0b0a
commit
b6111fe337
|
@ -0,0 +1,64 @@
|
|||
use aoc_runner_derive::aoc;
|
||||
|
||||
fn hash(input: &str) -> usize {
|
||||
let mut cur: usize = 0;
|
||||
for c in input.chars() {
|
||||
cur = ((cur + c as usize) * 17) % 256;
|
||||
}
|
||||
cur
|
||||
}
|
||||
|
||||
#[aoc(day15, part1)]
|
||||
fn part1(input: &str) -> usize {
|
||||
input.trim_end().split(",").map(|t| hash(t)).sum()
|
||||
}
|
||||
|
||||
#[aoc(day15, part2)]
|
||||
fn part2(input: &str) -> usize {
|
||||
let mut boxes: Vec<Vec<(&str, usize)>> = vec![];
|
||||
for _ in 0..256 {
|
||||
boxes.push(vec![]);
|
||||
}
|
||||
for lens in input.trim_end().split(",") {
|
||||
if lens.contains("-") {
|
||||
let parts = lens.split("-").collect::<Vec<&str>>();
|
||||
let h = hash(parts[0]);
|
||||
if let Some(index) = boxes[h].iter().position(|t| t.0 == parts[0]) {
|
||||
boxes[h].remove(index);
|
||||
}
|
||||
} else {
|
||||
let parts = lens.split("=").collect::<Vec<&str>>();
|
||||
let h = hash(parts[0]);
|
||||
let n = (parts[0], parts[1].parse::<usize>().unwrap());
|
||||
if let Some(index) = boxes[h].iter().position(|t| t.0 == parts[0]) {
|
||||
boxes[h][index].1 = n.1;
|
||||
} else {
|
||||
boxes[h].push(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let mut sum = 0;
|
||||
for (box_index, b) in boxes.iter().enumerate() {
|
||||
if b.is_empty() {
|
||||
continue;
|
||||
}
|
||||
for (index, lens) in b.iter().enumerate() {
|
||||
sum += (box_index + 1) * (index + 1) * lens.1;
|
||||
}
|
||||
}
|
||||
sum
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
const SAMPLE_DATA: &'static str = "rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7";
|
||||
|
||||
#[test]
|
||||
fn sample_data() {
|
||||
assert_eq!(part1(&SAMPLE_DATA), 1320);
|
||||
assert_eq!(part2(&SAMPLE_DATA), 145);
|
||||
}
|
||||
}
|
|
@ -14,5 +14,6 @@ mod day11;
|
|||
mod day12;
|
||||
mod day13;
|
||||
mod day14;
|
||||
mod day15;
|
||||
|
||||
aoc_lib! { year = 2023 }
|
||||
|
|
Loading…
Reference in New Issue