Compare commits
2 Commits
f3832e6d88
...
571c0c2511
Author | SHA1 | Date |
---|---|---|
|
571c0c2511 | |
|
9411a5231d |
|
@ -0,0 +1,30 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "day7"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"icc",
|
||||
"itertools",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
||||
|
||||
[[package]]
|
||||
name = "icc"
|
||||
version = "1.0.0"
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.10.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
|
@ -0,0 +1,10 @@
|
|||
[package]
|
||||
name = "day7"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
icc = { path = "../icc", version = "1.0.0"}
|
||||
itertools = "0.10.3"
|
|
@ -0,0 +1,132 @@
|
|||
use std::collections::VecDeque;
|
||||
use itertools::Itertools;
|
||||
|
||||
fn main() {
|
||||
let program = vec![3,8,1001,8,10,8,105,1,0,0,21,38,63,88,97,118,199,280,361,442,99999,3,9,1002,9,3,9,101,2,9,9,1002,9,4,9,4,9,99,3,9,101,3,9,9,102,5,9,9,101,3,9,9,1002,9,3,9,101,3,9,9,4,9,99,3,9,1002,9,2,9,1001,9,3,9,102,3,9,9,101,2,9,9,1002,9,4,9,4,9,99,3,9,102,2,9,9,4,9,99,3,9,102,4,9,9,101,5,9,9,102,2,9,9,101,5,9,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,99,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,99,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,99];
|
||||
|
||||
let mut max_storage = 0;
|
||||
let mut max_settings: Vec<i32> = Vec::new();
|
||||
|
||||
{
|
||||
let settings = vec![0, 1, 2, 3, 4];
|
||||
// Cheese.
|
||||
for permutation in settings.into_iter().permutations(5) {
|
||||
//println!("{:?}", permutation);
|
||||
let storage = run_amplifiers(&program, permutation.clone());
|
||||
if storage > max_storage {
|
||||
max_storage = storage;
|
||||
max_settings = permutation.clone();
|
||||
}
|
||||
}
|
||||
println!("[Part 1] Settings {:?} produced a value of {}", max_settings, max_storage);
|
||||
}
|
||||
|
||||
{
|
||||
let settings = vec![5, 6, 7, 8, 9];
|
||||
for permutation in settings.into_iter().permutations(5) {
|
||||
let storage = run_feedback_amplifiers(&program, permutation.clone());
|
||||
if storage > max_storage {
|
||||
max_storage = storage;
|
||||
max_settings = permutation.clone();
|
||||
}
|
||||
}
|
||||
println!("[Part 2] Settings {:?} produced a value of {}", max_settings, max_storage);
|
||||
}
|
||||
}
|
||||
|
||||
fn run_amplifiers(program: &Vec<i32>, settings: Vec<i32>) -> i32 {
|
||||
let mut storage: i32 = 0;
|
||||
for setting in settings {
|
||||
let mut input = VecDeque::from([setting, storage]);
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
icc::simulate(&mut program.clone(), &mut input, &mut output, 0);
|
||||
storage = output[0];
|
||||
}
|
||||
return storage;
|
||||
}
|
||||
|
||||
fn run_feedback_amplifiers(program: &Vec<i32>, settings: Vec<i32>) -> i32 {
|
||||
let amplifiers = [
|
||||
// program, input signal, entrypoint, setting
|
||||
(&mut program.clone(), &mut 0, &mut 0usize, &mut icc::Status::Running),
|
||||
(&mut program.clone(), &mut 0, &mut 0usize, &mut icc::Status::Running),
|
||||
(&mut program.clone(), &mut 0, &mut 0usize, &mut icc::Status::Running),
|
||||
(&mut program.clone(), &mut 0, &mut 0usize, &mut icc::Status::Running),
|
||||
(&mut program.clone(), &mut 0, &mut 0usize, &mut icc::Status::Running),
|
||||
];
|
||||
let mut iter: i32 = 0;
|
||||
loop {
|
||||
for (index, setting) in settings.iter().enumerate() {
|
||||
match amplifiers[index].3 {
|
||||
icc::Status::Finished => {
|
||||
if index == 4 {
|
||||
// the output of amplifier 4 is stored on the input of amplifier 0
|
||||
return *amplifiers[0].1;
|
||||
}
|
||||
continue;
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
println!("[Iter {}] Running amplifier {} from instruction {}", iter, index, *amplifiers[index].2);
|
||||
let mut input = if iter == 0 {
|
||||
VecDeque::from([*setting, *amplifiers[index].1])
|
||||
} else {
|
||||
VecDeque::from([*amplifiers[index].1])
|
||||
};
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
let result = icc::simulate(amplifiers[index].0, &mut input, &mut output, *amplifiers[index].2);
|
||||
match result.status {
|
||||
icc::Status::WaitingForInput => {
|
||||
println!("[Iter {}] Amplifier {} is waiting for input", iter, index);
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
let amp_index = (index+1) % settings.len();
|
||||
*amplifiers[amp_index].1 = output[0];
|
||||
println!("[Iter {}] Amplifier {}->{}: {}", iter, index, amp_index, output[0]);
|
||||
*amplifiers[index].2 = result.instruction;
|
||||
*amplifiers[index].3 = result.status;
|
||||
}
|
||||
iter += 1;
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn example_1() {
|
||||
let program = vec![3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0];
|
||||
let settings = vec![4, 3, 2, 1, 0];
|
||||
assert_eq!(run_amplifiers(&program, settings), 43210);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn example_2() {
|
||||
let program = vec![3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0];
|
||||
let settings = vec![0,1,2,3,4];
|
||||
assert_eq!(run_amplifiers(&program, settings), 54321);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn example_3() {
|
||||
let program = vec![3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0];
|
||||
let settings = vec![1,0,4,3,2];
|
||||
assert_eq!(run_amplifiers(&program, settings), 65210);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_example_1() {
|
||||
let program = vec![3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5];
|
||||
let settings = vec![9,8,7,6,5];
|
||||
assert_eq!(run_feedback_amplifiers(&program, settings), 139629729);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_example_2() {
|
||||
let program = vec![3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10];
|
||||
let settings = vec![9,7,8,5,6];
|
||||
assert_eq!(run_feedback_amplifiers(&program, settings), 18216);
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
kienan@monolith.244424:1652264161
|
|
@ -0,0 +1,132 @@
|
|||
use std::collections::VecDeque;
|
||||
use itertools::Itertools;
|
||||
|
||||
fn main() {
|
||||
let program = vec![3,8,1001,8,10,8,105,1,0,0,21,38,63,88,97,118,199,280,361,442,99999,3,9,1002,9,3,9,101,2,9,9,1002,9,4,9,4,9,99,3,9,101,3,9,9,102,5,9,9,101,3,9,9,1002,9,3,9,101,3,9,9,4,9,99,3,9,1002,9,2,9,1001,9,3,9,102,3,9,9,101,2,9,9,1002,9,4,9,4,9,99,3,9,102,2,9,9,4,9,99,3,9,102,4,9,9,101,5,9,9,102,2,9,9,101,5,9,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,99,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,99,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,99];
|
||||
|
||||
let mut max_storage = 0;
|
||||
let mut max_settings: Vec<i32> = Vec::new();
|
||||
|
||||
{
|
||||
let settings = vec![0, 1, 2, 3, 4];
|
||||
// Cheese.
|
||||
for permutation in settings.into_iter().permutations(5) {
|
||||
//println!("{:?}", permutation);
|
||||
let storage = run_amplifiers(&program, permutation.clone());
|
||||
if storage > max_storage {
|
||||
max_storage = storage;
|
||||
max_settings = permutation.clone();
|
||||
}
|
||||
}
|
||||
println!("[Part 1] Settings {:?} produced a value of {}", max_settings, max_storage);
|
||||
}
|
||||
|
||||
{
|
||||
let settings = vec![5, 6, 7, 8, 9];
|
||||
for permutation in settings.into_iter().permutations(5) {
|
||||
let storage = run_feedback_amplifiers(&program, permutation.clone());
|
||||
if storage > max_storage {
|
||||
max_storage = storage;
|
||||
max_settings = permutation.clone();
|
||||
}
|
||||
}
|
||||
println!("[Part 2] Settings {:?} produced a value of {}", max_settings, max_storage);
|
||||
}
|
||||
}
|
||||
|
||||
fn run_amplifiers(program: &Vec<i32>, settings: Vec<i32>) -> i32 {
|
||||
let mut storage: i32 = 0;
|
||||
for setting in settings {
|
||||
let mut input = VecDeque::from([setting, storage]);
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
icc::simulate(&mut program.clone(), &mut input, &mut output, 0);
|
||||
storage = output[0];
|
||||
}
|
||||
return storage;
|
||||
}
|
||||
|
||||
fn run_feedback_amplifiers(program: &Vec<i32>, settings: Vec<i32>) -> i32 {
|
||||
let amplifiers = [
|
||||
// program, input signal, entrypoint, setting
|
||||
(&mut program.clone(), &mut 0, &mut 0usize, &mut icc::Status::Running),
|
||||
(&mut program.clone(), &mut 0, &mut 0usize, &mut icc::Status::Running),
|
||||
(&mut program.clone(), &mut 0, &mut 0usize, &mut icc::Status::Running),
|
||||
(&mut program.clone(), &mut 0, &mut 0usize, &mut icc::Status::Running),
|
||||
(&mut program.clone(), &mut 0, &mut 0usize, &mut icc::Status::Running),
|
||||
];
|
||||
let mut iter: i32 = 0;
|
||||
loop {
|
||||
for (index, setting) in settings.iter().enumerate() {
|
||||
match amplifiers[index].3 {
|
||||
icc::Status::Finished => {
|
||||
if index == 4 {
|
||||
// the output of amplifier 4 is stored on the input of amplifier 0
|
||||
return *amplifiers[0].1;
|
||||
}
|
||||
continue;
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
println!("[Iter {}] Running amplifier {} from instruction {}", iter, index, *amplifiers[index].2);
|
||||
let mut input = if iter == 0 {
|
||||
VecDeque::from([*setting, *amplifiers[index].1])
|
||||
} else {
|
||||
VecDeque::from([*amplifiers[index].1])
|
||||
};
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
let result = icc::simulate(amplifiers[index].0, &mut input, &mut output, *amplifiers[index].2);
|
||||
match result.status {
|
||||
icc::Status::WaitingForInput => {
|
||||
println!("[Iter {}] Amplifier {} is waiting for input", iter, index);
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
let amp_index = (index+1) % settings.len();
|
||||
*amplifiers[amp_index].1 = output[0];
|
||||
println!("[Iter {}] Amplifier {}->{}: {}", iter, index, amp_index, output[0]);
|
||||
*amplifiers[index].2 = result.instruction;
|
||||
*amplifiers[index].3 = result.status;
|
||||
}
|
||||
iter += 1;
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn example_1() {
|
||||
let program = vec![3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0];
|
||||
let settings = vec![4, 3, 2, 1, 0];
|
||||
assert_eq!(run_amplifiers(&program, settings), 43210);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn example_2() {
|
||||
let program = vec![3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0];
|
||||
let settings = vec![0,1,2,3,4];
|
||||
assert_eq!(run_amplifiers(&program, settings), 54321);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn example_3() {
|
||||
let program = vec![3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0];
|
||||
let settings = vec![1,0,4,3,2];
|
||||
assert_eq!(run_amplifiers(&program, settings), 65210);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_example_1() {
|
||||
let program = vec![3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5];
|
||||
let settings = vec![9,8,7,6,5];
|
||||
assert_eq!(run_feedback_amplifiers(&program, settings), 139629729);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_example_2() {
|
||||
let program = vec![3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10];
|
||||
let settings = vec![9,7,8,5,6];
|
||||
assert_eq!(run_feedback_amplifiers(&program, settings), 18216);
|
||||
}
|
||||
}
|
|
@ -4,4 +4,4 @@ version = 3
|
|||
|
||||
[[package]]
|
||||
name = "icc"
|
||||
version = "0.1.0"
|
||||
version = "1.0.0"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "icc"
|
||||
version = "0.1.0"
|
||||
version = "1.0.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
|
159
icc/src/lib.rs
159
icc/src/lib.rs
|
@ -1,5 +1,20 @@
|
|||
pub fn simulate(v: &mut Vec<i32>, input: i32, output: &mut i32) -> Option<i32> {
|
||||
let mut pos = 0;
|
||||
use std::collections::VecDeque;
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(PartialEq)]
|
||||
pub enum Status {
|
||||
Running,
|
||||
Finished,
|
||||
WaitingForInput,
|
||||
}
|
||||
|
||||
pub struct Result {
|
||||
pub status: Status,
|
||||
pub instruction: usize,
|
||||
}
|
||||
|
||||
pub fn simulate(v: &mut Vec<i32>, input: &mut VecDeque<i32>, output: &mut Vec<i32>, start: usize) -> Result {
|
||||
let mut pos = start;
|
||||
loop {
|
||||
let mut code = v[pos];
|
||||
// Opcodes are ABCDE, where the op is DE
|
||||
|
@ -57,7 +72,15 @@ pub fn simulate(v: &mut Vec<i32>, input: i32, output: &mut i32) -> Option<i32> {
|
|||
else if op == 3 {
|
||||
// Input
|
||||
let dest = v[pos+1] as usize;
|
||||
v[dest] = input;
|
||||
v[dest] = if input.len() == 0 {
|
||||
return Result {
|
||||
status: Status::WaitingForInput,
|
||||
instruction: pos
|
||||
};
|
||||
} else {
|
||||
input.pop_front().expect("Input stack empty... weird")
|
||||
};
|
||||
println!("Input: {}", v[dest]);
|
||||
pos += 2;
|
||||
}
|
||||
else if op == 4 {
|
||||
|
@ -68,8 +91,8 @@ pub fn simulate(v: &mut Vec<i32>, input: i32, output: &mut i32) -> Option<i32> {
|
|||
else {
|
||||
v[v[pos+1] as usize]
|
||||
};
|
||||
println!("{}", d);
|
||||
*output = d;
|
||||
println!("Output: {}", d);
|
||||
output.push(d);
|
||||
pos += 2;
|
||||
}
|
||||
else if op == 5 {
|
||||
|
@ -155,7 +178,10 @@ pub fn simulate(v: &mut Vec<i32>, input: i32, output: &mut i32) -> Option<i32> {
|
|||
panic!("Unknown opcode: {}", code);
|
||||
}
|
||||
}
|
||||
return None;
|
||||
return Result {
|
||||
status: Status::Finished,
|
||||
instruction: 0
|
||||
};
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
@ -164,32 +190,36 @@ mod tests {
|
|||
#[test]
|
||||
fn test_op_1() {
|
||||
let mut program = vec![1, 0, 0, 0, 99];
|
||||
let mut output: i32 = 0;
|
||||
simulate(&mut program, 0, &mut output);
|
||||
let mut input: VecDeque<i32> = VecDeque::new();
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
simulate(&mut program, &mut input, &mut output, 0);
|
||||
assert_eq!(program[0], 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_op_2() {
|
||||
let mut program = vec![2, 3, 0, 3, 99];
|
||||
let mut output: i32 = 0;
|
||||
simulate(&mut program, 0, &mut output);
|
||||
let mut input: VecDeque<i32> = VecDeque::new();
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
simulate(&mut program, &mut input, &mut output, 0);
|
||||
assert_eq!(program[3], 6);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_case_3() {
|
||||
let mut program = vec![2,4,4,5,99,0];
|
||||
let mut output: i32 = 0;
|
||||
simulate(&mut program, 0, &mut output);
|
||||
let mut input: VecDeque<i32> = VecDeque::new();
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
simulate(&mut program, &mut input, &mut output, 0);
|
||||
assert_eq!(program[program.len() - 1], 9801);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_case_4() {
|
||||
let mut program = vec![1,1,1,4,99,5,6,0,99];
|
||||
let mut output: i32 = 0;
|
||||
simulate(&mut program, 0, &mut output);
|
||||
let mut input: VecDeque<i32> = VecDeque::new();
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
simulate(&mut program, &mut input, &mut output, 0);
|
||||
assert_eq!(program[0], 30);
|
||||
assert_eq!(program[4], 2);
|
||||
}
|
||||
|
@ -197,103 +227,122 @@ mod tests {
|
|||
#[test]
|
||||
fn immediate_mode_multiply() {
|
||||
let mut program = vec![1002,4,3,4,33];
|
||||
let mut output: i32 = 0;
|
||||
simulate(&mut program, 0, &mut output);
|
||||
let mut input: VecDeque<i32> = VecDeque::new();
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
simulate(&mut program, &mut input, &mut output, 0);
|
||||
assert_eq!(program[4], 99);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn negative_integers() {
|
||||
let mut program = vec![1101,100,-1,4,0];
|
||||
let mut output: i32 = 0;
|
||||
simulate(&mut program, 0, &mut output);
|
||||
let mut input: VecDeque<i32> = VecDeque::new();
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
simulate(&mut program, &mut input, &mut output, 0);
|
||||
assert_eq!(program[4], 99);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn position_mode_input_equal_to_8() {
|
||||
let mut program = vec![3,9,8,9,10,9,4,9,99,-1,8];
|
||||
let mut output: i32 = 0;
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
let backup = program.clone();
|
||||
simulate(&mut program, 8, &mut output);
|
||||
assert_eq!(output, 1);
|
||||
simulate(&mut program, &mut VecDeque::from([8]), &mut output, 0);
|
||||
assert_eq!(output[0], 1);
|
||||
output.clear();
|
||||
program = backup.clone();
|
||||
simulate(&mut program, 7, &mut output);
|
||||
assert_eq!(output, 0);
|
||||
simulate(&mut program, &mut VecDeque::from([7]), &mut output, 0);
|
||||
assert_eq!(output[0], 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn position_mode_input_less_than_8() {
|
||||
let mut program = vec![3,9,7,9,10,9,4,9,99,-1,8];
|
||||
let mut output: i32 = 0;
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
let backup = program.clone();
|
||||
simulate(&mut program, 8, &mut output);
|
||||
assert_eq!(output, 0);
|
||||
simulate(&mut program, &mut VecDeque::from([8]), &mut output, 0);
|
||||
assert_eq!(output[0], 0);
|
||||
output.clear();
|
||||
program = backup.clone();
|
||||
simulate(&mut program, 7, &mut output);
|
||||
assert_eq!(output, 1);
|
||||
simulate(&mut program, &mut VecDeque::from([7]), &mut output, 0);
|
||||
assert_eq!(output[0], 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn immediate_mode_input_equal_to_8() {
|
||||
let mut program = vec![3,3,1108,-1,8,3,4,3,99];
|
||||
let mut output: i32 = 0;
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
let backup = program.clone();
|
||||
simulate(&mut program, 8, &mut output);
|
||||
assert_eq!(output, 1);
|
||||
simulate(&mut program, &mut VecDeque::from([8]), &mut output, 0);
|
||||
assert_eq!(output[0], 1);
|
||||
output.clear();
|
||||
program = backup.clone();
|
||||
simulate(&mut program, 7, &mut output);
|
||||
assert_eq!(output, 0);
|
||||
simulate(&mut program, &mut VecDeque::from([7]), &mut output, 0);
|
||||
assert_eq!(output[0], 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn immediate_mode_input_less_than_8() {
|
||||
let mut program = vec![3,3,1107,-1,8,3,4,3,99];
|
||||
let mut output: i32 = 0;
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
let backup = program.clone();
|
||||
simulate(&mut program, 8, &mut output);
|
||||
assert_eq!(output, 0);
|
||||
simulate(&mut program, &mut VecDeque::from([8]), &mut output, 0);
|
||||
assert_eq!(output[0], 0);
|
||||
output.clear();
|
||||
program = backup.clone();
|
||||
simulate(&mut program, 7, &mut output);
|
||||
assert_eq!(output, 1);
|
||||
simulate(&mut program, &mut VecDeque::from([7]), &mut output, 0);
|
||||
assert_eq!(output[0], 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn position_mode_input_is_non_zero() {
|
||||
let mut program = vec![3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9];
|
||||
let mut output: i32 = 0;
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
let backup = program.clone();
|
||||
simulate(&mut program, 8, &mut output);
|
||||
assert_eq!(output, 1);
|
||||
simulate(&mut program, &mut VecDeque::from([8]), &mut output, 0);
|
||||
assert_eq!(output[0], 1);
|
||||
output.clear();
|
||||
program = backup.clone();
|
||||
simulate(&mut program, 0, &mut output);
|
||||
assert_eq!(output, 0);
|
||||
simulate(&mut program, &mut VecDeque::from([0]), &mut output, 0);
|
||||
assert_eq!(output[0], 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn immediate_mode_input_is_non_zero() {
|
||||
let mut program = vec![3,3,1105,-1,9,1101,0,0,12,4,12,99,1];
|
||||
let mut output: i32 = 0;
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
let backup = program.clone();
|
||||
simulate(&mut program, 8, &mut output);
|
||||
assert_eq!(output, 1);
|
||||
simulate(&mut program, &mut VecDeque::from([9]), &mut output, 0);
|
||||
assert_eq!(output[0], 1);
|
||||
output.clear();
|
||||
program = backup.clone();
|
||||
simulate(&mut program, 0, &mut output);
|
||||
assert_eq!(output, 0);
|
||||
simulate(&mut program, &mut VecDeque::from([0]), &mut output, 0);
|
||||
assert_eq!(output[0], 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multi_jump() {
|
||||
let mut program = vec![3,21,1008,21,8,20,1005,20,22,107,8,21,20,1006,20,31,1106,0,36,98,0,0,1002,21,125,20,4,20,1105,1,46,104,999,1105,1,46,1101,1000,1,20,4,20,1105,1,46,98,99];
|
||||
let mut output: i32 = 0;
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
let backup = program.clone();
|
||||
simulate(&mut program, 7, &mut output);
|
||||
assert_eq!(output, 999);
|
||||
simulate(&mut program, &mut VecDeque::from([7]), &mut output, 0);
|
||||
assert_eq!(output[0], 999);
|
||||
output.clear();
|
||||
program = backup.clone();
|
||||
simulate(&mut program, 8, &mut output);
|
||||
assert_eq!(output, 1000);
|
||||
simulate(&mut program, &mut VecDeque::from([8]), &mut output, 0);
|
||||
assert_eq!(output[0], 1000);
|
||||
output.clear();
|
||||
program = backup.clone();
|
||||
simulate(&mut program, 9, &mut output);
|
||||
assert_eq!(output, 1001);
|
||||
simulate(&mut program, &mut VecDeque::from([9]), &mut output, 0);
|
||||
assert_eq!(output[0], 1001);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn blocks_on_input() {
|
||||
let mut program = vec![3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5];
|
||||
let mut output: Vec<i32> = Vec::new();
|
||||
let result = simulate(&mut program, &mut VecDeque::from([9, 0]), &mut output, 0);
|
||||
assert_eq!(result.status, Status::WaitingForInput);
|
||||
assert_eq!(result.instruction, 6);
|
||||
}
|
||||
}
|
||||
|
|
Reference in New Issue