heh
| -rw-r--r-- | src/inp.txt | 1 | ||||
| -rw-r--r-- | src/main.rs | 67 | ||||
| -rw-r--r-- | src/util.rs | 70 |
3 files changed, 99 insertions, 39 deletions
diff --git a/src/inp.txt b/src/inp.txt index bffcc96..0cde9ae 100644 --- a/src/inp.txt +++ b/src/inp.txt @@ -1261,3 +1261,4 @@ 6,8,271~9,8,271 7,0,11~7,2,11 6,5,28~6,6,28 + diff --git a/src/main.rs b/src/main.rs index c7d70b8..9a577b5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,18 +31,19 @@ struct Piece { a: [u16; 3], b: [u16; 3], } - pub fn run(i: &str) -> impl Display { let mut pieces = vec![]; - i.行() - .map(|x| { - let (a, b) = x - .μ('~') - .mb(|x| x.split(|&x| x == b',').map(|x| 読む::完了(x, 10)).Ν::<3>()); - pieces.push(Piece { a, b }); - }) - .Θ(); - + let mut i = i.as_bytes(); + while i.len() > 0 { + pieces.push(Piece { + a: 読む::迄::<u16>(&mut i, b',') + .and(読む::迄(&mut i, b',')) + .and(読む::迄(&mut i, b'~')), + b: 読む::迄::<u16>(&mut i, b',') + .and(読む::迄(&mut i, b',')) + .and(読む::迄または完了(&mut i, b'\n')), + }); + } pieces.sort_unstable_by(|a, b| a.a[2].cmp(&b.a[2])); let mut m: HashMap<(u16, u16), u16> = HashMap::new(); for p in pieces.iter_mut() { @@ -56,30 +57,30 @@ pub fn run(i: &str) -> impl Display { b: p.b.trunc().and(k + p.b[2] - p.a[2]), }; } - let mut x = vec![0; pieces.len()]; - for (elem, i) in x.iter_mut().ι::<usize>() { - let mut m: HashMap<(u16, u16), u16> = HashMap::new(); - let mut n = 0; - for (p, j) in pieces.clone().iter_mut().ι::<usize>() { - if j == i { - continue; - } - let a = (p.a[0]..=p.b[0]).flat_map(|x| (p.a[1]..=p.b[1]).map(move |y| (x, y))); - let k = a.clone().map(|x| *m.get(&x).unwrap_or(&0)).max().unwrap() + 1; - for e in a { - m.insert(e, k + p.b[2] - p.a[2]); - } - let z = p.a[2]; - *p = Piece { - a: p.a.trunc().and(k), - b: p.b.trunc().and(k + p.b[2] - p.a[2]), - }; + (0..pieces.len()) + .map(|i| { + let mut m: HashMap<(u16, u16), u16> = HashMap::new(); + let mut n = 0; + for (p, j) in pieces.clone().iter_mut().ι::<usize>() { + if j == i { + continue; + } + let a = (p.a[0]..=p.b[0]).flat_map(|x| (p.a[1]..=p.b[1]).map(move |y| (x, y))); + let k = a.clone().map(|x| *m.get(&x).unwrap_or(&0)).max().unwrap() + 1; + for e in a { + m.insert(e, k + p.b[2] - p.a[2]); + } + let z = p.a[2]; + *p = Piece { + a: p.a.trunc().and(k), + b: p.b.trunc().and(k + p.b[2] - p.a[2]), + }; - n += (k < z) as u16; - } - *elem = n - } - x.into_iter().map(|x| x as u64).sum::<u64>() + n += (k < z) as u16; + } + n as u64 + }) + .sum::<u64>() } fn main() { diff --git a/src/util.rs b/src/util.rs index 91abd99..90a0130 100644 --- a/src/util.rs +++ b/src/util.rs @@ -876,6 +876,29 @@ pub mod 読む { } } } + pub trait Ten { + fn ten() -> Self; + } + macro_rules! tenz { + ($for:ty) => { + impl Ten for $for { + fn ten() -> $for { + 10 + } + } + }; + } + tenz!(u8); + tenz!(u16); + tenz!(u32); + tenz!(u64); + tenz!(u128); + tenz!(i8); + tenz!(i16); + tenz!(i32); + tenz!(i64); + tenz!(i128); + const DIG: [u8; 256] = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, @@ -910,16 +933,45 @@ pub mod 読む { } Ok(num) } + pub fn 迄または完了< + T: Default + + std::ops::Mul<T, Output = T> + + std::ops::Add<T, Output = T> + + From<u8> + + Copy + + Ten, + >( + x: &mut &[u8], + until: u8, + ) -> T { + let mut n = T::default(); + while let Ok(x) = x.by() { + if x == until { + return n; + } + n = n * T::ten() + T::from(x - b'0') + } + n + } - pub fn 不全の(x: &mut &[u8]) -> u64 { - let mut n = 0; + pub fn 迄< + T: Default + + std::ops::Mul<T, Output = T> + + std::ops::Add<T, Output = T> + + From<u8> + + Copy + + Ten, + >( + x: &mut &[u8], + until: u8, + ) -> T { + let mut n = T::default(); loop { - let byte = x[0]; - x.skip(1); - if byte == b' ' { + let byte = x.by().ψ(); + if byte == until { return n; } - n = n * 10 + (byte - b'0') as u64; + n = n * T::ten() + T::from(byte - b'0'); } } @@ -1274,3 +1326,9 @@ impl<const N: usize, T> Push<T, N> for [T; N] { std::array::from_fn(|_| iter.next().unwrap()) } } + +impl<T> Push<T, 1> for T { + fn and(self, and: T) -> [T; 2] { + [self, and] + } +} |