aoc2019/day5/src/main.rs

83 lines
2.9 KiB
Rust

use shared::intcode::{IntCode, SimulateStep, CELL};
fn run_air_conditioner(mut ic: IntCode) -> (Vec<CELL>, 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::<IntCode>().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);
}
}