Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::env;
- use std::io::{self, prelude::*, BufReader};
- use std::fs::File;
- fn main() {
- let args: Vec<String> = env::args().collect();
- let filename = &args[1];
- day05(&filename).unwrap();
- }
- fn reverse_digits_of(n: i64) -> Vec<i64> {
- let mut digits = Vec::new();
- if n == 0 { digits.push(0); return digits; }
- let mut a = n;
- while a > 0 {
- digits.push(a % 10);
- a /= 10;
- }
- digits
- }
- fn get_if_exists(vec: &Vec<i64>, idx: i64) -> usize {
- if vec.len() > idx as usize {
- return vec[idx as usize] as usize;
- } else {
- return 0usize;
- }
- }
- fn process(code: &Vec<i64>, input: i64) -> i64 {
- let mut ptr: usize = 0;
- let mut intcode = code.clone();
- let mut output = 0;
- loop {
- if intcode[ptr] == 99 { break; }
- let parts = reverse_digits_of(intcode[ptr]);
- let opcode = parts[0];
- match opcode {
- // Add
- 1 => {
- let a = if get_if_exists(&parts,2) == 1 { intcode[ptr+1] } else { intcode[intcode[ptr+1] as usize] };
- let b = if get_if_exists(&parts,3) == 1 { intcode[ptr+2] } else { intcode[intcode[ptr+2] as usize] };
- let d = intcode[ptr+3] as usize;
- intcode[d] = a + b;
- ptr += 4;
- },
- // Multiply
- 2 => {
- let a = if get_if_exists(&parts,2) == 1 { intcode[ptr+1] } else { intcode[intcode[ptr+1] as usize] };
- let b = if get_if_exists(&parts,3) == 1 { intcode[ptr+2] } else { intcode[intcode[ptr+2] as usize] };
- let d = intcode[ptr+3] as usize;
- intcode[d] = a * b;
- ptr += 4;
- },
- // Input
- 3 => {
- println!("Input: {}", input);
- let ix = intcode[ptr+1] as usize;
- intcode[ix] = input;
- ptr += 2;
- },
- // Output
- 4 => {
- let ix = intcode[ptr+1] as usize;
- println!("Output: {}", intcode[ix]);
- output = intcode[ix];
- ptr += 2;
- },
- // Jump if True
- 5 => {
- let a = if get_if_exists(&parts,2) == 1 { intcode[ptr+1] } else { intcode[intcode[ptr+1] as usize] };
- let b = if get_if_exists(&parts,3) == 1 { intcode[ptr+2] } else { intcode[intcode[ptr+2] as usize] };
- if a != 0 { ptr = b as usize } else { ptr += 3 }
- },
- // Jump if False
- 6 => {
- let a = if get_if_exists(&parts,2) == 1 { intcode[ptr+1] } else { intcode[intcode[ptr+1] as usize] };
- let b = if get_if_exists(&parts,3) == 1 { intcode[ptr+2] } else { intcode[intcode[ptr+2] as usize] };
- if a == 0 { ptr = b as usize } else { ptr += 3 }
- },
- // Less Than
- 7 => {
- let a = if get_if_exists(&parts,2) == 1 { intcode[ptr+1] } else { intcode[intcode[ptr+1] as usize] };
- let b = if get_if_exists(&parts,3) == 1 { intcode[ptr+2] } else { intcode[intcode[ptr+2] as usize] };
- let d = intcode[ptr+3] as usize;
- if a < b { intcode[d] = 1 } else { intcode[d] = 0 }
- ptr += 4;
- },
- // Equal
- 8 => {
- let a = if get_if_exists(&parts,2) == 1 { intcode[ptr+1] } else { intcode[intcode[ptr+1] as usize] };
- let b = if get_if_exists(&parts,3) == 1 { intcode[ptr+2] } else { intcode[intcode[ptr+2] as usize] };
- let d = intcode[ptr+3] as usize;
- if a == b { intcode[d] = 1 } else { intcode[d] = 0 }
- ptr += 4;
- },
- other => panic!("ERROR: Unknown instruction: {}", other),
- }
- }
- output
- }
- fn day05(input: &str) -> io::Result<()> {
- let file = File::open(input).expect("Input file not found.");
- let reader = BufReader::new(file);
- let input: Vec<String> = match reader.lines().collect() {
- Err(err) => panic!("Unknown error reading input: {}", err),
- Ok(result) => result,
- };
- let input = input.concat();
- let intcode_default = input
- .split(",")
- .map(|x| x.parse::<i64>().unwrap())
- .collect::<Vec<i64>>();
- // Part 1
- let intcode = intcode_default.clone();
- let part1 = process(&intcode,1);
- // Part 1
- let intcode = intcode_default.clone();
- let part2 = process(&intcode,5);
- // Output
- println!("Part 1: {}", part1); // 7265618
- println!("Part 2: {}", part2); // 7731427
- Ok(())
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement