1use crate::util::parse::*;
15
16pub fn parse(input: &str) -> Vec<u32> {
17 input.trim().bytes().map(|b| b.to_decimal() as u32).collect()
18}
19
20pub fn part1(input: &[u32]) -> u32 {
21 let start = input[0] as usize;
22 let mut cups = vec![0; 10];
23
24 for w in input.windows(2) {
26 cups[w[0] as usize] = w[1];
27 }
28 cups[*input.last().unwrap() as usize] = start as u32;
29
30 play(&mut cups, start, 100);
31
32 (0..8).fold((0, 1), |(acc, i), _| (10 * acc + cups[i], cups[i] as usize)).0
33}
34
35pub fn part2(input: &[u32]) -> usize {
36 let start = input[0] as usize;
37 let mut cups: Vec<_> = (1..1_000_002).collect();
38
39 for w in input.windows(2) {
41 cups[w[0] as usize] = w[1];
42 }
43 cups[*input.last().unwrap() as usize] = 10;
44
45 cups[1_000_000] = start as u32;
47
48 play(&mut cups, start, 10_000_000);
49
50 let first = cups[1] as usize;
51 let second = cups[first] as usize;
52 first * second
53}
54
55fn play(cups: &mut [u32], mut current: usize, rounds: usize) {
56 let end = cups.len() - 1;
57 let wrap = |n| if n > 1 { n - 1 } else { end };
58
59 for _ in 0..rounds {
60 let a = cups[current] as usize;
62 let b = cups[a] as usize;
63 let c = cups[b] as usize;
64
65 let mut dest = wrap(current);
67 while dest == a || dest == b || dest == c {
68 dest = wrap(dest);
69 }
70
71 cups[current] = cups[c];
73 current = cups[c] as usize;
74
75 cups[c] = cups[dest];
77 cups[dest] = a as u32;
78 }
79}