heh
| -rw-r--r-- | src/inp.txt | 6 | ||||
| -rw-r--r-- | src/main.rs | 57 | ||||
| -rw-r--r-- | src/util.rs | 28 |
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 { |