summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bin/day_14.rs99
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);
+}