From 21c50bd8e8314d9dabb1ed9dc40685125c7a33e4 Mon Sep 17 00:00:00 2001 From: Wesley Moore Date: Sat, 7 Dec 2019 23:15:36 +1100 Subject: [PATCH] Day 7 part 1 --- 2019/input/day7.txt | 1 + 2019/src/bin/day4.rs | 11 +------ 2019/src/bin/day7.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++ 2019/src/computer.rs | 2 +- 2019/src/lib.rs | 32 +++++++++++++++++++ 5 files changed, 111 insertions(+), 11 deletions(-) create mode 100644 2019/input/day7.txt create mode 100644 2019/src/bin/day7.rs diff --git a/2019/input/day7.txt b/2019/input/day7.txt new file mode 100644 index 0000000..a4594a3 --- /dev/null +++ b/2019/input/day7.txt @@ -0,0 +1 @@ +3,8,1001,8,10,8,105,1,0,0,21,42,55,64,77,94,175,256,337,418,99999,3,9,102,4,9,9,1001,9,5,9,102,2,9,9,101,3,9,9,4,9,99,3,9,102,2,9,9,101,5,9,9,4,9,99,3,9,1002,9,4,9,4,9,99,3,9,102,4,9,9,101,5,9,9,4,9,99,3,9,102,5,9,9,1001,9,3,9,1002,9,5,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,99 diff --git a/2019/src/bin/day4.rs b/2019/src/bin/day4.rs index 750fc9d..cff7a13 100644 --- a/2019/src/bin/day4.rs +++ b/2019/src/bin/day4.rs @@ -1,3 +1,4 @@ +use advent_of_code::number_to_digits; use std::ops::RangeInclusive; const INPUT: RangeInclusive = 356261..=846303; @@ -43,16 +44,6 @@ fn meets_criteria_part2(number: &u32) -> bool { chunks.iter().any(|chunk| chunk.len() == 2) && digits.windows(2).all(|pair| pair[1] >= pair[0]) } -fn number_to_digits(mut number: u32) -> [u8; 6] { - let mut digits = [0; 6]; - digits.iter_mut().rev().for_each(|digit| { - *digit = (number % 10) as u8; - number /= 10; - }); - - digits -} - #[cfg(test)] mod tests { use super::*; diff --git a/2019/src/bin/day7.rs b/2019/src/bin/day7.rs new file mode 100644 index 0000000..497c2cb --- /dev/null +++ b/2019/src/bin/day7.rs @@ -0,0 +1,76 @@ +use std::{fs, io}; + +use advent_of_code::{computer, input}; + +const AMPLIFIERS: usize = 5; + +fn main() -> io::Result<()> { + let source = fs::read_to_string("input/day7.txt")?; + let data = input::read_separated_line(',', &source)?; + + let max = phase_settings() + .iter() + .map(|settings| { + let mut output = 0; + for phase_setting in settings.iter() { + let input = vec![output, *phase_setting]; + let mut program = data.clone(); + let mut computer = computer::Computer::new(&mut program, input); + computer.run(None, None); + output = computer.output()[0]; + } + output + }) + .max() + .unwrap(); + println!("Part 1: {}", max); + + Ok(()) +} + +fn phase_settings() -> Vec<[i32; AMPLIFIERS]> { + let mut permutations = Vec::new(); + let mut indexes = [0i32; AMPLIFIERS]; + let mut elements = [0i32; AMPLIFIERS]; + for i in 0i32..=4 { + elements[i as usize] = i; + } + + permutations.push(elements); + + let mut i = 0; + while i < AMPLIFIERS { + if indexes[i] < i as i32 { + elements.swap(if i % 2 == 0 { 0 } else { indexes[i] as usize }, i); + permutations.push(elements); + indexes[i] += 1; + i = 0; + } else { + indexes[i] = 0; + i += 1; + } + } + + permutations +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_phase_setting_generation() { + let settings = phase_settings(); + assert_eq!( + &settings[0..6], + &[ + [0, 1, 2, 3, 4], + [1, 0, 2, 3, 4], + [2, 0, 1, 3, 4], + [0, 2, 1, 3, 4], + [1, 2, 0, 3, 4], + [2, 1, 0, 3, 4] + ] + ); + } +} diff --git a/2019/src/computer.rs b/2019/src/computer.rs index e38afb6..d3acddd 100644 --- a/2019/src/computer.rs +++ b/2019/src/computer.rs @@ -188,7 +188,7 @@ mod tests { fn test_day2() { let input = fs::read_to_string("input/day2.txt").unwrap(); let mut data = input::read_separated_line(',', &input).unwrap(); - let mut program = Computer::new(&mut data); + let mut program = Computer::new(&mut data, vec![]); // Check that day2 still works wirh run through this implementation program.run(Some(12), Some(2)); diff --git a/2019/src/lib.rs b/2019/src/lib.rs index 2e7a87e..e66e244 100644 --- a/2019/src/lib.rs +++ b/2019/src/lib.rs @@ -1,3 +1,35 @@ pub mod computer; pub mod input; pub mod point; + +pub fn number_to_digits(mut number: u32) -> [u8; 6] { + let mut digits = [0; 6]; + digits.iter_mut().rev().for_each(|digit| { + *digit = (number % 10) as u8; + number /= 10; + }); + + digits +} + +pub fn quinary(upto: u32) -> Vec<[u8; 5]> { + let limit = number_to_digits(upto); + let mut result = Vec::new(); + + let mut counter = [0; 5]; + while &counter != &limit[1..] { + result.push(counter); + counter[0] += 1; + for i in 0..5 { + if counter[i] == 5 { + counter[i] = 0; + counter[i + 1] += 1; + } else { + break; + } + } + } + result.push(counter); + + result +}