AoC2019/src/day2.rs

91 lines
2.5 KiB
Rust

use std::io::BufRead;
pub fn part1<F: BufRead> (input: F) {
let intcode = parse_input(input);
println!("{}", compute_result(intcode, 12, 2));
}
pub fn part2<F: BufRead> (input: F) {
let intcode = parse_input(input);
for noun in 0..99 {
for verb in 0..99 {
let res = compute_result(intcode.clone(), noun, verb);
if res == 19690720 {
println!("{}", noun * 100 + verb);
return;
}
}
}
}
fn parse_input<F: BufRead> (mut input: F) -> Vec<usize> {
let mut buf = String::new();
let _num_bytes = input.read_line(&mut buf).expect("Unable to first read line of input file");
buf.trim().split(",").filter_map(|n| n.parse().ok()).collect()
}
fn compute_result(mut src: Vec<usize>, param1: usize, param2: usize) -> usize {
src[1] = param1;
src[2] = param2;
let output = run_intcode(src, 0);
output[0]
}
fn compute_op(mut src: Vec<usize>, index: usize) -> Vec<usize> {
let lhs = src[src[index + 1]];
let rhs = src[src[index + 2]];
let res = match src[index] {
1 => lhs + rhs,
2 => lhs * rhs,
code => panic!("Unexpected operation {}, should be either 1 or 2", code)
};
let res_index = src[index + 3];
src[res_index] = res;
src
}
fn run_intcode(src: Vec<usize>, index: usize) -> Vec<usize> {
match src[index] {
1 | 2 => run_intcode(compute_op(src, index), index + 4),
99 => src,
code => panic!("Unexpected code {}", code),
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_run_intcode() {
let input1 = vec![1, 0, 0, 0, 99];
let input2 = vec![2, 3, 0, 3, 99];
let input3 = vec![2, 4, 4, 5, 99, 0];
let input4 = vec![1, 1, 1, 4, 99, 5, 6, 0, 99];
let input5 = vec![1,9,10,3,2,3,11,0,99,30,40,50];
let expected1 = vec![2, 0, 0, 0, 99];
let expected2 = vec![2, 3, 0, 6, 99];
let expected3 = vec![2, 4, 4, 5, 99, 9801];
let expected4 = vec![30, 1, 1, 4, 2, 5, 6, 0, 99];
let expected5 = vec![3500,9,10,70, 2,3,11,0, 99, 30,40,50];
let mut output;
output = run_intcode(input1, 0);
assert_eq!(output, expected1);
output = run_intcode(input2, 0);
assert_eq!(output, expected2);
output = run_intcode(input3, 0);
assert_eq!(output, expected3);
output = run_intcode(input4, 0);
assert_eq!(output, expected4);
output = run_intcode(input5, 0);
assert_eq!(output, expected5);
}
}