83 lines
2.9 KiB
Rust
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);
|
|
}
|
|
}
|