Advertisement
Guest User

Untitled

a guest
Dec 19th, 2016
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.07 KB | None | 0 0
  1. use std::collections::VecDeque;                      
  2.  
  3. fn p1(n: usize) -> usize {
  4.     let mut v: VecDeque<usize> = (1..n + 1).collect();
  5.     while v.len() > 1 {
  6.         let front = v.pop_front().unwrap();
  7.         v.push_back(front);
  8.         v.pop_front();
  9.     }
  10.     v[0]
  11. }
  12.  
  13. #[cfg(test)]
  14. mod tests {
  15.  
  16.     use super::{p1, p2};
  17.  
  18.     #[test]
  19.     fn test_p1() {
  20.         assert_eq!(p1(5), 3);
  21.     }
  22.  
  23.     #[test]
  24.     fn test_p2() {
  25.         assert_eq!(p2(5), 2);
  26.     }
  27. }
  28.  
  29. fn p2(n: usize) -> usize {
  30.     let mut v1: VecDeque<usize> = (1..(n+1)/2 + 1).collect();
  31.     let mut v2: VecDeque<usize> = ((n+1)/2 + 1..(n+1)).collect();
  32.     loop {
  33.         if v2.len() >= v1.len() {
  34.             v2.pop_front();
  35.             if v2.is_empty() {
  36.                 return v1[0];
  37.             }
  38.         } else {
  39.             v1.pop_back();
  40.         }
  41.         v1.push_back(v2.pop_front().unwrap());
  42.         v2.push_back(v1.pop_front().unwrap());
  43.     }
  44. }
  45.  
  46. fn main() {
  47.     const INPUT: usize = 3012210;
  48.     println!("P1 = {}", p1(INPUT));
  49.     println!("P2 = {}", p2(INPUT));
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement