heh
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs50
1 files changed, 33 insertions, 17 deletions
diff --git a/src/main.rs b/src/main.rs
index 5e0ec6f..60c0c6c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -69,26 +69,42 @@ pub use util::prelude::*;
#[unsafe(no_mangle)]
#[implicit_fn::implicit_fn]
pub unsafe fn p1(x: &'static [u8; ISIZE]) -> impl Debug {
- let mut i = x.iter();
- let mut garbo = false;
- let mut group = 0;
- let mut score = 0;
- let mut garbage = 0;
- while let Some(x) = i.next() {
- match x {
- b'{' if !garbo => group += 1,
- b'}' if !garbo => {
- score += group;
- group -= 1
+ // let lengths = util::ints(x).map(_ as usize).collect::<Vec<_>>();
+ let lengths = x.map(_ as usize).couple([17, 31, 73, 47, 23]);
+
+ let mut x = range::<256>();
+ let mut c = 0;
+ let mut s = 0;
+
+ for _ in 0..64 {
+ for &l in &lengths {
+ if (c + l) > 256 {
+ let mut i = x
+ .into_iter()
+ .cycle()
+ .skip(c)
+ .take(l)
+ .collect::<Vec<_>>()
+ .into_iter()
+ .rev();
+ x.get_mut(c..(c + l).min(256))
+ .map(|s| s.copy_from_slice(&i.by_ref().take(s.len()).collect::<Vec<_>>()));
+ x[..c + l - 256].copy_from_slice(&i.by_ref().take(c + l - 256).collect::<Vec<_>>());
+ assert_eq!(i.collect::<Vec<_>>(), &[]);
+ } else {
+ x.get_mut(c..(c + l).min(256)).map(_.reverse());
}
- b'<' if !garbo => garbo = true,
- b'>' => garbo = false,
- b'!' if garbo => drop(i.next()),
- _ if garbo => garbage += 1,
- _ => {}
+
+ c += l + s;
+ c %= 256;
+ s += 1;
}
}
- (score, garbage)
+
+ x.chunked::<16>()
+ .map(|x| x.into_iter().reduce(_ ^ _).ψ())
+ .into_iter()
+ .fold(String::default(), |a, b| format!("{a}{b:02x}"))
}
const ISIZE: usize = include_bytes!("inp.txt").len();
fn main() {