91 lines
2.5 KiB
Rust
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);
|
|
}
|
|
}
|