diff --git a/2019/07/src/main.rs b/2019/07/src/main.rs index b92fce7..11f68a9 100644 --- a/2019/07/src/main.rs +++ b/2019/07/src/main.rs @@ -2,6 +2,6 @@ use intcode::*; pub fn main() { let input = read_input(); - println!("Part 1: {}", find_max(0..5, &input)); - println!("Part 2: {}", find_max(5..10, &input)); + println!("Part 1: {}", find_max(0..5, &input).unwrap()); + println!("Part 2: {}", find_max(5..10, &input).unwrap()); } diff --git a/2019/intcode/src/lib.rs b/2019/intcode/src/lib.rs index d1294ab..2ff62c5 100644 --- a/2019/intcode/src/lib.rs +++ b/2019/intcode/src/lib.rs @@ -1,4 +1,5 @@ use itertools::Itertools; +use std::convert::TryFrom; use std::io::{self, BufRead}; use std::ops::Range; @@ -156,30 +157,37 @@ fn execute(op: Operation, input: &mut Vec, pos: &mut i64) -> Option { } } -pub fn find_max(range: Range, input: &Vec) -> i64 { - range - .permutations(5) - .scan(0, |&mut mut acc, amps| { - let mut machines: Vec<_> = amps - .into_iter() - .map(|amp| Machine { - tape: input.clone(), - pos: 0, - params: vec![amp], - }) - .collect(); - for state in (0..5).cycle() { - let mut machine = machines.get_mut(state).unwrap(); - machine.params.insert(0, acc); - match execute_machine(&mut machine) { - Err(output) => acc = output, - Ok(_) => break, - } - } - Some(acc) +pub fn run_for_input(input: &Vec, acc: &mut i64, amps: Vec) -> i64 { + let mut machines: Vec<_> = amps + .into_iter() + .map(|amp| Machine { + tape: input.clone(), + pos: 0, + params: vec![amp], + }) + .collect(); + for state in (0..machines.len()).cycle() { + let mut machine = machines.get_mut(state).unwrap(); + machine.params.insert(0, *acc); + match execute_machine(&mut machine) { + Err(output) => *acc = output, + Ok(_) => break, + } + } + *acc +} + +pub fn find_max(range: Range, input: &Vec) -> Option { + usize::try_from(range.end - range.start) + .ok() + .and_then(|len| { + range + .permutations(len) + .scan(0, |&mut mut acc, amps| { + Some(run_for_input(input, &mut acc, amps)) + }) + .max() }) - .max() - .unwrap() } fn execute_machine(machine: &mut Machine) -> Result { diff --git a/2019/intcode/src/tests.rs b/2019/intcode/src/tests.rs index 2a5bf3a..39d6cdc 100644 --- a/2019/intcode/src/tests.rs +++ b/2019/intcode/src/tests.rs @@ -12,21 +12,23 @@ fn test_find_max() { 0..5, &parse_test_input("3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0") ), - 43210 + Some(43210) ); assert_eq!( find_max( 0..5, - &parse_test_input("3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0") + &parse_test_input( + "3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0" + ) ), - 54321 + Some(54321) ); assert_eq!( find_max( 0..5, &parse_test_input("3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0") ), - 65210 + Some(65210) ); } @@ -37,13 +39,13 @@ fn test_find_max_with_loops() { 5..10, &parse_test_input("3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5") ), - 139629729 + Some(139629729) ); assert_eq!( find_max( 5..10, &parse_test_input("3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10") ), - 18216 + Some(18216) ); }