mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Add solutions to day 12.
Assembunny was fun.
This commit is contained in:
6
2016/day-12/Cargo.toml
Normal file
6
2016/day-12/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "day-12"
|
||||
version = "0.1.0"
|
||||
authors = ["Bert Peters <bert.ljpeters@gmail.com>"]
|
||||
|
||||
[dependencies]
|
||||
23
2016/day-12/input.txt
Normal file
23
2016/day-12/input.txt
Normal file
@@ -0,0 +1,23 @@
|
||||
cpy 1 a
|
||||
cpy 1 b
|
||||
cpy 26 d
|
||||
jnz c 2
|
||||
jnz 1 5
|
||||
cpy 7 c
|
||||
inc d
|
||||
dec c
|
||||
jnz c -2
|
||||
cpy a c
|
||||
inc a
|
||||
dec b
|
||||
jnz b -2
|
||||
cpy c b
|
||||
dec d
|
||||
jnz d -6
|
||||
cpy 16 c
|
||||
cpy 12 d
|
||||
inc a
|
||||
dec d
|
||||
jnz d -2
|
||||
dec c
|
||||
jnz c -5
|
||||
81
2016/day-12/src/main.rs
Normal file
81
2016/day-12/src/main.rs
Normal file
@@ -0,0 +1,81 @@
|
||||
use std::env;
|
||||
use std::io::prelude::*;
|
||||
use std::fs::File;
|
||||
use std::io::BufReader;
|
||||
|
||||
fn register_num(value: &str) -> Option<usize>
|
||||
{
|
||||
match value {
|
||||
"a" => Some(0),
|
||||
"b" => Some(1),
|
||||
"c" => Some(2),
|
||||
"d" => Some(3),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn get_value(value: &str, registers: &[i32; 4]) -> i32
|
||||
{
|
||||
match register_num(value) {
|
||||
Some(num) => registers[num],
|
||||
_ => value.parse().unwrap(),
|
||||
}
|
||||
}
|
||||
|
||||
fn run(program: &Vec<Vec<String>>, mut registers: [i32; 4]) -> [i32; 4]
|
||||
{
|
||||
let mut iptr: i32 = 0;
|
||||
|
||||
while iptr < program.len() as i32 {
|
||||
let ref instruction = program[iptr as usize];
|
||||
//println!("{} ({:?}): {:?}", iptr, registers, instruction);
|
||||
match instruction[0].as_ref() {
|
||||
"cpy" => {
|
||||
let val = get_value(&instruction[1], ®isters);
|
||||
let dest = register_num(&instruction[2]).unwrap();
|
||||
registers[dest] = val;
|
||||
},
|
||||
"jnz" => {
|
||||
let val = get_value(&instruction[1], ®isters);
|
||||
if val != 0 {
|
||||
let jump: i32 = instruction[2].parse().unwrap();
|
||||
iptr += jump;
|
||||
continue;
|
||||
}
|
||||
},
|
||||
"inc" => {
|
||||
let dest = register_num(&instruction[1]).unwrap();
|
||||
registers[dest] += 1;
|
||||
},
|
||||
"dec" => {
|
||||
let dest = register_num(&instruction[1]).unwrap();
|
||||
registers[dest] -= 1;
|
||||
},
|
||||
_ => panic!("Invalid instruction: {:?}", instruction),
|
||||
}
|
||||
iptr += 1;
|
||||
}
|
||||
|
||||
return registers;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
let f = File::open(&args[1]).expect("Could not open file");
|
||||
let reader = BufReader::new(f);
|
||||
|
||||
let mut program = Vec::new();
|
||||
|
||||
for line in reader.lines() {
|
||||
let contents = line.unwrap();
|
||||
let parts: Vec<String> = contents.split(" ").map(|part| String::from(part)).collect();
|
||||
|
||||
program.push(parts);
|
||||
}
|
||||
|
||||
let result1 = run(&program, [0; 4]);
|
||||
println!("Run 1: register a contains {}", result1[0]);
|
||||
|
||||
let result2 = run(&program, [0, 0, 1, 0]);
|
||||
println!("Run 2: register a contains {}", result2[0]);
|
||||
}
|
||||
Reference in New Issue
Block a user