Skip to content

Instantly share code, notes, and snippets.

@0e4ef622
Created December 7, 2019 01:24
Show Gist options
  • Select an option

  • Save 0e4ef622/992a1f37bbc19ae7de8014ab4bc6b69a to your computer and use it in GitHub Desktop.

Select an option

Save 0e4ef622/992a1f37bbc19ae7de8014ab4bc6b69a to your computer and use it in GitHub Desktop.
use std::io::BufRead;
fn main() {
let reader = std::io::BufReader::new(std::fs::File::open(std::env::args().nth(1).unwrap()).unwrap());
let mut input = String::new();
for line in reader.lines() {
for ch in line.unwrap().chars() {
match ch {
'#' => break,
' ' | '\t' | '\r' | '\n' => (),
c => input.push(c),
}
}
}
run(&input, std::env::var_os("DEBUG").is_some());
}
pub fn run(input: &str, debug: bool) {
let mut nums = input.trim().split(",").map(|x| x.parse::<isize>().unwrap()).collect::<Vec<_>>();
let mut ci = 0;
loop {
if debug {
println!("pc = {}", ci);
println!("{:?}", &nums[ci..nums.len().min(ci+4)]);
println!("{:?}", nums[ci+1..nums.len().min(ci+4)].iter().map(|n| nums.get(*n as usize)).collect::<Vec<_>>());
println!();
}
match nums[ci] % 100 {
1 => {
let mut a = nums[ci+1];
let mut b = nums[ci+2];
let c = nums[ci+3];
let m = nums[ci] / 100 % 10;
let n = nums[ci] / 1000 % 10;
if m == 0 { a = nums[a as usize]; }
if n == 0 { b = nums[b as usize]; }
nums[c as usize] = a + b;
ci+=4;
}
2 => {
let mut a = nums[ci+1];
let mut b = nums[ci+2];
let c = nums[ci+3];
let m = nums[ci] / 100 % 10;
let n = nums[ci] / 1000 % 10;
if m == 0 { a = nums[a as usize]; }
if n == 0 { b = nums[b as usize]; }
nums[c as usize] = a * b;
ci+=4;
}
3 => {
let a = nums[ci+1];
let mut input = String::new();
std::io::stdin().read_line(&mut input).unwrap();
nums[a as usize] = input.trim().parse().unwrap();
ci += 2;
}
4 => {
let mut a = nums[ci+1];
let m = nums[ci] / 100 % 10;
if m == 0 { a = nums[a as usize]; }
println!("{}", a);
ci += 2;
}
5 => {
let mut a = nums[ci+1];
let mut b = nums[ci+2];
let m = nums[ci] / 100 % 10;
let n = nums[ci] / 1000 % 10;
if m == 0 { a = nums[a as usize]; }
if n == 0 { b = nums[b as usize]; }
if a != 0 {
ci = b as usize;
} else {
ci += 3;
}
}
6 => {
let mut a = nums[ci+1];
let mut b = nums[ci+2];
let m = nums[ci] / 100 % 10;
let n = nums[ci] / 1000 % 10;
if m == 0 { a = nums[a as usize]; }
if n == 0 { b = nums[b as usize]; }
if a == 0 {
ci = b as usize;
} else {
ci += 3;
}
}
7 => {
let mut a = nums[ci+1];
let mut b = nums[ci+2];
let c = nums[ci+3];
let m = nums[ci] / 100 % 10;
let n = nums[ci] / 1000 % 10;
if m == 0 { a = nums[a as usize]; }
if n == 0 { b = nums[b as usize]; }
if a < b {
nums[c as usize] = 1;
} else {
nums[c as usize] = 0;
}
ci += 4;
}
8 => {
let mut a = nums[ci+1];
let mut b = nums[ci+2];
let c = nums[ci+3];
let m = nums[ci] / 100 % 10;
let n = nums[ci] / 1000 % 10;
if m == 0 { a = nums[a as usize]; }
if n == 0 { b = nums[b as usize]; }
if a == b {
nums[c as usize] = 1;
} else {
nums[c as usize] = 0;
}
ci += 4;
}
99 => break,
_ => panic!("Bad opcode"),
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment