diff --git a/2025/09/p2.rs b/2025/09/p2.rs index 2578f46..e95003e 100644 --- a/2025/09/p2.rs +++ b/2025/09/p2.rs @@ -4,6 +4,8 @@ //! //! I think even adyacent is within the "other rectangle thing", because +use std::ops::Range; + #[unsafe(no_mangle)] pub extern "Rust" fn challenge_usize(buf: &[u8]) -> usize { // I do see how to make this in idk if O(n) or O(nlogn), but ima O(n^2) just at first @@ -53,24 +55,20 @@ fn is_really_contained( (rect0.0.max(rect1.0), rect0.1.max(rect1.1)), ); - let xran = (rect0.0 + 1)..=(rect1.0 - 1); - let yran = (rect0.1 + 1)..=(rect1.1 - 1); + let xran = (rect0.0 + 1)..(rect1.0); + let yran = (rect0.1 + 1)..(rect1.1); // Optimization, no need to check each range's point for (edge1, edge2) in edges { if edge1.0 == edge2.0 && xran.contains(&edge1.0) { - for y in edge1.1.min(edge2.1)..edge1.1.max(edge2.1) { - if yran.contains(&y) { - return false; - } + if rangeoverlap(&mkrange(edge1.1, edge2.1), &yran) { + return false; } } if edge1.1 == edge2.1 && yran.contains(&edge1.1) { - for x in edge1.0.min(edge2.0)..edge1.0.max(edge2.0) { - if xran.contains(&x) { - return false; - } + if rangeoverlap(&mkrange(edge1.0, edge2.0), &xran) { + return false; } } } @@ -78,6 +76,21 @@ fn is_really_contained( true } +fn mkrange(a: T, b: T) -> Range { + a.min(b)..a.max(b) +} + +fn rangeoverlap(a: &Range, b: &Range) -> bool { + if a.end <= b.start { + return false; + } + if a.start >= b.end { + return false; + } + + true +} + fn parse_ln(ln: &[u8]) -> (usize, usize) { let mut iter = ln.split(|&b| b == b',').map(|slice| { slice