From cfd9b4f2ad1a09bedf7f764f84448a61faab54a3 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Tue, 19 Apr 2022 20:26:02 +0200 Subject: Refile for merging repos --- 2018/src/bin/day_14.rs | 111 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 2018/src/bin/day_14.rs (limited to '2018/src/bin/day_14.rs') diff --git a/2018/src/bin/day_14.rs b/2018/src/bin/day_14.rs new file mode 100644 index 0000000..cb16623 --- /dev/null +++ b/2018/src/bin/day_14.rs @@ -0,0 +1,111 @@ +extern crate advent_of_code_2018; +use advent_of_code_2018::*; + +use std::error::Error; +use std::path::PathBuf; + +// cargo watch -cs "cargo run --release --bin day_14" + +fn main() -> Result<(), Box> { + let input = 540561; + + let scoreboard = find_ten_scoreboard_after(input); + + println!("Result: "); + scoreboard.iter().for_each(|s| { + print!("{}", s); + }); + println!(); + + let first_occurence = find_first_occurence_of(input); + debug!(first_occurence); + + Ok(()) +} + +fn find_ten_scoreboard_after(input: usize) -> Vec { + let mut scoreboard = vec!(3,7); + let mut elf1_pos = 0; + let mut elf2_pos = 1; + + while scoreboard.len() < (input + 10) { + let next = scoreboard[elf1_pos] + scoreboard[elf2_pos]; + for digit in number_to_digits_vec(next) { + scoreboard.push(digit); + } + + elf1_pos = (elf1_pos + 1 + scoreboard[elf1_pos]) % scoreboard.len(); + elf2_pos = (elf2_pos + 1 + scoreboard[elf2_pos]) % scoreboard.len(); + } + + scoreboard.iter().skip(input).take(10).cloned().collect() +} + +fn find_first_occurence_of(input: usize) -> usize { + let target_sequence = number_to_digits_vec(input); + debug!(target_sequence); + + let mut scoreboard = vec!(3,7); + let mut elf1_pos = 0; + let mut elf2_pos = 1; + let mut target_index = None; + + while target_index.is_none() { + let next = scoreboard[elf1_pos] + scoreboard[elf2_pos]; + for digit in number_to_digits_vec(next) { + scoreboard.push(digit); + } + + elf1_pos = (elf1_pos + 1 + scoreboard[elf1_pos]) % scoreboard.len(); + elf2_pos = (elf2_pos + 1 + scoreboard[elf2_pos]) % scoreboard.len(); + + if scoreboard.len() >= target_sequence.len() + 2 { + for potential_target_index in scoreboard.len()-target_sequence.len()-2..scoreboard.len()-target_sequence.len()+1 { + let found = scoreboard.iter() + .skip(potential_target_index) + .take(target_sequence.len()) + .zip(target_sequence.iter()) + .all(|(a, b)| a == b); + if found { + target_index = Some(potential_target_index); + } + } + } + } + + target_index.unwrap() +} + +fn number_to_digits_vec(input: usize) -> Vec { + if input == 0 { + return vec!(0); + } + + let mut result = Vec::new(); + let mut acc = input; + while acc > 0 { + result.push(acc % 10); + acc /= 10; + } + result.reverse(); + result +} + +#[test] +fn vectorification() { + assert_eq!(number_to_digits_vec(10), vec!(1, 0)); + assert_eq!(number_to_digits_vec(1), vec!(1)); + assert_eq!(number_to_digits_vec(0), vec!(0)); +} + +#[test] +fn part1_examples() { + assert_eq!(find_ten_scoreboard_after(9), vec!(5,1,5,8,9,1,6,7,7,9)); + assert_eq!(find_ten_scoreboard_after(2018), vec!(5,9,4,1,4,2,9,8,8,2)); +} + +#[test] +fn part2_examples() { + assert_eq!(find_first_occurence_of(51589), 9); + assert_eq!(find_first_occurence_of(59414), 2018); +} -- cgit v1.2.3