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 }