add: day 11, stub of day12
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
use std::collections::{HashMap, HashSet, VecDeque};
|
||||
|
||||
use advent_of_code_2024::{add_pair, make_main, mul_pair, next, nexti64, Pair, SResult};
|
||||
|
||||
make_main!();
|
||||
|
||||
fn solve(lines: Vec<String>) -> SResult<(usize, usize)> {
|
||||
assert_eq!(1, lines.len());
|
||||
let state: Vec<usize> = lines[0]
|
||||
.split_ascii_whitespace()
|
||||
.map(|c| c.parse::<usize>().unwrap())
|
||||
.collect();
|
||||
|
||||
let mut total = 0;
|
||||
for digit in state.iter() {
|
||||
total += one(vec!(*digit), 75);
|
||||
}
|
||||
|
||||
Ok((one(state, 25), total))
|
||||
}
|
||||
|
||||
fn one(vstate: Vec<usize>, reps: usize) -> usize {
|
||||
let mut state: HashMap<usize, usize> = HashMap::default();
|
||||
for n in vstate {
|
||||
*state.entry(n).or_insert(0) += 1;
|
||||
}
|
||||
for _ in 0..reps {
|
||||
let mut next: HashMap<usize, usize> = HashMap::with_capacity(state.len());
|
||||
for (key, count) in state.into_iter() {
|
||||
if key == 0 {
|
||||
*next.entry(1).or_insert(0) += count;
|
||||
} else if digit_count(key) % 2 == 0 {
|
||||
let new_digits = split(key);
|
||||
*next.entry(new_digits.0).or_insert(0) += count;
|
||||
*next.entry(new_digits.1).or_insert(0) += count;
|
||||
} else {
|
||||
|
||||
*next.entry(key*2024).or_insert(0) += count;
|
||||
}
|
||||
}
|
||||
|
||||
state = next;
|
||||
}
|
||||
|
||||
state.iter().map(|a| a.1).sum()
|
||||
|
||||
}
|
||||
|
||||
fn digit_count(mut n: usize) -> usize {
|
||||
let mut count = 0;
|
||||
while n > 0 {
|
||||
count += 1;
|
||||
n /= 10;
|
||||
}
|
||||
count
|
||||
}
|
||||
|
||||
fn split(mut n: usize) -> (usize, usize) {
|
||||
let size = digit_count(n);
|
||||
let mut a = 0;
|
||||
let mut off = 1;
|
||||
for _ in 0..size/2 {
|
||||
a += (n % 10) * off;
|
||||
off *= 10;
|
||||
n /= 10;
|
||||
}
|
||||
(n, a)
|
||||
}
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use advent_of_code_2024::input;
|
||||
|
||||
use super::*;
|
||||
#[test]
|
||||
fn sample_input() {
|
||||
let strings: Vec<String> = input!("d11p1.txt");
|
||||
let got = solve(strings).unwrap();
|
||||
assert_eq!(got, (55312, 65601038650482));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
125 17
|
||||
@@ -0,0 +1,23 @@
|
||||
use std::collections::{HashMap, HashSet, VecDeque};
|
||||
|
||||
use advent_of_code_2024::{add_pair, make_main, mul_pair, next, nexti64, Pair, SResult};
|
||||
|
||||
make_main!();
|
||||
|
||||
fn solve(lines: Vec<String>) -> SResult<(usize, usize)> {
|
||||
Ok((0, 0))
|
||||
}
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use advent_of_code_2024::input;
|
||||
|
||||
use super::*;
|
||||
#[test]
|
||||
fn sample_input() {
|
||||
let strings: Vec<String> = input!("d11p1.txt");
|
||||
let got = solve(strings).unwrap();
|
||||
assert_eq!(got, (0, 0));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user