heh
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/main.rs b/src/main.rs index d748991..1f3ae32 100644 --- a/src/main.rs +++ b/src/main.rs @@ -72,16 +72,28 @@ type u32x3 = Simd<u32, 3>; #[unsafe(no_mangle)] #[implicit_fn::implicit_fn] pub unsafe fn p1(x: &'static [u8; ISIZE]) -> impl Debug { - let mut v = util::ints(x).collect::<Vec<_>>(); - let mut p = 0i64; - let mut s = 0; - while v.len() > p.nat() { - let n = v[p.nat()]; - v[p.nat()] += if n >= 3 { -1 } else { 1 }; - p += n; - s += 1 + const N: usize = 16; + #[implicit_fn::implicit_fn] + fn redistribute(mut v: [i64; N]) -> [i64; N] { + let (p, &n) = v.iter().enumerate().rev().max_by_key(_.1).unwrap(); + v[p] = 0; + (0..N) + .cycle() + .skip(p) + .skip(1) + .take(n.nat()) + .for_each(|i| v[i] += 1); + v } - s + let mut v = util::ints(x).carr::<N>(); + let mut s = HashMap::default(); + for n in 1.. { + v = redistribute(v); + if let Some(s) = s.insert(v, n) { + return (n, n - s); + } + } + panic!() } const ISIZE: usize = include_bytes!("inp.txt").len(); fn main() { |