day 11
This commit is contained in:
65
src/day11.rs
Normal file
65
src/day11.rs
Normal file
@@ -0,0 +1,65 @@
|
||||
use std::{collections::HashMap, fs::read_to_string};
|
||||
|
||||
pub fn day_main() {
|
||||
let input = read_to_string("input/day11.txt").unwrap();
|
||||
let input = input.trim();
|
||||
println!(" part1: {}", part1(input));
|
||||
println!(" part2: {}", part2(input));
|
||||
}
|
||||
|
||||
type RiddleResult = usize;
|
||||
|
||||
fn part1(input: &str) -> RiddleResult {
|
||||
solve(input, 25)
|
||||
}
|
||||
|
||||
fn solve(input: &str, blinks: i32) -> usize {
|
||||
let mut stones: HashMap<String, usize> = input.split(" ").map(|v| (v.to_string(), 1)).collect();
|
||||
let mut next = HashMap::new();
|
||||
for _ in 0..blinks {
|
||||
for (k, v) in stones {
|
||||
if k.as_str() == "0" {
|
||||
next.entry("1".to_string())
|
||||
.and_modify(|count| *count += v)
|
||||
.or_insert(v);
|
||||
} else if k.len() % 2 == 0 {
|
||||
let (a, b) = k.split_at(k.len() / 2);
|
||||
next.entry(a.to_string())
|
||||
.and_modify(|count| *count += v)
|
||||
.or_insert(v);
|
||||
let x = b.parse::<usize>().unwrap().to_string();
|
||||
next.entry(x).and_modify(|count| *count += v).or_insert(v);
|
||||
} else {
|
||||
let d: usize = k.parse().unwrap();
|
||||
let k_new = d * 2024;
|
||||
next.entry(k_new.to_string())
|
||||
.and_modify(|count| *count += v)
|
||||
.or_insert(v);
|
||||
}
|
||||
}
|
||||
stones = next;
|
||||
next = HashMap::new();
|
||||
}
|
||||
stones.values().to_owned().sum()
|
||||
}
|
||||
|
||||
fn part2(input: &str) -> RiddleResult {
|
||||
solve(input, 75)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::{part1, part2};
|
||||
|
||||
const TEST_INPUT: &str = r"";
|
||||
|
||||
#[test]
|
||||
fn test1() {
|
||||
assert_eq!(part1("125 17"), 55312);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test2() {
|
||||
assert_eq!(part2(TEST_INPUT), 0);
|
||||
}
|
||||
}
|
||||
@@ -8,5 +8,6 @@ pub mod day07;
|
||||
pub mod day08;
|
||||
pub mod day09;
|
||||
pub mod day10;
|
||||
pub mod day11;
|
||||
// PLACEHOLDER
|
||||
pub mod utils;
|
||||
|
||||
@@ -15,6 +15,7 @@ fn main() {
|
||||
(8, day08::day_main),
|
||||
(9, day09::day_main),
|
||||
(10, day10::day_main),
|
||||
(11, day11::day_main),
|
||||
// PLACEHOLDER
|
||||
]);
|
||||
let day: Option<u8> = args().nth(1).and_then(|a| a.parse().ok());
|
||||
|
||||
Reference in New Issue
Block a user