Advertisement
Guest User

day15 _revised

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