diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2024-12-17 11:12:23 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2024-12-17 11:12:23 +0100 |
| commit | d3e4b816edc2758a7773406aed6fbefdce8f7f9c (patch) | |
| tree | 1942ff47a104842ce547b4444e0a279fa053e1b3 | |
| parent | 69ca6eac5247cdff0deb8938de698c5289131ee1 (diff) | |
day14 solution 1
| -rw-r--r-- | src/bin/day14.rs | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/bin/day14.rs b/src/bin/day14.rs new file mode 100644 index 0000000..531e1b4 --- /dev/null +++ b/src/bin/day14.rs @@ -0,0 +1,100 @@ +use regex::Regex; +use std::collections::HashMap; + +static DAY: u8 = 14; + +fn main() { + let input = advent::read_lines(DAY); + println!("{DAY}a: {}", safety_factor(&input, Position { x: 101, y: 103 })); + println!("{DAY}b: {}", 0); +} + +struct Position { + x: isize, + y: isize, +} + +struct Robot { + pos: Position, + velocity: Position, +} + +impl Robot { + fn new(input: &str) -> Robot { + let re = Regex::new(r"p=([0-9]+),([0-9]+) v=([-0-9]+),([-0-9]+)").unwrap(); + let caps = re.captures(input).unwrap(); + let x = caps.get(1).unwrap().as_str().parse::<isize>().unwrap(); + let y = caps.get(2).unwrap().as_str().parse::<isize>().unwrap(); + let dx = caps.get(3).unwrap().as_str().parse::<isize>().unwrap(); + let dy = caps.get(4).unwrap().as_str().parse::<isize>().unwrap(); + + Robot { + pos: Position { x, y }, + velocity: Position { x: dx, y: dy }, + } + } + + fn travel(&mut self, area: &Position) { + self.pos.x = (self.pos.x + self.velocity.x + area.x) % area.x; + self.pos.y = (self.pos.y + self.velocity.y + area.y) % area.y; + } + + fn quadrant(&self, area: &Position) -> u8 { + if self.pos.x < area.x / 2 && self.pos.y < area.y / 2 { + 1 + } else if self.pos.x < area.x / 2 && self.pos.y > area.y / 2 { + 2 + } else if self.pos.x > area.x / 2 && self.pos.y < area.y / 2 { + 3 + } else if self.pos.x > area.x / 2 && self.pos.y > area.y / 2 { + 4 + } else { + 0 + } + } +} + +fn safety_factor(input: &[String], area: Position) -> u32 { + let mut robots = input.iter() + .map(|line| Robot::new(line)) + .collect::<Vec<_>>(); + for _ in 0 .. 100 { + for robot in robots.iter_mut() { + robot.travel(&area); + } + } + + let mut quadrants = HashMap::new(); + for robot in &robots { + let quadrant = robot.quadrant(&area); + if quadrant != 0 { + let entry = quadrants.entry(quadrant).or_insert(0); + *entry += 1; + } + } + quadrants.values().product() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test() { + let input = [ + "p=0,4 v=3,-3", + "p=6,3 v=-1,-3", + "p=10,3 v=-1,2", + "p=2,0 v=2,-1", + "p=0,0 v=1,3", + "p=3,0 v=-2,-2", + "p=7,6 v=-1,-3", + "p=3,0 v=-1,-2", + "p=9,3 v=2,3", + "p=7,3 v=-1,2", + "p=2,4 v=2,-3", + "p=9,5 v=-3,-3", + ].iter().map(|&x| String::from(x)).collect::<Vec<_>>(); + assert_eq!(safety_factor(&input, Position { x: 11, y: 7}), 12); + } +} |
