Day 14: Building a list of digits
authorJustin Worthe <justin@worthe-it.co.za>
Fri, 14 Dec 2018 05:49:19 +0000 (07:49 +0200)
committerJustin Worthe <justin@worthe-it.co.za>
Fri, 14 Dec 2018 05:49:19 +0000 (07:49 +0200)
src/bin/day_14.rs

index 09206c7..cb16623 100644 (file)
@@ -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);
+}