Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::cmp::{max, min};
- use std::collections::{HashMap, HashSet};
- use itertools::Itertools;
- use pathfinding::utils::absdiff;
- use rust_lapper::{Interval, Lapper};
- use scan_fmt::{scan_fmt};
- pub fn day15_2(){
- let input = include_str!("../../input15").lines().map(
- |x| {
- let (x, y, beaconX, beaconY) = scan_fmt!(x, "Sensor at x={}, y={}: closest beacon is at x={}, y={}", i32, i32, i32, i32).unwrap();
- let absDiffX = absdiff(x, beaconX);
- let absDiffY = absdiff(y, beaconY);
- let dist = absDiffX + absDiffY;
- (x, y, dist)
- }
- ).collect_vec();
- let offset = 1_000_000_000;
- let bigBound: Lapper<u32, i32> = Lapper::new(vec![Interval{start:0+offset, stop:4000000+offset, val:1}]);
- for j in 0..4000000
- {
- let mut smallTest1 = vec![];
- for &(x, y, dist) in &input {
- if (j >= y) && (y + dist) >= j
- {
- //line above or equal center
- let distUsed = j - y;
- let distLeft = dist - distUsed;
- let unclampedMinX = x - distLeft;
- let unclampedMaxX = x + distLeft;
- if (unclampedMinX > 4000000) || (unclampedMaxX < 0)
- {
- //do nothing
- } else {
- let interval : Interval<u32, i32> = Interval{start:max((unclampedMinX + (offset as i32)) as u32, 0+offset), stop:min(4000000+offset, (unclampedMaxX + (offset as i32)) as u32), val: 1};
- smallTest1.push(interval);
- }
- }
- else if (j < y) && (y - dist) <= j
- {
- //line below or equal center
- let distUsed = y - j;
- let distLeft = dist - distUsed;
- let unclampedMinX = x - distLeft;
- let unclampedMaxX = x + distLeft;
- if (unclampedMinX > 4000000) || (unclampedMaxX < 0)
- {
- //do nothing
- } else {
- let interval : Interval<u32, i32> = Interval{start:max((unclampedMinX + (offset as i32)) as u32, 0+offset), stop:min(4000000+offset, (unclampedMaxX + (offset as i32)) as u32), val: 1};
- smallTest1.push(interval);
- }
- }
- }
- let smallTest = Lapper::new(smallTest1);
- let mut cursor: usize = 0;
- let mut intersections: Vec<Interval<_, bool>> = vec![];
- for self_iv in bigBound.iter() {
- for other_iv in smallTest.seek(self_iv.start, self_iv.stop, &mut cursor) {
- let start = std::cmp::max(self_iv.start, other_iv.start);
- let stop = std::cmp::min(self_iv.stop, other_iv.stop);
- intersections.push(Interval {
- start,
- stop,
- val: true,
- });
- }
- }
- let mut temp_lapper = Lapper::new(intersections);
- temp_lapper.merge_overlaps();
- temp_lapper.set_cov();
- if temp_lapper.cov() != 4000000
- {
- println!("ANS: {}", (((temp_lapper.intervals[0].stop + 1) - offset) as u64 * 4000000) + j as u64);
- return;
- }
- }
- }
- pub fn day15_1(){
- let input = include_str!("../../input15").lines().map(
- |x| {
- let (x, y, beaconX, beaconY) = scan_fmt!(x, "Sensor at x={}, y={}: closest beacon is at x={}, y={}", i32, i32, i32, i32).unwrap();
- let absDiffX = absdiff(x, beaconX);
- let absDiffY = absdiff(y, beaconY);
- let dist = absDiffX + absDiffY;
- (x, y, dist)
- }
- ).collect_vec();
- let offset = 1_000_000_000;
- let j = 2000000;
- let mut smallTest1 = vec![];
- for &(x, y, dist) in &input {
- if (j >= y) && (y + dist) >= j
- {
- //line above or equal center
- let distUsed = j - y;
- let distLeft = dist - distUsed;
- let unclampedMinX = x - distLeft;
- let unclampedMaxX = x + distLeft;
- let interval : Interval<u32, i32> = Interval{start:((unclampedMinX + (offset as i32)) as u32), stop:((unclampedMaxX + (offset as i32)) as u32), val: 1};
- smallTest1.push(interval);
- }
- else if (j < y) && (y - dist) <= j
- {
- //line below or equal center
- let distUsed = y - j;
- let distLeft = dist - distUsed;
- let unclampedMinX = x - distLeft;
- let unclampedMaxX = x + distLeft;
- let interval : Interval<u32, i32> = Interval{start:((unclampedMinX + (offset as i32)) as u32), stop:((unclampedMaxX + (offset as i32)) as u32), val: 1};
- smallTest1.push(interval);
- }
- }
- let smallTest = Lapper::new(smallTest1);
- println!("ANS: {}", smallTest.cov());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement