2 changed files with 84 additions and 0 deletions
@ -0,0 +1,72 @@ |
|||
// #[derive(Copy, Clone)]
|
|||
pub struct Data { |
|||
pub program: Vec<u32>, |
|||
} |
|||
|
|||
impl Data { |
|||
pub fn new() -> Data { |
|||
Data { |
|||
program: Vec::new(), |
|||
} |
|||
} |
|||
|
|||
pub fn parse(&mut self, input: String) { |
|||
for line in input.split(",") { |
|||
let sline = line.to_string(); |
|||
// println!("{}", sline);
|
|||
self.program.push(match sline.parse::<u32>() { |
|||
Ok(i) => i, |
|||
Err(_) => 0, |
|||
}); |
|||
} |
|||
} |
|||
|
|||
pub fn compute1(&mut self) -> u32 { |
|||
let mut pc: usize = 0; |
|||
while pc < self.program.len() { |
|||
let opcode = self.program[pc]; |
|||
match opcode { |
|||
1 | 2 => { |
|||
if self.program.len() < pc + 3 { |
|||
break; |
|||
} |
|||
let arg1 = self.program[pc + 1] as usize; |
|||
let arg2 = self.program[pc + 2] as usize; |
|||
let res = self.program[pc + 3] as usize; |
|||
match opcode { |
|||
1 => self.program[res] = self.program[arg1] + self.program[arg2], |
|||
2 => self.program[res] = self.program[arg1] * self.program[arg2], |
|||
_ => {} |
|||
}; |
|||
} |
|||
99 => break, |
|||
_ => { |
|||
println!( |
|||
"An Error happened: Instruction {} at pos {}", |
|||
self.program[pc], pc |
|||
); |
|||
break; |
|||
} |
|||
} |
|||
pc += 4; |
|||
} |
|||
self.program[0] |
|||
} |
|||
|
|||
pub fn compute2(&self) -> u32 { |
|||
let mut result = 0u32; |
|||
let mut value = 0u32; |
|||
|
|||
while result != 19690720 && value < 10000 { |
|||
let mut data = Data::new(); |
|||
data.program = vec![0; self.program.len()]; |
|||
data.program.copy_from_slice(&self.program); |
|||
data.program[1] = value / 100 as u32; |
|||
data.program[2] = value % 100 as u32; |
|||
// println!("{:?}", data.program);
|
|||
result = data.compute1(); |
|||
value += 1; |
|||
} |
|||
value - 1 |
|||
} |
|||
} |
|||
Loading…
Reference in new issue