From fa26f694d8cf98272763952a698301ee9935c19e Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Thu, 26 Jun 2025 09:47:23 +0200 Subject: Added 2022, first few problems --- 2022/09/a.rs | 6 ++++++ 2022/09/b.rs | 6 ++++++ 2022/09/common.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 2022/09/a.rs create mode 100644 2022/09/b.rs create mode 100644 2022/09/common.rs (limited to '2022/09') diff --git a/2022/09/a.rs b/2022/09/a.rs new file mode 100644 index 0000000..0fc6278 --- /dev/null +++ b/2022/09/a.rs @@ -0,0 +1,6 @@ +mod common; +use common::*; + +fn main() { + println!("{}", simulate(2).len()); +} diff --git a/2022/09/b.rs b/2022/09/b.rs new file mode 100644 index 0000000..1d43500 --- /dev/null +++ b/2022/09/b.rs @@ -0,0 +1,6 @@ +mod common; +use common::*; + +fn main() { + println!("{}", simulate(10).len()); +} diff --git a/2022/09/common.rs b/2022/09/common.rs new file mode 100644 index 0000000..45048da --- /dev/null +++ b/2022/09/common.rs @@ -0,0 +1,46 @@ +use std::collections::HashSet; + +fn get_dir(c: char) -> (i64, i64) { + match c { + 'R' => (1, 0), + 'L' => (-1, 0), + 'U' => (0, 1), + 'D' => (0, -1), + _ => panic!("Unexpected char") + } +} + +fn follow(lead: (i64, i64), trail: (i64, i64)) -> (i64, i64) { + let max1 = |x: i64| x / (2 - (x%2).abs()); + let d = (max1(lead.0 - trail.0), max1(lead.1 - trail.1)); + (trail.0 + d.0, trail.1 + d.1) +} + +fn step(r: &mut Vec<(i64, i64)>, d: (i64, i64)) { + r[0] = (r[0].0 + d.0, r[0].1 + d.1); + for i in 1..r.len() { + if (r[i].0 - r[i-1].0).abs() > 1 || (r[i].1 - r[i-1].1).abs() > 1 { + r[i] = follow(r[i-1], r[i]); + } else { + break; + } + } +} + +pub fn simulate(n: usize) -> HashSet<(i64, i64)> { + let mut r = vec![(0, 0); n]; + let mut visited = HashSet::<(i64, i64)>::new(); + visited.insert(r[n-1]); + + let mut line = String::new(); + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + let dir = get_dir(line.chars().nth(0).unwrap()); + let l = line[2..line.len()-1].parse::().unwrap(); + for _ in 0..l { + step(&mut r, dir); + visited.insert(r[n-1]); + } + line.clear(); + } + visited +} -- cgit v1.3