Advertisement
Guest User

Untitled

a guest
Dec 5th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.28 KB | None | 0 0
  1. use std::io::Error;
  2.  
  3. #[derive(PartialEq)]
  4. enum State {
  5. Active,
  6. Halted,
  7. }
  8.  
  9. struct Computer {
  10. step: usize,
  11. data: Vec<i32>,
  12. state: State,
  13. input_buffer: Vec<i32>
  14. }
  15.  
  16. impl Computer {
  17. fn new(input_file: &str, ids: Vec<i32>) -> Computer {
  18. let data = std::fs::read_to_string(input_file).unwrap()
  19. .trim()
  20. .split(",")
  21. .map(|s| s.to_string())
  22. .map(|s| s.parse::<i32>().unwrap())
  23. .collect::<Vec<i32>>();
  24.  
  25. Computer {
  26. step: 0,
  27. data,
  28. state: State::Active,
  29. input_buffer: ids,
  30. }
  31. }
  32.  
  33. fn start(&mut self) {
  34. println!("Started...");
  35. while self.state != State::Halted {
  36. match self.data[self.step] % 100 {
  37. 1 => self.opcode_1(),
  38. 2 => self.opcode_2(),
  39. 3 => self.opcode_3(),
  40. 4 => self.opcode_4(),
  41. 5 => self.opcode_5(),
  42. 6 => self.opcode_6(),
  43. 7 => self.opcode_7(),
  44. 8 => self.opcode_8(),
  45. 99 => self.opcode_99(),
  46. n => panic!("No such code {}", n),
  47. }
  48. }
  49. }
  50.  
  51. fn opcode_1(&mut self) {
  52. let (mode1, mode2, mode3) = Computer::extract_modes(self.data[self.step]);
  53.  
  54. let index1 = self.setting_index_by_mode(1, mode1);
  55. let index2 = self.setting_index_by_mode(2, mode2);
  56. let index3 = self.setting_index_by_mode(3, mode3);
  57.  
  58. self.data[index3] = self.data[index1] + self.data[index2];
  59.  
  60. self.step += 4;
  61. }
  62.  
  63. fn opcode_2(&mut self) {
  64. let (mode1, mode2, mode3) = Computer::extract_modes(self.data[self.step]);
  65.  
  66. let index1 = self.setting_index_by_mode(1, mode1);
  67. let index2 = self.setting_index_by_mode(2, mode2);
  68. let index3 = self.setting_index_by_mode(3, mode3);
  69.  
  70. self.data[index3] = self.data[index1] * self.data[index2];
  71.  
  72. self.step += 4;
  73. }
  74.  
  75. fn opcode_3(&mut self) {
  76. let (mode1, _, _) = Computer::extract_modes(self.data[self.step]);
  77.  
  78. let index1 = self.setting_index_by_mode(1, mode1);
  79.  
  80. self.data[index1] = self.input_buffer.pop().unwrap();
  81.  
  82. self.step += 2;
  83. }
  84.  
  85. fn opcode_4(&mut self) {
  86. let (mode1, _, _) = Computer::extract_modes(self.data[self.step]);
  87.  
  88. let index1 = self.setting_index_by_mode(1, mode1);
  89.  
  90. println!("Data on position {} is {}", index1, self.data[index1]);
  91.  
  92. self.step += 2;
  93. }
  94.  
  95. fn opcode_5(&mut self) {
  96. let (mode1, mode2, _) = Computer::extract_modes(self.data[self.step]);
  97.  
  98. let index1 = self.setting_index_by_mode(1, mode1);
  99. let index2 = self.setting_index_by_mode(2, mode2);
  100.  
  101. if self.data[index1] != 0 {
  102. self.step = self.data[index2] as usize
  103. } else {
  104. self.step += 3
  105. };
  106. }
  107.  
  108. fn opcode_6(&mut self) {
  109. let (mode1, mode2, _) = Computer::extract_modes(self.data[self.step]);
  110.  
  111. let index1 = self.setting_index_by_mode(1, mode1);
  112. let index2 = self.setting_index_by_mode(2, mode2);
  113.  
  114. if self.data[index1] == 0 {
  115. self.step = self.data[index2] as usize
  116. } else {
  117. self.step += 3
  118. };
  119. }
  120.  
  121. fn opcode_7(&mut self) {
  122. let (mode1, mode2, mode3) = Computer::extract_modes(self.data[self.step]);
  123.  
  124. let index1 = self.setting_index_by_mode(1, mode1);
  125. let index2 = self.setting_index_by_mode(2, mode2);
  126. let index3 = self.setting_index_by_mode(3, mode3);
  127.  
  128. self.data[index3] = if self.data[index1] < self.data[index2] {
  129. 1
  130. } else {
  131. 0
  132. };
  133.  
  134. self.step += 4;
  135. }
  136.  
  137. fn opcode_8(&mut self) {
  138. let (mode1, mode2, mode3) = Computer::extract_modes(self.data[self.step]);
  139.  
  140. let index1 = self.setting_index_by_mode(1, mode1);
  141. let index2 = self.setting_index_by_mode(2, mode2);
  142. let index3 = self.setting_index_by_mode(3, mode3);
  143.  
  144. self.data[index3] = if self.data[index1] == self.data[index2] {
  145. 1
  146. } else {
  147. 0
  148. };
  149.  
  150. self.step += 4;
  151. }
  152.  
  153. fn opcode_99(&mut self) {
  154. self.state = State::Halted;
  155. }
  156.  
  157. fn extract_modes(op_code: i32) -> (i32, i32, i32){
  158. (
  159. op_code / 100 % 10,
  160. op_code / 1000 % 10,
  161. op_code / 10000 % 10,
  162. )
  163. }
  164.  
  165. fn setting_index_by_mode(&mut self, offset: usize, mode: i32) -> usize {
  166. if mode == 0 {
  167. self.data[self.step + offset] as usize
  168. } else if mode == 1 {
  169. self.step + offset
  170. } else {
  171. panic!("Mode does not exist");
  172. }
  173. }
  174. }
  175.  
  176. fn solution1(input_file: &str) -> Result<(), Error> {
  177. let mut computer = Computer::new(input_file, vec![1]);
  178.  
  179. computer.start();
  180.  
  181. Ok(())
  182. }
  183.  
  184. fn solution2(input_file: &str) -> Result<(), Error> {
  185. let mut computer = Computer::new(input_file, vec![5]);
  186.  
  187. computer.start();
  188.  
  189. Ok(())
  190. }
  191.  
  192. fn main() -> Result<(), Error> {
  193. solution1("input.txt")?;
  194. solution2("input.txt")?;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement