use shared::intcode::{IntCode, SimulateStep, CELL}; fn run_air_conditioner(mut ic: IntCode) -> (Vec, CELL) { let mut test_results = Vec::new(); ic.next_input = Some(1); // air conditioner unit ID loop { match ic.simulate_step() { SimulateStep::Finished => { let diagnostic = test_results.pop().expect("missing diagnostic code"); return (test_results, diagnostic); }, SimulateStep::Output(v) => test_results.push(v), SimulateStep::WaitForInput => panic!("AirConditioner already initialized, no further input"), } } } fn run_thermal_radiator_controller(mut ic: IntCode) -> CELL { ic.next_input = Some(5); // thermal radiator controller ID let diagnostic = ic.simulate_step().expect_output(); ic.simulate_step().expect_finished(); diagnostic } fn main() { let ic = include_str!("input.txt").parse::().unwrap(); println!("AirConditioner: {:?}", run_air_conditioner(ic.clone())); println!("ThermalRadiatorController: {:?}", run_thermal_radiator_controller(ic)); } #[cfg(test)] mod day5test { use super::*; fn parse(input: &str) -> IntCode { input.parse().unwrap() } fn run_single_io(code: &str, input: CELL) -> CELL { let mut ic = parse(code); ic.next_input = Some(input); let result = ic.simulate_step().expect_output(); ic.simulate_step().expect_finished(); result } #[test] fn examples1() { // no runnable examples } #[test] fn examples2() { // position mode: input is 8? assert_eq!(run_single_io("3,9,8,9,10,9,4,9,99,-1,8", 8), 1); assert_eq!(run_single_io("3,9,8,9,10,9,4,9,99,-1,8", 7), 0); assert_eq!(run_single_io("3,9,8,9,10,9,4,9,99,-1,8", 9), 0); // position mode: input less than 8? assert_eq!(run_single_io("3,9,7,9,10,9,4,9,99,-1,8", 8), 0); assert_eq!(run_single_io("3,9,7,9,10,9,4,9,99,-1,8", 7), 1); assert_eq!(run_single_io("3,9,7,9,10,9,4,9,99,-1,8", 9), 0); // immediate mode: input is 8? assert_eq!(run_single_io("3,3,1108,-1,8,3,4,3,99", 8), 1); assert_eq!(run_single_io("3,3,1108,-1,8,3,4,3,99", 7), 0); assert_eq!(run_single_io("3,3,1108,-1,8,3,4,3,99", 9), 0); // immediate mode: input less than 8? assert_eq!(run_single_io("3,3,1107,-1,8,3,4,3,99", 8), 0); assert_eq!(run_single_io("3,3,1107,-1,8,3,4,3,99", 7), 1); assert_eq!(run_single_io("3,3,1107,-1,8,3,4,3,99", 9), 0); // position mode: (bool) input assert_eq!(run_single_io("3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9", 0), 0); assert_eq!(run_single_io("3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9", 1), 1); assert_eq!(run_single_io("3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9", 999), 1); assert_eq!(run_single_io("3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9", -1), 1); // immediate mode: (bool) input assert_eq!(run_single_io("3,3,1105,-1,9,1101,0,0,12,4,12,99,1", 0), 0); assert_eq!(run_single_io("3,3,1105,-1,9,1101,0,0,12,4,12,99,1", 1), 1); assert_eq!(run_single_io("3,3,1105,-1,9,1101,0,0,12,4,12,99,1", 999), 1); assert_eq!(run_single_io("3,3,1105,-1,9,1101,0,0,12,4,12,99,1", -1), 1); } }