diff options
author | Justin Worthe <justin@worthe-it.co.za> | 2018-12-14 07:49:19 +0200 |
---|---|---|
committer | Justin Worthe <justin@worthe-it.co.za> | 2018-12-14 07:49:19 +0200 |
commit | 3dabb303715f1d6393f44f5f0aa6aa8c1fd9ee08 (patch) | |
tree | 4b7403f559f786e000b8ceb0c5f17d2b8552af59 /src/bin | |
parent | a872ebea64f6f25d5f244353cfdf0e491132ac3f (diff) |
Day 14: Building a list of digits
Diffstat (limited to 'src/bin')
-rw-r--r-- | src/bin/day_14.rs | 99 |
1 files changed, 96 insertions, 3 deletions
diff --git a/src/bin/day_14.rs b/src/bin/day_14.rs index 09206c7..cb16623 100644 --- a/src/bin/day_14.rs +++ b/src/bin/day_14.rs @@ -7,12 +7,105 @@ use std::path::PathBuf; // cargo watch -cs "cargo run --release --bin day_14" fn main() -> Result<(), Box<Error>> { - let input = read_file(&PathBuf::from("inputs/14.txt"))?; - - println!("Input: {:?}", input); + 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<usize> { + 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<usize> { + 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); +} |