heh
2016/2
bendn 2025-02-22
parent 08cf35e · commit ce01b41
-rw-r--r--src/inp.txt6
-rw-r--r--src/main.rs57
-rw-r--r--src/util.rs28
3 files changed, 71 insertions, 20 deletions
diff --git a/src/inp.txt b/src/inp.txt
index 3c16faf..c35b43f 100644
--- a/src/inp.txt
+++ b/src/inp.txt
@@ -1 +1,5 @@
-L3, R2, L5, R1, L1, L2, L2, R1, R5, R1, L1, L2, R2, R4, L4, L3, L3, R5, L1, R3, L5, L2, R4, L5, R4, R2, L2, L1, R1, L3, L3, R2, R1, L4, L1, L1, R4, R5, R1, L2, L1, R188, R4, L3, R54, L4, R4, R74, R2, L4, R185, R1, R3, R5, L2, L3, R1, L1, L3, R3, R2, L3, L4, R1, L3, L5, L2, R2, L1, R2, R1, L4, R5, R4, L5, L5, L4, R5, R4, L5, L3, R4, R1, L5, L4, L3, R5, L5, L2, L4, R4, R4, R2, L1, L3, L2, R5, R4, L5, R1, R2, R5, L2, R4, R5, L2, L3, R3, L4, R3, L2, R1, R4, L5, R1, L5, L3, R4, L2, L2, L5, L5, R5, R2, L5, R1, L3, L2, L2, R3, L3, L4, R2, R3, L1, R2, L5, L3, R4, L4, R4, R3, L3, R1, L3, R5, L5, R1, R5, R3, L1 \ No newline at end of file
+LLRRLLRLDDUURLLRDUUUDULUDLUULDRDDDULLLRDDLLLRRDDRRUDDURDURLRDDULRRRLLULLULLRUULDLDDDUUURRRRURURDUDLLRRLDLLRRDRDLLLDDRRLUDDLDDLRDRDRDDRUDDRUUURLDUDRRLULLLDRDRRDLLRRLDLDRRRRLURLLURLRDLLRUDDRLRDRRURLDULURDLUUDURLDRURDRDLULLLLDUDRLLURRLRURUURDRRRULLRULLDRRDDDULDURDRDDRDUDUDRURRRRUUURRDUUDUDDDLRRUUDDUUDDDUDLDRDLRDUULLRUUDRRRDURLDDDLDLUULUDLLRDUDDDDLDURRRDRLLRUUUUDRLULLUUDRLLRDLURLURUDURULUDULUDURUDDULDLDLRRUUDRDDDRLLRRRRLDRRRD
+DRRRDULLRURUDRLRDLRULRRLRLDLUDLUURUUURURULRLRUDRURRRLLUDRLLDUDULLUUDLLUUUDDRLRUDDDDLDDUUDULDRRRDULUULDULDRUUULRUDDDUDRRLRLUDDURLLDRLUDUDURUUDRLUURRLUUUDUURUDURLUUUDRDRRRDRDRULLUURURDLUULLDUULUUDULLLDURLUDRURULDLDLRDRLRLUURDDRLDDLRRURUDLUDDDLDRLULLDRLLLURULLUURLUDDURRDDLDDDDRDUUULURDLUUULRRLRDLDRDDDRLLRUDULRRRUDRRLDRRUULUDDLLDUDDRLRRDLDDULLLRDURRURLLULURRLUULULRDLULLUUULRRRLRUDLRUUDDRLLLLLLLURLDRRUURLDULDLDDRLLLRDLLLDLRUUDRURDRDLUULDDRLLRRURRDULLULURRDULRUDUDRLUUDDDDUULDDDUUDURLRUDDULDDDDRUULUUDLUDDRDRD
+RRRULLRULDRDLDUDRRDULLRLUUDLULLRUULULURDDDLLLULRURLLURUDLRDLURRRLRLDLLRRURUDLDLRULDDULLLUUDLDULLDRDLRUULDRLURRRRUDDLUDLDDRUDDUULLRLUUDLUDUDRLRUULURUDULDLUUDDRLLUUURRURUDDRURDLDRRDRULRRRRUUUDRDLUUDDDUDRLRLDRRRRUDDRLLRDRLUDRURDULUUURUULLRDUUULRULRULLRULRLUDUDDULURDDLLURRRULDRULDUUDDULDULDRLRUULDRDLDUDRDUDLURLLURRDLLDULLDRULDLLRDULLRURRDULUDLULRRUDDULRLDLDLLLDUDLURURRLUDRRURLDDURULDURRDUDUURURULLLUDDLDURURRURDDDRRDRURRUURRLDDLRRLDDULRLLLDDUDRULUULLULUULDRLURRRLRRRLDRRLULRLRLURDUULDDUDLLLUURRRLDLUDRLLLRRUU
+URLDDDLDRDDDURRRLURRRRLULURLDDUDRDUDDLURURLLRDURDDRLRUURLDLLRDLRUUURLRLDLDRUDDDULLDULLDUULURLDRDUDRRLRRLULRDDULUDULDULLULDLRRLRRLLULRULDLLDULRRLDURRRRDLURDLUDUUUDLURRRRRUDDUDUUDULDLURRDRLRLUDUDUUDULDDURUDDRDRUDLRRUDRULDULRDRLDRUDRLLRUUDDRLURURDRRLRURULLDUUDRDLULRUULUDURRULLRLUUUUUDULRLUUDRDUUULLULUDUDDLLRRLDURRDDDLUDLUUDULUUULDLLLLUUDURRUDUDLULDRRRULLLURDURDDLRRULURUDURULRDRULLRURURRUDUULRULUUDDUDDUURLRLURRRRDLULRRLDRRDURUDURULULLRUURLLDRDRURLLLUUURUUDDDLDURRLLUUUUURLLDUDLRURUUUDLRLRRLRLDURURRURLULDLRDLUDDULLDUDLULLUUUDLRLDUURRR
+RLLDRDURRUDULLURLRLLURUDDLULUULRRRDRLULDDRLUDRDURLUULDUDDDDDUDDDDLDUDRDRRLRLRLURDURRURDLURDURRUUULULLUURDLURDUURRDLDLDDUURDDURLDDDRUURLDURRURULURLRRLUDDUDDDLLULUDUUUDRULLLLULLRDDRDLRDRRDRRDLDLDDUURRRDDULRUUURUDRDDLRLRLRRDLDRDLLDRRDLLUULUDLLUDUUDRDLURRRRULDRDRUDULRLLLLRRULDLDUUUURLDULDDLLDDRLLURLUDULURRRUULURDRUDLRLLLRDDLULLDRURDDLLDUDRUDRLRRLULLDRRDULDLRDDRDUURDRRRLRDLDUDDDLLUDURRUUULLDRLUDLDRRRRDDDLLRRDUURURLRURRDUDUURRDRRUDRLURLUDDDLUDUDRDRURRDDDDRDLRUDRDRLLDULRURULULDRLRLRRLDURRRUL
diff --git a/src/main.rs b/src/main.rs
index af76a17..e4d9497 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -40,30 +40,49 @@ use atools::prelude::*;
pub use util::prelude::*;
#[no_mangle]
-pub unsafe fn p1(mut i: &str) -> impl Display {
- let (mut p, mut dir) = ((0, 0), Dir::N);
- let mut set = HashSet::default();
- 'out: for (left, amount) in i
- .take_line()
- .ψ()
- .str()
- .split(", ")
- .map(str::as_bytes)
- .map(|x| (x[0] == b'L', reading::all::<u32>(&x[1..]) as i32))
- {
- dir = dir + if left { 255u8 } else { 1 };
- for _ in 0..amount {
- p = dir + p;
- if set.insert(p) == false {
- break 'out;
- }
+pub unsafe fn p1(i: &str) -> impl Display {
+ let mut pos = (1, 1);
+ let grid = b"123456789".map(|x| x - b'0').chunked::<3>();
+ let mut n = 0;
+ for &x in i.as_bytes() {
+ if x == b'\n' {
+ n = n * 10 + grid[pos.1][pos.0] as u32;
+ continue;
}
+ pos = Dir::urdl(x).lim_add(pos, [0, 2], [0, 2]);
}
- util::manhattan(p, (0, 0))
+ n
+}
+
+#[no_mangle]
+pub unsafe fn p2(i: &str) -> impl Display {
+ let mut pos = (1, 3);
+ let mut chars = Vec::<u8>::new();
+ #[rustfmt::skip]
+ let grid = [
+ [b' '; 7],
+ *b" 1 ",
+ *b" 234 ",
+ *b" 56789 ",
+ *b" ABC ",
+ *b" D ",
+ [b' '; 7],
+ ];
+ for &x in i.as_bytes() {
+ if x == b'\n' {
+ chars.push(grid[pos.1][pos.0]);
+ continue;
+ }
+ let npos = Dir::urdl(x) + pos;
+ if grid[npos.1][npos.0] != b' ' {
+ pos = npos;
+ }
+ }
+ chars.leak().str()
}
fn main() {
- unsafe { println!("{}", p1(include_str!("inp.txt"))) };
+ unsafe { println!("{}", p2(include_str!("inp.txt"))) };
}
#[bench]
diff --git a/src/util.rs b/src/util.rs
index f7139dd..f20cc17 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -199,6 +199,18 @@ pub enum Dir {
W = 3,
}
+impl Dir {
+ pub fn urdl(x: u8) -> Self {
+ match x {
+ b'U' => Self::N,
+ b'R' => Self::E,
+ b'D' => Self::S,
+ b'L' => Self::W,
+ x => unreachable!("{}", x as char),
+ }
+ }
+}
+
pub struct UnionFind {
p: Vec<usize>,
s: Vec<usize>,
@@ -502,6 +514,22 @@ impl std::ops::Add<(i64, i64)> for Dir {
}
}
+impl Dir {
+ pub fn lim_add(
+ self,
+ (x, y): (usize, usize),
+ [minx, maxx]: [usize; 2],
+ [miny, maxy]: [usize; 2],
+ ) -> (usize, usize) {
+ match self {
+ Dir::N => (x, y.saturating_sub(1).max(miny)),
+ Dir::E => (x.wrapping_add(1).min(maxx), y),
+ Dir::S => (x, y.wrapping_add(1).min(maxy)),
+ Dir::W => (x.saturating_sub(1).max(minx), y),
+ }
+ }
+}
+
impl std::ops::Add<(usize, usize)> for Dir {
type Output = (usize, usize);
fn add(self, (x, y): (usize, usize)) -> Self::Output {