From 16636774b660c67fded2dbff57be7597ad452a37 Mon Sep 17 00:00:00 2001 From: logaritmisk Date: Fri, 3 Feb 2017 09:48:25 +0100 Subject: [PATCH] Update day 19. --- 2016/19/src/main.rs | 75 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 12 deletions(-) diff --git a/2016/19/src/main.rs b/2016/19/src/main.rs index 1c64250..14a3fe9 100644 --- a/2016/19/src/main.rs +++ b/2016/19/src/main.rs @@ -1,14 +1,10 @@ use std::collections::VecDeque; -fn main() { - let input = 3018458; - - - // Part 1. +pub fn steal_left(elf_count: usize) -> usize { let mut elfs = Vec::new(); - for i in 1..input + 1 { + for i in 1..elf_count + 1 { elfs.push(i); } @@ -26,25 +22,80 @@ fn main() { } } - println!("winner={:?}", elfs[0]); + elfs[0] +} - - // Part 2. +pub fn steal_across(elf_count: usize) -> usize { let mut elfs = VecDeque::new(); - for i in 1..input + 1 { + for i in 1..elf_count + 1 { elfs.push_back(i); } while elfs.len() > 1 { let buddy = elfs.len() / 2; - elfs.remove(buddy); + let b = elfs.remove(buddy); let elf = elfs.pop_front().unwrap(); + println!("{} ! {}", elf, b.unwrap()); + elfs.push_back(elf); } - println!("winner={:?}", elfs[0]); + elfs[0] +} + +pub fn steal_across_v2(elf_count: usize) -> usize { + let mut elfs = Vec::new(); + + for i in 1..elf_count + 1 { + elfs.push(i); + } + + elfs[0] +} + +fn main() { + let input = 3018458; + + // Part 1. + println!("winner={:?}", steal_left(input)); + + // Part 2. + println!("winner={:?}", steal_across(25)); +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_steal_left() { + assert_eq!(3, steal_left(5)); + + assert_eq!(489, steal_left(500)); + assert_eq!(977, steal_left(1_000)); + assert_eq!(953, steal_left(1_500)); + } + + #[test] + fn test_steal_across() { + assert_eq!(2, steal_across(5)); + + assert_eq!(271, steal_across(500)); + assert_eq!(271, steal_across(1_000)); + assert_eq!(813, steal_across(1_500)); + } + + #[test] + fn test_steal_across_v2() { + assert_eq!(2, steal_across_v2(5)); + + assert_eq!(271, steal_across_v2(500)); + assert_eq!(271, steal_across_v2(1_000)); + assert_eq!(813, steal_across_v2(1_500)); + } }