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); }