diff --git a/2025/01/all.rs b/2025/01/all.rs new file mode 100644 index 0000000..8b69daa --- /dev/null +++ b/2025/01/all.rs @@ -0,0 +1,34 @@ +type SmolI = i32; + +#[unsafe(no_mangle)] +unsafe extern "Rust" fn challenge_isize_duple(buf: &[u8]) -> (isize, isize) { + let mut count_p1 = 0; + let mut count_p2 = 0; + let mut pos = 50; + + let buf = unsafe { str::from_utf8_unchecked(buf.get_unchecked(..(buf.len() - 1))) }; + + for ln in buf.split('\n') { + let (dir, amt) = unsafe { (*ln.as_bytes().get_unchecked(0), ln.get_unchecked(1..)) }; + + let amt: SmolI = unsafe { amt.parse().unwrap_unchecked() }; + if amt == 0 { continue; } + let prev_pos = pos; + pos += ((((dir == b'R') as SmolI) << 1) - 1) * amt; + + count_p2 += if pos < 0 { + if prev_pos == 0 { + count_p2 -= 1; + }; + (pos - 1).div_euclid(100).abs() + } else if pos > 0 { + pos.div_euclid(100) + } else { + 1 + }; + pos = pos.rem_euclid(100); + count_p1 += (pos == 0) as SmolI; + } + + (count_p1 as isize, count_p2 as isize) +} diff --git a/2025/README.md b/2025/README.md index f98098a..68f684c 100644 --- a/2025/README.md +++ b/2025/README.md @@ -1,3 +1,5 @@ All this year is going to be firstly made in rust, I will do performance too. For that I'ma make a general helper that compiles each rust file into an `.so` file with a common exported main function that takes the input byte buffer and returns a solution (hoping all of them will be integers). I will make an external rust program that takes the day to run and the input, it will buffer and measure the execution speed. + +Performance is critical so we can break behavior with UB for the sake of correct data. diff --git a/2025/tester.rs b/2025/tester.rs index 092d4f8..04e8efd 100644 --- a/2025/tester.rs +++ b/2025/tester.rs @@ -31,7 +31,11 @@ pub mod dl { /// To get the error call [`ffi::error()`]. pub fn try_drop(self) -> Result<(), (Self, i32)> { let err = unsafe { ffi::close(self.0) }; - if err == 0 { Ok(()) } else { Err((self, err)) } + if err == 0 { + Ok(()) + } else { + Err((self, err)) + } } /// # Safety @@ -176,8 +180,8 @@ pub mod loader { // drop. untry!(unsafe { handle.symfn::>(c"challenge_isize") }.map(V::Isize)); untry!(unsafe { handle.symfn::>(c"challenge_isize") }.map(V::Usize)); - untry!(unsafe { handle.symfn::>(c"challenge_isize") }.map(V::UsizeDuple)); - untry!(unsafe { handle.symfn::>(c"challenge_isize") }.map(V::IsizeDuple)); + untry!(unsafe { handle.symfn::>(c"challenge_isize_duple") }.map(V::UsizeDuple)); + untry!(unsafe { handle.symfn::>(c"challenge_isize_duple") }.map(V::IsizeDuple)); None }