day_11: part 1 done

This commit is contained in:
2024-12-15 22:38:44 +01:00
parent d5dae5dee7
commit 49ed857a18
6 changed files with 85 additions and 6 deletions

View File

@@ -7,9 +7,10 @@
// mod sat_07;
// mod sun_08;
// mod mon_09;
mod tue_10;
// mod tue_10;
mod types;
mod utils;
mod wed_11;
use types::*;
@@ -78,8 +79,15 @@ pub fn historian_hysteria() {
// println!("The disk checksum is {}", disk_checksum);
// Tuesday 10
let (trailhead_score, full_trailhead_score) =
tue_10::hoof_it("./assets/day_10_trail_map_input");
println!("The trail head sum score is {}", trailhead_score);
println!("The full trail head sum score is {}", full_trailhead_score);
// let (trailhead_score, full_trailhead_score) =
// tue_10::hoof_it("./assets/day_10_trail_map_input");
// println!("The trail head sum score is {}", trailhead_score);
// println!("The full trail head sum score is {}", full_trailhead_score);
let blink_count: usize = 25;
let stone_count =
wed_11::plutonian_pebbles("./assets/day_11_stone_arrangement_input", blink_count);
println!(
"The total of stones after {} is {}",
blink_count, stone_count
);
}

View File

@@ -81,3 +81,8 @@ pub type DiskChecksum = usize;
pub type TrailScore = usize;
pub type TrailPosition = usize;
pub type TrailMap = Vec<Vec<TrailPosition>>;
// Plutonian Pebbles
pub type StoneCount = usize;
pub type Stone = usize;
pub type StoneList = Vec<Stone>;

View File

@@ -206,6 +206,18 @@ pub fn read_trail_map_input(input: &str) -> TrailMap {
trail_map
}
pub fn read_stone_arrangement(input: &str) -> StoneList {
let mut stone_list: StoneList = vec![];
for line in read_to_string(input).unwrap().lines() {
for number in line.split(" ") {
stone_list.push(number.parse::<Stone>().unwrap());
}
}
stone_list
}
pub fn calc_distance<T>(num_1: T, num_2: T) -> T
where
T: PartialOrd + Sub<Output = T>,

View File

@@ -0,0 +1,53 @@
use super::*;
pub fn plutonian_pebbles(input: &str, blink_count: usize) -> StoneCount {
let stone_list = utils::read_stone_arrangement(input);
let stone_list = apply_rules(stone_list, blink_count);
stone_list.len()
}
fn apply_rules(stone_list: StoneList, blink_count: usize) -> StoneList {
let mut new_stone_list = stone_list.clone();
for _ in 0..blink_count {
new_stone_list = blink(new_stone_list);
}
new_stone_list
}
fn blink(stone_list: StoneList) -> StoneList {
let mut new_stone_list: StoneList = vec![];
const STONE_MULTIPLIER: usize = 2024;
for stone in stone_list {
match stone {
0 => {
new_stone_list.push(1);
}
stone if stone.to_string().len() % 2 == 0 => {
let (left, right) = split_num(stone);
new_stone_list.push(left);
new_stone_list.push(right);
}
_ => {
new_stone_list.push(stone * STONE_MULTIPLIER);
}
}
}
new_stone_list
}
fn split_num(num: Stone) -> (Stone, Stone) {
let split_index = num.to_string().len() / 2;
let binding = num.to_string();
let (first, second) = binding.split_at(split_index);
(
first.parse::<Stone>().unwrap(),
second.parse::<Stone>().unwrap(),
)
}