|
1 | 1 | //! # Lobby |
2 | | -pub fn parse(input: &str) -> Vec<&[u8]> { |
3 | | - input.lines().map(str::as_bytes).collect() |
| 2 | +use std::mem::replace; |
| 3 | + |
| 4 | +pub fn parse(input: &str) -> Vec<&str> { |
| 5 | + input.lines().collect() |
4 | 6 | } |
5 | 7 |
|
6 | | -pub fn part1(input: &[&[u8]]) -> u64 { |
7 | | - solve(input, 2) |
| 8 | +pub fn part1(input: &[&str]) -> u64 { |
| 9 | + solve::<2>(input) |
8 | 10 | } |
9 | 11 |
|
10 | | -pub fn part2(input: &[&[u8]]) -> u64 { |
11 | | - solve(input, 12) |
| 12 | +pub fn part2(input: &[&str]) -> u64 { |
| 13 | + solve::<12>(input) |
12 | 14 | } |
13 | 15 |
|
14 | | -fn solve(banks: &[&[u8]], limit: usize) -> u64 { |
15 | | - banks |
| 16 | +fn solve<const N: usize>(input: &[&str]) -> u64 { |
| 17 | + let mut batteries = [0; N]; |
| 18 | + |
| 19 | + input |
16 | 20 | .iter() |
17 | 21 | .map(|&bank| { |
18 | | - let mut max = 0; |
19 | | - let mut start = 0; |
20 | | - |
21 | | - (0..limit).rev().fold(0, |joltage, digit| { |
22 | | - let end = bank.len() - digit; |
| 22 | + let end = bank.len() - N; |
| 23 | + batteries.copy_from_slice(&bank.as_bytes()[end..]); |
23 | 24 |
|
24 | | - (max, start) = (start..end).fold((0, 0), |(max, start), i| { |
25 | | - if bank[i] > max { (bank[i], i + 1) } else { (max, start) } |
26 | | - }); |
| 25 | + for mut next in bank[..end].bytes().rev() { |
| 26 | + for battery in &mut batteries { |
| 27 | + if next < *battery { |
| 28 | + break; |
| 29 | + } |
| 30 | + next = replace(battery, next); |
| 31 | + } |
| 32 | + } |
27 | 33 |
|
28 | | - 10 * joltage + (max - b'0') as u64 |
29 | | - }) |
| 34 | + batteries.iter().fold(0, |joltage, &b| 10 * joltage + (b - b'0') as u64) |
30 | 35 | }) |
31 | 36 | .sum() |
32 | 37 | } |
0 commit comments