Guest User

Untitled

a guest
Dec 12th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.80 KB | None | 0 0
  1. use std::collections::VecDeque;
  2.  
  3. fn solve_a(players: u32, last_marble: u32) -> u32 {
  4. let mut score = vec![0; players as usize];
  5. let mut playfield = VecDeque::new();
  6. let mut cur_pos = 1usize;
  7.  
  8. playfield.push_back(0);
  9. playfield.push_back(1);
  10.  
  11. for i in 2..=last_marble {
  12. let player = ((i-1) % players) as usize;
  13. if i % 23 == 0 {
  14. let rem_pos = match cur_pos.wrapping_sub(7) {
  15. 0 => 0,
  16. e if e % playfield.len() == 0 => playfield.len(),
  17. e if e > playfield.len() => (cur_pos + playfield.len()) - 7,
  18. e => e,
  19. };
  20. score[player] += i + playfield.remove(rem_pos).unwrap();
  21. cur_pos = rem_pos;
  22. } else {
  23. let next_pos = match cur_pos + 2 {
  24. e if e > playfield.len() => e % playfield.len(),
  25. e if e == playfield.len() => e,
  26. e => e,
  27. };
  28. playfield.insert(next_pos, i);
  29.  
  30. cur_pos = next_pos;
  31. }
  32. // print!("[{}]", player+1);
  33. // for (i, p) in playfield.iter().enumerate() {
  34. // if i == cur_pos {
  35. // print!("\x1b[7m{:2}\x1b[0m ", p);
  36. // } else {
  37. // print!("{:2} ", p);
  38. // }
  39. // }
  40. // println!()
  41. }
  42. score.into_iter().max().unwrap()
  43. }
  44.  
  45. fn main() {
  46. let players = 455;
  47. let last_marble_points = 71223;
  48. println!("A: {}", solve_a(players, last_marble_points));
  49. println!("B: {}", solve_a(players, last_marble_points*100));
  50. }
  51.  
  52. #[test]
  53. fn test_a() {
  54. assert_eq!(32, solve_a(9, 25));
  55. assert_eq!(8317, solve_a(10, 1618));
  56. assert_eq!(146373, solve_a(13, 7999));
  57. assert_eq!(2764, solve_a(17, 1104));
  58. assert_eq!(54718, solve_a(21, 6111));
  59. assert_eq!(37305, solve_a(30, 5807));
  60. }
Add Comment
Please, Sign In to add comment