day3: part 2, add memoize

This commit is contained in:
2025-12-02 21:30:31 -08:00
parent 0ea40260c1
commit 47f7068705
3 changed files with 108 additions and 21 deletions

View File

@@ -1,36 +1,52 @@
use aoc_runner_derive::{aoc, aoc_generator};
use std::collections::HashMap;
type Bank = Vec<u8>;
use aoc_runner_derive::{aoc, aoc_generator};
use lazy_static::lazy_static;
use memoize::memoize;
type Bank = [u8];
#[aoc_generator(day3)]
fn parse(input: &str) -> Vec<Bank> {
fn parse(input: &str) -> Vec<Vec<u8>> {
input
.lines()
.map(|bank| bank.bytes().map(|c| c - b'0').collect())
.collect()
}
fn max_joltage(bank: &Bank, n: usize) -> u64 {
assert_eq!(n, 2, "unimplemented");
let mut max = 0;
for start in 0..bank.len() - 1 {
let cur = bank[start] as u64 * 10u64.pow(n as u32 - 1)
+ *bank[start + 1..].iter().max().unwrap() as u64;
if cur > max {
max = cur
}
#[memoize]
fn max_joltage(bank: Vec<u8>, n: usize) -> u64 {
if n == 1 {
return *bank.iter().max().unwrap() as u64;
}
max
(0..bank.len() - n + 1)
.map(|start| {
bank[start] as u64 * 10u64.pow(n as u32 - 1)
+ max_joltage(bank[start + 1..].to_vec(), n - 1)
})
.max()
.unwrap()
// let mut max = 0;
// for start in 0..bank.len() - n + 1 {
// let cur = bank[start] as u64 * 10u64.pow(n as u32 - 1)
// + *bank[start + 1..].iter().max().unwrap() as u64;
// if cur > max {
// max = cur
// }
// }
// max
}
#[aoc(day3, part1)]
fn part1(input: &Vec<Bank>) -> u64 {
input.iter().map(|bank| max_joltage(bank, 2)).sum()
fn part1(input: &Vec<Vec<u8>>) -> u64 {
input.iter().map(|bank| max_joltage(bank.clone(), 2)).sum()
}
#[aoc(day3, part2)]
fn part2(input: &Vec<Bank>) -> u64 {
todo!()
fn part2(input: &Vec<Vec<u8>>) -> u64 {
input.iter().map(|bank| max_joltage(bank.clone(), 12)).sum()
}
#[cfg(test)]
@@ -49,6 +65,6 @@ mod tests {
#[test]
fn part2_example() {
assert_eq!(part2(&parse(EXAMPLE)), 0);
assert_eq!(part2(&parse(EXAMPLE)), 3121910778619);
}
}