aoc

My solutions for the Advent of Code
git clone https://git.tronto.net/aoc
Download | Log | Files | Refs | README

common.rs (1595B)


      1 #[derive(Copy, Clone, Hash, Eq, PartialEq)]
      2 pub struct Pos {
      3     pub x: i64,
      4     pub y: i64
      5 }
      6 
      7 #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq)]
      8 pub struct Range {
      9     pub left: i64,
     10     pub right: i64
     11 }
     12 
     13 #[derive(Copy, Clone, Hash, Eq, PartialEq)]
     14 pub struct Sensor {
     15     pub s: Pos,
     16     pub b: Pos,
     17     pub d: i64
     18 }
     19 
     20 pub fn distance(p: Pos, q: Pos) -> i64 {
     21    (p.x-q.x).abs() + (p.y-q.y).abs() 
     22 }
     23 
     24 impl Sensor {
     25     pub fn from_line(line: &str) -> Sensor {
     26         let mut i = 1 + line.find('=').unwrap();
     27         let mut j = line.find(',').unwrap();
     28         let sx = line[i..j].parse::<i64>().unwrap();
     29 
     30         i = j+4;
     31         j = line.find(':').unwrap();
     32         let sy = line[i..j].parse::<i64>().unwrap();
     33 
     34         i = 1 + j + line[j..].find('=').unwrap();
     35         j = i + line[i..].find(',').unwrap();
     36         let bx = line[i..j].parse::<i64>().unwrap();
     37 
     38         i = j+4;
     39         j = line.len()-1;
     40         let by = line[i..j].parse::<i64>().unwrap();
     41 
     42         let s = Pos { x: sx, y: sy };
     43         let b = Pos { x: bx, y: by };
     44         let d = distance(s, b);
     45         Sensor { s, b, d }
     46     }
     47 
     48     pub fn get_range(&self, y: i64) -> Range {
     49         let d = distance(self.s, Pos { x: self.s.x, y });
     50         Range {
     51             left: self.s.x - self.d + d,
     52             right: self.s.x + self.d - d
     53         }
     54     }
     55 }
     56 
     57 pub fn read_sensors_from_stdin() -> Vec<Sensor> {
     58     let mut v = Vec::<Sensor>::new();
     59     let mut line = String::new();
     60     while std::io::stdin().read_line(&mut line).unwrap() > 0 {
     61         v.push(Sensor::from_line(&line));
     62         line.clear();
     63     }
     64     v
     65 }