diff --git a/16/src/main.rs b/16/src/main.rs index 6c8348b..4f80ef3 100644 --- a/16/src/main.rs +++ b/16/src/main.rs @@ -1,9 +1,104 @@ -fn addi(first: i32, second: i32) -> i32 { - return first + second; +fn addi(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = regs[first] + second; + return regs; +} + +fn addr(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = regs[first] + regs[second]; + return regs; +} + +fn muli(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = regs[first] * second; + return regs; +} + +fn mulr(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = regs[first] * regs[second]; + return regs; +} + +fn bori(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = regs[first] | second; + return regs; +} + +fn borr(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = regs[first] | regs[second]; + return regs; +} + +fn seti(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = first; + return regs; +} + +fn setr(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = regs[first]; + return regs; +} + +fn gtir(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = if first > regs[second] {1} else {0}; + return regs; +} + +fn gtri(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = if regs[first] > second {1} else {0}; + return regs; +} + +fn gtrr(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = if regs[first] > regs[second] {1} else {0}; + return regs; +} + +fn eqir(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = if first == regs[second] {1} else {0}; + return regs; +} + +fn eqri(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = if regs[first] == second {1} else {0}; + return regs; +} + +fn eqrr(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = if regs[first] == regs[second] {1} else {0}; + return regs; +} + +fn bani(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = regs[first] & second; + return regs; +} + +fn banr(first: usize, second: usize, address: usize, registers: &Vec) -> Vec { + let mut regs = registers.clone(); + regs[address] = first & regs[second]; + return regs; } fn main() { - println!("Hello, world!"); - let a: fn(i32, i32) -> i32 = addi; - println!("{}", a(1, 2)); + let functions = [addi, addr, muli, mulr, seti, setr, bani, banr, bori, borr, gtir, gtri, gtrr, eqir, eqri, eqrr]; + println!("{}", functions.len()); + let input = vec![1, 2, 3, 4]; + for func in functions.iter() { + println!("{}", func(1, 2, 3, &input)[3]); + } }