Add solution to day 2 in rust
parent
c92d940640
commit
7f5b3c139c
|
@ -0,0 +1,90 @@
|
||||||
|
use std::fs;
|
||||||
|
use std::process;
|
||||||
|
|
||||||
|
const DESIRED_RESULT: i32 = 19690720;
|
||||||
|
|
||||||
|
enum Opcode {
|
||||||
|
Add = 1,
|
||||||
|
Mult = 2,
|
||||||
|
Terminate = 99
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
struct Program {
|
||||||
|
memory: Vec<i32>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Program {
|
||||||
|
fn execute(&self, param1: i32, param2: i32) -> Result<i32, String> {
|
||||||
|
let mut local_memory = self.memory.clone();
|
||||||
|
local_memory[1] = param1;
|
||||||
|
local_memory[2] = param2;
|
||||||
|
for i in (0..local_memory.len()).step_by(4) {
|
||||||
|
let item = local_memory[i];
|
||||||
|
let operation = match item {
|
||||||
|
item if item == Opcode::Add as i32 => {
|
||||||
|
std::ops::Add::add
|
||||||
|
},
|
||||||
|
item if item == Opcode::Mult as i32 => {
|
||||||
|
std::ops::Mul::mul
|
||||||
|
},
|
||||||
|
item if item == Opcode::Terminate as i32 => {
|
||||||
|
break;
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
return Err("Bad Opcode".to_string());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let param_a_index = local_memory[i + 1] as usize;
|
||||||
|
let param_b_index = local_memory[i + 2] as usize;
|
||||||
|
let out_index = local_memory[i + 3] as usize;
|
||||||
|
local_memory[out_index] = operation(local_memory[param_a_index], local_memory[param_b_index])
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok(local_memory[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(program: &Program) -> Result<i32, String> {
|
||||||
|
program.execute(12, 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(program: &Program) -> Result<(i32, i32), String> {
|
||||||
|
for i in 0..100 {
|
||||||
|
for j in 0..100 {
|
||||||
|
let result = program.execute(i, j)?;
|
||||||
|
if result == DESIRED_RESULT {
|
||||||
|
return Ok((i, j))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Err("Could not find result".to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let raw_input = fs::read_to_string("../input.txt");
|
||||||
|
let input = match &raw_input {
|
||||||
|
Ok(contents) => contents
|
||||||
|
.trim()
|
||||||
|
.split(',')
|
||||||
|
.map(|x| { x.parse::<i32>().unwrap() })
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
Err(error) => {
|
||||||
|
eprintln!("Could not read input: {}", error);
|
||||||
|
process::exit(1)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let program = Program{memory: input};
|
||||||
|
|
||||||
|
match part1(&program) {
|
||||||
|
Ok(result) => println!("{}", result),
|
||||||
|
Err(error) => println!("{}", error)
|
||||||
|
}
|
||||||
|
|
||||||
|
match part2(&program) {
|
||||||
|
Ok(result) => println!("{:?}", result),
|
||||||
|
Err(error) => println!("{}", error)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue