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 current = start;
23 let mut cups = vec![0; 10];
24
25 for &next in &input[1..] {
27 cups[current] = next;
28 current = next as usize;
29 }
30 cups[current] = start as u32;
31
32 play(&mut cups, start, 100);
33
34 (0..8).fold((0, 1), |(acc, i), _| (10 * acc + cups[i], cups[i] as usize)).0
35}
36
37pub fn part2(input: &[u32]) -> usize {
38 let start = input[0] as usize;
39 let mut current = start;
40 let mut cups: Vec<_> = (1..1_000_002).collect();
41
42 for &next in &input[1..] {
44 cups[current] = next;
45 current = next as usize;
46 }
47 cups[current] = 10;
48
49 cups[1_000_000] = start as u32;
51
52 play(&mut cups, start, 10_000_000);
53
54 let first = cups[1] as usize;
55 let second = cups[first] as usize;
56 first * second
57}
58
59fn play(cups: &mut [u32], mut current: usize, rounds: usize) {
60 for _ in 0..rounds {
61 let a = cups[current] as usize;
63 let b = cups[a] as usize;
64 let c = cups[b] as usize;
65
66 let mut dest = if current > 1 { current - 1 } else { cups.len() - 1 };
68 while dest == a || dest == b || dest == c {
69 dest = if dest > 1 { dest - 1 } else { cups.len() - 1 };
70 }
71
72 cups[current] = cups[c];
74 current = cups[c] as usize;
75
76 cups[c] = cups[dest];
78 cups[dest] = a as u32;
79 }
80}