Compare commits
2 Commits
864e4f7446
...
da5cf69b1b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
da5cf69b1b | ||
|
|
0db2018217 |
1
input/day07.txt
Normal file
1
input/day07.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3,8,1001,8,10,8,105,1,0,0,21,42,63,76,101,114,195,276,357,438,99999,3,9,101,2,9,9,102,5,9,9,1001,9,3,9,1002,9,5,9,4,9,99,3,9,101,4,9,9,102,5,9,9,1001,9,5,9,102,2,9,9,4,9,99,3,9,1001,9,3,9,1002,9,5,9,4,9,99,3,9,1002,9,2,9,101,5,9,9,102,3,9,9,101,2,9,9,1002,9,3,9,4,9,99,3,9,101,3,9,9,102,2,9,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,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,99,3,9,102,2,9,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,3,9,102,2,9,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,102,2,9,9,4,9,99,3,9,102,2,9,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,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,99,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,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,102,2,9,9,4,9,3,9,1001,9,2,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,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,99
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
mod tasks;
|
mod tasks;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
tasks::day05::run();
|
tasks::day07::run();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ pub fn run() {
|
|||||||
task2(ram.clone());
|
task2(ram.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
struct IntCodeComputer {
|
pub struct IntCodeComputer {
|
||||||
input_storage: Vec<i32>,
|
input_storage: Vec<i32>,
|
||||||
output_storage: Vec<i32>,
|
output_storage: Vec<i32>,
|
||||||
pc: usize,
|
pc: usize,
|
||||||
@@ -140,7 +140,7 @@ impl Op {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl IntCodeComputer {
|
impl IntCodeComputer {
|
||||||
fn new(input: Vec<i32>, memory: Vec<i32>) -> Self {
|
pub fn new(input: Vec<i32>, memory: Vec<i32>) -> Self {
|
||||||
IntCodeComputer {
|
IntCodeComputer {
|
||||||
input_storage: input,
|
input_storage: input,
|
||||||
output_storage: Vec::new(),
|
output_storage: Vec::new(),
|
||||||
@@ -149,7 +149,7 @@ impl IntCodeComputer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_until_end(&mut self) {
|
pub fn run_until_end(&mut self) {
|
||||||
let mut op = Op::from(self.pc, &self.ram);
|
let mut op = Op::from(self.pc, &self.ram);
|
||||||
let mut inputs = self.input_storage.iter();
|
let mut inputs = self.input_storage.iter();
|
||||||
while op.opcode != OpCode::Terminate {
|
while op.opcode != OpCode::Terminate {
|
||||||
@@ -212,7 +212,88 @@ impl IntCodeComputer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_output(&self) -> &[i32] {
|
/**
|
||||||
|
* True means the program terminated, false means it is just waiting for more input
|
||||||
|
*/
|
||||||
|
pub fn run_until_input_empty(&mut self) -> bool {
|
||||||
|
let mut op = Op::from(self.pc, &self.ram);
|
||||||
|
let mut inputs = self.input_storage.iter();
|
||||||
|
while op.opcode != OpCode::Terminate {
|
||||||
|
match op.opcode {
|
||||||
|
OpCode::Add => {
|
||||||
|
let r = op.params[0].retrieve(&self.ram) + op.params[1].retrieve(&self.ram);
|
||||||
|
op.params[2].store(&mut self.ram, r);
|
||||||
|
self.pc += 4;
|
||||||
|
}
|
||||||
|
OpCode::Multiply => {
|
||||||
|
let r = op.params[0].retrieve(&self.ram) * op.params[1].retrieve(&self.ram);
|
||||||
|
op.params[2].store(&mut self.ram, r);
|
||||||
|
self.pc += 4;
|
||||||
|
}
|
||||||
|
OpCode::Input => {
|
||||||
|
if let Some(v) = inputs.next() {
|
||||||
|
op.params[0].store(&mut self.ram, *v);
|
||||||
|
self.pc += 2;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpCode::Output => {
|
||||||
|
self.output_storage.push(op.params[0].retrieve(&self.ram));
|
||||||
|
self.pc += 2;
|
||||||
|
}
|
||||||
|
OpCode::JumpIfTrue => {
|
||||||
|
if op.params[0].retrieve(&self.ram) > 0 {
|
||||||
|
self.pc = op.params[1].retrieve(&self.ram) as usize;
|
||||||
|
} else {
|
||||||
|
self.pc += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpCode::JumpIfFalse => {
|
||||||
|
if op.params[0].retrieve(&self.ram) == 0 {
|
||||||
|
self.pc = op.params[1].retrieve(&self.ram) as usize;
|
||||||
|
} else {
|
||||||
|
self.pc += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpCode::LessThan => {
|
||||||
|
let r = if op.params[0].retrieve(&self.ram) < op.params[1].retrieve(&self.ram) {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
op.params[2].store(&mut self.ram, r);
|
||||||
|
self.pc += 4;
|
||||||
|
}
|
||||||
|
OpCode::Equals => {
|
||||||
|
let r = if op.params[0].retrieve(&self.ram) == op.params[1].retrieve(&self.ram)
|
||||||
|
{
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
op.params[2].store(&mut self.ram, r);
|
||||||
|
self.pc += 4;
|
||||||
|
}
|
||||||
|
OpCode::Terminate => {}
|
||||||
|
}
|
||||||
|
op = Op::from(self.pc, &self.ram);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_input(&mut self, input: &[i32]) {
|
||||||
|
self.input_storage.clear();
|
||||||
|
for x in input {
|
||||||
|
self.input_storage.push(*x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clear_output(&mut self) {
|
||||||
|
self.output_storage.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_output(&self) -> &[i32] {
|
||||||
self.output_storage.as_slice()
|
self.output_storage.as_slice()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
63
src/tasks/day07.rs
Normal file
63
src/tasks/day07.rs
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
use crate::tasks::day05::IntCodeComputer;
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn run() {
|
||||||
|
let prog_code: Vec<_> = std::fs::read_to_string("input/day07.txt")
|
||||||
|
.unwrap()
|
||||||
|
.split(",")
|
||||||
|
.map(|s| s.parse::<i32>().unwrap())
|
||||||
|
.collect();
|
||||||
|
task1(prog_code.clone());
|
||||||
|
task2(prog_code.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn task1(input: Vec<i32>) {
|
||||||
|
let phases = vec![0, 1, 2, 3, 4];
|
||||||
|
let result = phases
|
||||||
|
.iter()
|
||||||
|
.permutations(phases.len())
|
||||||
|
.map(|perm| {
|
||||||
|
perm.iter().fold(0, |signal, phase| {
|
||||||
|
let mut computer = IntCodeComputer::new(vec![**phase, signal], input.clone());
|
||||||
|
computer.run_until_end();
|
||||||
|
*computer.get_output().last().unwrap()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.max();
|
||||||
|
println!("Task 1: best signal is {}", result.unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn task2(input: Vec<i32>) {
|
||||||
|
let phases = vec![5, 6, 7, 8, 9];
|
||||||
|
let result = phases
|
||||||
|
.iter()
|
||||||
|
.permutations(phases.len())
|
||||||
|
.map(|perm| {
|
||||||
|
let mut machines: Vec<IntCodeComputer> = perm
|
||||||
|
.iter()
|
||||||
|
.map(|phase| {
|
||||||
|
let mut comp = IntCodeComputer::new(vec![**phase], input.clone());
|
||||||
|
comp.run_until_input_empty();
|
||||||
|
comp
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
let mut m = 0;
|
||||||
|
let mut signal = 0;
|
||||||
|
let mut done = false;
|
||||||
|
while !done {
|
||||||
|
let mach = &mut machines[m];
|
||||||
|
mach.set_input(&vec![signal]);
|
||||||
|
let machine_done = mach.run_until_input_empty();
|
||||||
|
signal = *mach.get_output().last().unwrap();
|
||||||
|
mach.clear_output();
|
||||||
|
if machine_done && m == 4 {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
m = (m + 1) % machines.len();
|
||||||
|
}
|
||||||
|
signal
|
||||||
|
})
|
||||||
|
.max();
|
||||||
|
println!("Task 2: best signal with looping is {}", result.unwrap());
|
||||||
|
}
|
||||||
@@ -3,4 +3,5 @@ pub mod day03;
|
|||||||
pub mod day04;
|
pub mod day04;
|
||||||
pub mod day05;
|
pub mod day05;
|
||||||
pub mod day06;
|
pub mod day06;
|
||||||
|
pub mod day07;
|
||||||
pub mod day08;
|
pub mod day08;
|
||||||
|
|||||||
Reference in New Issue
Block a user