heh
bendn 2023-12-23
parent b5caab5 · commit a985345
-rw-r--r--src/inp.txt1
-rw-r--r--src/main.rs67
-rw-r--r--src/util.rs70
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]
+ }
+}