Advertisement
Guest User

day15

a guest
Dec 15th, 2022
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.85 KB | None | 0 0
  1. use std::cmp::{max, min};
  2. use std::collections::{HashMap, HashSet};
  3. use itertools::Itertools;
  4. use pathfinding::utils::absdiff;
  5. use rust_lapper::{Interval, Lapper};
  6. use scan_fmt::{scan_fmt};
  7.  
  8.  
  9. pub fn day15_2(){
  10.     let input = include_str!("../../input15").lines().map(
  11.         |x| {
  12.             let (x, y, beaconX, beaconY) = scan_fmt!(x, "Sensor at x={}, y={}: closest beacon is at x={}, y={}", i32, i32, i32, i32).unwrap();
  13.             let absDiffX = absdiff(x, beaconX);
  14.             let absDiffY = absdiff(y, beaconY);
  15.             let dist = absDiffX + absDiffY;
  16.             (x, y, dist)
  17.         }
  18.     ).collect_vec();
  19.  
  20.     let offset = 1_000_000_000;
  21.  
  22.     let bigBound: Lapper<u32, i32> = Lapper::new(vec![Interval{start:0+offset,  stop:4000000+offset,  val:1}]);
  23.     for j in 0..4000000
  24.     {
  25.         let mut smallTest1 = vec![];
  26.         for &(x, y, dist) in &input {
  27.             if (j >= y) && (y + dist) >= j
  28.             {
  29.                 //line above or equal center
  30.                 let distUsed = j - y;
  31.                 let distLeft = dist - distUsed;
  32.                 let unclampedMinX = x - distLeft;
  33.                 let unclampedMaxX = x + distLeft;
  34.                 if (unclampedMinX > 4000000) || (unclampedMaxX < 0)
  35.                 {
  36.                     //do nothing
  37.                 } else {
  38.                     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};
  39.                     smallTest1.push(interval);
  40.                 }
  41.             }
  42.             else if (j < y) && (y - dist) <= j
  43.             {
  44.                 //line below or equal center
  45.                 let distUsed = y - j;
  46.                 let distLeft = dist - distUsed;
  47.                 let unclampedMinX = x - distLeft;
  48.                 let unclampedMaxX = x + distLeft;
  49.                 if (unclampedMinX > 4000000) || (unclampedMaxX < 0)
  50.                 {
  51.                     //do nothing
  52.                 } else {
  53.                     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};
  54.                     smallTest1.push(interval);
  55.                 }
  56.             }
  57.         }
  58.         let smallTest = Lapper::new(smallTest1);
  59.         let mut cursor: usize = 0;
  60.         let mut intersections: Vec<Interval<_, bool>> = vec![];
  61.         for self_iv in bigBound.iter() {
  62.             for other_iv in smallTest.seek(self_iv.start, self_iv.stop, &mut cursor) {
  63.                 let start = std::cmp::max(self_iv.start, other_iv.start);
  64.                 let stop = std::cmp::min(self_iv.stop, other_iv.stop);
  65.                 intersections.push(Interval {
  66.                     start,
  67.                     stop,
  68.                     val: true,
  69.                 });
  70.             }
  71.         }
  72.         let mut temp_lapper = Lapper::new(intersections);
  73.         temp_lapper.merge_overlaps();
  74.         temp_lapper.set_cov();
  75.  
  76.  
  77.         if temp_lapper.cov() != 4000000
  78.         {
  79.             println!("ANS: {}",  (((temp_lapper.intervals[0].stop + 1) - offset) as u64 * 4000000) + j as u64);
  80.             return;
  81.         }
  82.     }
  83. }
  84. pub fn day15_1(){
  85.     let input = include_str!("../../input15").lines().map(
  86.         |x| {
  87.             let (x, y, beaconX, beaconY) = scan_fmt!(x, "Sensor at x={}, y={}: closest beacon is at x={}, y={}", i32, i32, i32, i32).unwrap();
  88.             let absDiffX = absdiff(x, beaconX);
  89.             let absDiffY = absdiff(y, beaconY);
  90.             let dist = absDiffX + absDiffY;
  91.             (x, y, dist)
  92.         }
  93.     ).collect_vec();
  94.  
  95.     let offset = 1_000_000_000;
  96.  
  97.     let j = 2000000;
  98.     let mut smallTest1 = vec![];
  99.     for &(x, y, dist) in &input {
  100.         if (j >= y) && (y + dist) >= j
  101.         {
  102.             //line above or equal center
  103.             let distUsed = j - y;
  104.             let distLeft = dist - distUsed;
  105.             let unclampedMinX = x - distLeft;
  106.             let unclampedMaxX = x + distLeft;
  107.             let interval : Interval<u32, i32> = Interval{start:((unclampedMinX + (offset as i32)) as u32), stop:((unclampedMaxX + (offset as i32)) as u32), val: 1};
  108.             smallTest1.push(interval);
  109.  
  110.         }
  111.         else if (j < y) && (y - dist) <= j
  112.         {
  113.             //line below or equal center
  114.             let distUsed = y - j;
  115.             let distLeft = dist - distUsed;
  116.             let unclampedMinX = x - distLeft;
  117.             let unclampedMaxX = x + distLeft;
  118.             let interval : Interval<u32, i32> = Interval{start:((unclampedMinX + (offset as i32)) as u32), stop:((unclampedMaxX + (offset as i32)) as u32), val: 1};
  119.             smallTest1.push(interval);
  120.         }
  121.     }
  122.     let smallTest = Lapper::new(smallTest1);
  123.     println!("ANS: {}",  smallTest.cov());
  124.  
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement