Day 01 and 02 2019.
This commit is contained in:
6
2019/02/Cargo.lock
generated
Normal file
6
2019/02/Cargo.lock
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "day-02"
|
||||
version = "0.1.0"
|
||||
|
||||
9
2019/02/Cargo.toml
Normal file
9
2019/02/Cargo.toml
Normal file
@@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "day-02"
|
||||
version = "0.1.0"
|
||||
authors = ["Anders Olsson <anders.e.olsson@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
1
2019/02/input
Normal file
1
2019/02/input
Normal file
@@ -0,0 +1 @@
|
||||
1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,1,6,19,2,19,6,23,1,23,5,27,1,9,27,31,1,31,10,35,2,35,9,39,1,5,39,43,2,43,9,47,1,5,47,51,2,51,13,55,1,55,10,59,1,59,10,63,2,9,63,67,1,67,5,71,2,13,71,75,1,75,10,79,1,79,6,83,2,13,83,87,1,87,6,91,1,6,91,95,1,10,95,99,2,99,6,103,1,103,5,107,2,6,107,111,1,10,111,115,1,115,5,119,2,6,119,123,1,123,5,127,2,127,6,131,1,131,5,135,1,2,135,139,1,139,13,0,99,2,0,14,0
|
||||
106
2019/02/src/main.rs
Normal file
106
2019/02/src/main.rs
Normal file
@@ -0,0 +1,106 @@
|
||||
use std::env;
|
||||
use std::fs;
|
||||
|
||||
fn main() {
|
||||
let input = env::args().nth(1).expect("need an input file");
|
||||
|
||||
let data = fs::read_to_string(&input).expect("failed to read input file");
|
||||
|
||||
let intcode = data
|
||||
.split(',')
|
||||
.map(|value| {
|
||||
value
|
||||
.trim()
|
||||
.parse::<usize>()
|
||||
.expect("failed to convert value to u8")
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let mut program = intcode.clone();
|
||||
|
||||
program[1] = 12;
|
||||
program[2] = 2;
|
||||
|
||||
let mut pc = 0;
|
||||
|
||||
loop {
|
||||
match program[pc] {
|
||||
1 => {
|
||||
let a_addr = program[pc + 1];
|
||||
let b_addr = program[pc + 2];
|
||||
let x_addr = program[pc + 3];
|
||||
|
||||
program[x_addr] = program[a_addr] + program[b_addr];
|
||||
pc += 4;
|
||||
}
|
||||
2 => {
|
||||
let a_addr = program[pc + 1];
|
||||
let b_addr = program[pc + 2];
|
||||
let x_addr = program[pc + 3];
|
||||
|
||||
program[x_addr] = program[a_addr] * program[b_addr];
|
||||
pc += 4;
|
||||
}
|
||||
99 => {
|
||||
break;
|
||||
}
|
||||
_ => panic!("invalid op code"),
|
||||
}
|
||||
}
|
||||
|
||||
println!("part_one={}", program[0]);
|
||||
|
||||
let mut noun = 0;
|
||||
let mut verb = 0;
|
||||
|
||||
loop {
|
||||
let mut program = intcode.clone();
|
||||
|
||||
program[1] = noun;
|
||||
program[2] = verb;
|
||||
|
||||
let mut pc = 0;
|
||||
|
||||
loop {
|
||||
match program[pc] {
|
||||
1 => {
|
||||
let a_addr = program[pc + 1];
|
||||
let b_addr = program[pc + 2];
|
||||
let x_addr = program[pc + 3];
|
||||
|
||||
program[x_addr] = program[a_addr] + program[b_addr];
|
||||
pc += 4;
|
||||
}
|
||||
2 => {
|
||||
let a_addr = program[pc + 1];
|
||||
let b_addr = program[pc + 2];
|
||||
let x_addr = program[pc + 3];
|
||||
|
||||
program[x_addr] = program[a_addr] * program[b_addr];
|
||||
pc += 4;
|
||||
}
|
||||
99 => {
|
||||
break;
|
||||
}
|
||||
_ => panic!("invalid op code"),
|
||||
}
|
||||
}
|
||||
|
||||
if program[0] == 19690720 {
|
||||
break;
|
||||
}
|
||||
|
||||
noun += 1;
|
||||
|
||||
if noun > 99 {
|
||||
noun = 0;
|
||||
verb += 1;
|
||||
|
||||
if verb > 99 {
|
||||
panic!("failed to find a valid input pair");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
println!("part_two={}", 100 * noun + verb);
|
||||
}
|
||||
Reference in New Issue
Block a user