Guest User

Untitled

a guest
Dec 12th, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.38 KB | None | 0 0
  1. struct Mem {
  2. mem : Vec<i32>
  3. }
  4.  
  5. impl Mem {
  6. pub fn new(mem : &Vec<i32>) -> Mem {
  7. Mem {
  8. mem : mem.clone()
  9. }
  10. }
  11.  
  12. pub fn mem(&self) -> &Vec<i32> {
  13. &self.mem
  14. }
  15.  
  16. pub fn highest_bank(&self) -> usize {
  17. let mut index = 0;
  18. let mut max = 0;
  19. for (i, &bank) in self.mem.iter().enumerate().rev() {
  20. if bank >= max {
  21. max = bank;
  22. index = i;
  23. }
  24. }
  25. index
  26. }
  27.  
  28. pub fn redistribute(&mut self) {
  29. let mut idx = self.highest_bank();
  30. let mut val = self.mem[idx];
  31. self.mem[idx] = 0;
  32. while val > 0 {
  33. val -= 1;
  34. idx = (idx + 1) % self.mem.len();
  35. self.mem[idx] += 1;
  36. }
  37. }
  38.  
  39. pub fn show(&self) {
  40. println!("{:?}", self.mem);
  41. }
  42. }
  43.  
  44. fn main() {
  45. let test_data = vec![0, 2, 7, 0];
  46. let prod_data = vec![10, 3, 15, 10, 5, 15, 5, 15, 9, 2, 5, 8, 5, 2, 3, 6];
  47. let mut mem = Mem::new(&prod_data);
  48. mem.show();
  49.  
  50. let mut cycle = 0;
  51. let mut banks = Vec::<Vec<i32>>::new();
  52. loop {
  53. cycle += 1;
  54. mem.redistribute();
  55. mem.show();
  56. let curr_mem = mem.mem();
  57. if banks.contains(&curr_mem) {
  58. break;
  59. }
  60. banks.push(curr_mem.clone());
  61. }
  62.  
  63. let mut cycle_2 = 0;
  64. let first = mem.mem().clone();
  65. loop {
  66. cycle_2 += 1;
  67. mem.redistribute();
  68. mem.show();
  69. if &first == mem.mem() {
  70. break;
  71. }
  72. }
  73.  
  74. println!("cycles : {}", cycle);
  75. println!("cycles 2: {}", cycle_2);
  76. }
Add Comment
Please, Sign In to add comment