day 11
This commit is contained in:
@@ -16,6 +16,7 @@ if ! [[ "$X" =~ ^[0-9]{2}$ ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
cp src/template.rs src/day$X.rs
|
cp src/template.rs src/day$X.rs
|
||||||
|
git add src/day$X.rs
|
||||||
touch input/day$X.txt
|
touch input/day$X.txt
|
||||||
|
|
||||||
# Define the placeholder you want to replace
|
# Define the placeholder you want to replace
|
||||||
|
|||||||
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 day08;
|
||||||
pub mod day09;
|
pub mod day09;
|
||||||
pub mod day10;
|
pub mod day10;
|
||||||
|
pub mod day11;
|
||||||
// PLACEHOLDER
|
// PLACEHOLDER
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ fn main() {
|
|||||||
(8, day08::day_main),
|
(8, day08::day_main),
|
||||||
(9, day09::day_main),
|
(9, day09::day_main),
|
||||||
(10, day10::day_main),
|
(10, day10::day_main),
|
||||||
|
(11, day11::day_main),
|
||||||
// PLACEHOLDER
|
// PLACEHOLDER
|
||||||
]);
|
]);
|
||||||
let day: Option<u8> = args().nth(1).and_then(|a| a.parse().ok());
|
let day: Option<u8> = args().nth(1).and_then(|a| a.parse().ok());
|
||||||
|
|||||||
Reference in New Issue
Block a user