commit 3ca7543b9332b23151bd64bf143c3bf570dd44f6
parent 51190479b1c1a58283919250ca3ee207ef6fa2a3
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date: Wed, 2 Jul 2025 11:21:58 +0200
Day 14 2022
Diffstat:
5 files changed, 323 insertions(+), 0 deletions(-)
diff --git a/2022/14/a.rs b/2022/14/a.rs
@@ -0,0 +1,22 @@
+mod common;
+use common::*;
+
+fn drop(map: &mut Map, i: (usize, usize)) -> bool {
+ let (x, y) = i;
+ if y > map.ymax { return false; }
+
+ for j in vec![(x, y+1), (x-1, y+1), (x+1, y+1)].into_iter() {
+ if !map.at(j) { return drop(map, j); }
+ }
+
+ map[i] = true;
+ true
+}
+
+fn main() {
+ let mut map = read_map_from_stdin();
+ let mut i = 0;
+ while drop(&mut map, (500, 0)) { i+= 1; }
+ //map.print();
+ println!("{i}");
+}
diff --git a/2022/14/b.rs b/2022/14/b.rs
@@ -0,0 +1,22 @@
+mod common;
+use common::*;
+
+fn drop(map: &mut Map, i: (usize, usize)) -> bool {
+ let (x, y) = i;
+ if y < map.ymax {
+ for j in vec![(x, y+1), (x-1, y+1), (x+1, y+1)].into_iter() {
+ if !map.at(j) { return drop(map, j); }
+ }
+ }
+
+ map[i] = true;
+ !map.at((500, 0)) // Returns false after filling the last -> off by 1
+}
+
+fn main() {
+ let mut map = read_map_from_stdin();
+ let mut i = 0;
+ while drop(&mut map, (500, 0)) { i += 1; }
+ //map.print();
+ println!("{}", i+1);
+}
diff --git a/2022/14/common.rs b/2022/14/common.rs
@@ -0,0 +1,129 @@
+use std::cmp::{min, max};
+use std::ops::{Index, IndexMut};
+
+pub struct Map {
+ cells: Vec<Vec<bool>>,
+ pub xmin: usize,
+ pub xmax: usize,
+ pub ymin: usize,
+ pub ymax: usize
+}
+
+fn line_from_str(s: &str) -> Vec<(usize, usize)> {
+ let mut line = vec![];
+ let mut i = 0;
+ while i < s.len() {
+ let mut j = s[i..].find(',').unwrap();
+ let x = s[i..i+j].parse::<usize>().unwrap();
+ i += j+1;
+ j = s[i..].find(|c| c == ' ' || c == '\n').unwrap();
+ let y = s[i..i+j].parse::<usize>().unwrap();
+ i += j+4;
+ line.push((x, y));
+ }
+ line
+}
+
+impl Index<(usize, usize)> for Map {
+ type Output = bool;
+ fn index(&self, i: (usize, usize)) -> &bool {
+ self.validate_index(i);
+ &self.cells[i.1-self.ymin][i.0-self.xmin]
+ }
+}
+
+impl IndexMut<(usize, usize)> for Map {
+ fn index_mut(&mut self, i: (usize, usize)) -> &mut bool {
+ self.validate_index(i);
+ &mut self.cells[i.1-self.ymin][i.0-self.xmin]
+ }
+}
+
+impl Map {
+ fn in_bounds(&self, i: (usize, usize)) -> bool {
+ i.0 >= self.xmin && i.0 <= self.xmax &&
+ i.1 >= self.ymin && i.1 <= self.ymax
+ }
+
+ fn validate_index(&self, i: (usize, usize)) {
+ if !self.in_bounds(i) {
+ panic!("Out of bounds: {} {} outside [{}, {}]x[{}, {}]",
+ i.0, i.1, self.xmin, self.xmax, self.ymin, self.ymax);
+ }
+ }
+
+ pub fn at(&self, i: (usize, usize)) -> bool {
+ self.in_bounds(i) && self[i]
+ }
+
+ fn set_bounds(&mut self, lines: &Vec<Vec<(usize, usize)>>) {
+ for l in lines {
+ for p in l {
+ self.xmin = min(self.xmin, p.0);
+ self.xmax = max(self.xmax, p.0);
+ self.ymin = min(self.ymin, p.1);
+ self.ymax = max(self.ymax, p.1+1);
+ }
+ }
+
+ // Part 2 requires a larger map
+ self.xmin = min(self.xmin, 500 - self.ymax - 1);
+ self.xmax = max(self.xmax, 500 + self.ymax + 1);
+ self.cells = vec![
+ vec![false; self.xmax-self.xmin+1]; self.ymax-self.ymin+1
+ ];
+ }
+
+ fn fill_line(&mut self, line: &Vec<(usize, usize)>) {
+ for i in 0..line.len()-1 {
+ if line[i].0 == line[i+1].0 {
+ let y0 = min(line[i].1, line[i+1].1);
+ let y1 = max(line[i].1, line[i+1].1);
+ for y in y0..=y1 {
+ self[(line[i].0, y)] = true;
+ }
+ } else {
+ let x0 = min(line[i].0, line[i+1].0);
+ let x1 = max(line[i].0, line[i+1].0);
+ for x in x0..=x1 {
+ self[(x, line[i].1)] = true;
+ }
+ }
+ }
+ }
+
+ fn from_lines(lines: &Vec<Vec<(usize, usize)>>) -> Map {
+ let mut map = Map {
+ cells: vec![],
+ xmin: 500,
+ xmax: 500,
+ ymin: 0,
+ ymax: 0
+ };
+ map.set_bounds(lines);
+ for l in lines { map.fill_line(l); }
+ map
+ }
+
+ #[allow(dead_code)]
+ pub fn print(&self) {
+ println!("x: {} to {}", self.xmin, self.xmax);
+ println!("y: {} to {}", self.ymin, self.ymax);
+ for v in &self.cells {
+ for b in v {
+ print!("{}", if *b { '#' } else { '.' });
+ }
+ println!();
+ }
+ }
+}
+
+pub fn read_map_from_stdin() -> Map {
+ let mut lines = Vec::<Vec<(usize, usize)>>::new();
+ let mut s = String::new();
+ while std::io::stdin().read_line(&mut s).unwrap() > 0 {
+ lines.push(line_from_str(&s));
+ s.clear();
+ }
+ Map::from_lines(&lines)
+}
diff --git a/2022/14/input b/2022/14/input
@@ -0,0 +1,148 @@
+494,132 -> 494,134 -> 487,134 -> 487,139 -> 502,139 -> 502,134 -> 499,134 -> 499,132
+509,82 -> 514,82
+511,113 -> 511,116 -> 509,116 -> 509,120 -> 522,120 -> 522,116 -> 516,116 -> 516,113
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+510,65 -> 510,57 -> 510,65 -> 512,65 -> 512,63 -> 512,65 -> 514,65 -> 514,64 -> 514,65
+490,39 -> 490,42 -> 483,42 -> 483,49 -> 503,49 -> 503,42 -> 495,42 -> 495,39
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+526,150 -> 530,150
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+512,127 -> 516,127
+494,132 -> 494,134 -> 487,134 -> 487,139 -> 502,139 -> 502,134 -> 499,134 -> 499,132
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+522,153 -> 522,156 -> 515,156 -> 515,164 -> 533,164 -> 533,156 -> 528,156 -> 528,153
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+517,77 -> 524,77 -> 524,76
+522,153 -> 522,156 -> 515,156 -> 515,164 -> 533,164 -> 533,156 -> 528,156 -> 528,153
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+529,148 -> 533,148
+521,110 -> 525,110
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+511,113 -> 511,116 -> 509,116 -> 509,120 -> 522,120 -> 522,116 -> 516,116 -> 516,113
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+506,123 -> 510,123
+490,39 -> 490,42 -> 483,42 -> 483,49 -> 503,49 -> 503,42 -> 495,42 -> 495,39
+494,132 -> 494,134 -> 487,134 -> 487,139 -> 502,139 -> 502,134 -> 499,134 -> 499,132
+522,153 -> 522,156 -> 515,156 -> 515,164 -> 533,164 -> 533,156 -> 528,156 -> 528,153
+522,153 -> 522,156 -> 515,156 -> 515,164 -> 533,164 -> 533,156 -> 528,156 -> 528,153
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+510,65 -> 510,57 -> 510,65 -> 512,65 -> 512,63 -> 512,65 -> 514,65 -> 514,64 -> 514,65
+517,77 -> 524,77 -> 524,76
+520,84 -> 525,84
+506,127 -> 510,127
+522,153 -> 522,156 -> 515,156 -> 515,164 -> 533,164 -> 533,156 -> 528,156 -> 528,153
+494,132 -> 494,134 -> 487,134 -> 487,139 -> 502,139 -> 502,134 -> 499,134 -> 499,132
+494,132 -> 494,134 -> 487,134 -> 487,139 -> 502,139 -> 502,134 -> 499,134 -> 499,132
+497,23 -> 497,14 -> 497,23 -> 499,23 -> 499,16 -> 499,23 -> 501,23 -> 501,17 -> 501,23
+528,88 -> 533,88
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+497,23 -> 497,14 -> 497,23 -> 499,23 -> 499,16 -> 499,23 -> 501,23 -> 501,17 -> 501,23
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+490,39 -> 490,42 -> 483,42 -> 483,49 -> 503,49 -> 503,42 -> 495,42 -> 495,39
+550,150 -> 554,150
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+514,88 -> 519,88
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+506,84 -> 511,84
+506,52 -> 512,52 -> 512,51
+516,74 -> 520,74
+524,104 -> 528,104
+506,52 -> 512,52 -> 512,51
+511,113 -> 511,116 -> 509,116 -> 509,120 -> 522,120 -> 522,116 -> 516,116 -> 516,113
+527,106 -> 531,106
+497,23 -> 497,14 -> 497,23 -> 499,23 -> 499,16 -> 499,23 -> 501,23 -> 501,17 -> 501,23
+507,67 -> 507,68 -> 518,68 -> 518,67
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+538,146 -> 542,146
+497,23 -> 497,14 -> 497,23 -> 499,23 -> 499,16 -> 499,23 -> 501,23 -> 501,17 -> 501,23
+515,110 -> 519,110
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+530,108 -> 534,108
+497,23 -> 497,14 -> 497,23 -> 499,23 -> 499,16 -> 499,23 -> 501,23 -> 501,17 -> 501,23
+503,129 -> 507,129
+535,144 -> 539,144
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+507,67 -> 507,68 -> 518,68 -> 518,67
+500,88 -> 505,88
+507,67 -> 507,68 -> 518,68 -> 518,67
+500,127 -> 504,127
+511,113 -> 511,116 -> 509,116 -> 509,120 -> 522,120 -> 522,116 -> 516,116 -> 516,113
+517,86 -> 522,86
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+497,23 -> 497,14 -> 497,23 -> 499,23 -> 499,16 -> 499,23 -> 501,23 -> 501,17 -> 501,23
+527,110 -> 531,110
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+513,84 -> 518,84
+510,65 -> 510,57 -> 510,65 -> 512,65 -> 512,63 -> 512,65 -> 514,65 -> 514,64 -> 514,65
+533,110 -> 537,110
+503,125 -> 507,125
+535,148 -> 539,148
+507,88 -> 512,88
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+510,65 -> 510,57 -> 510,65 -> 512,65 -> 512,63 -> 512,65 -> 514,65 -> 514,64 -> 514,65
+524,108 -> 528,108
+490,39 -> 490,42 -> 483,42 -> 483,49 -> 503,49 -> 503,42 -> 495,42 -> 495,39
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+544,150 -> 548,150
+524,86 -> 529,86
+512,80 -> 517,80
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+490,39 -> 490,42 -> 483,42 -> 483,49 -> 503,49 -> 503,42 -> 495,42 -> 495,39
+521,106 -> 525,106
+522,153 -> 522,156 -> 515,156 -> 515,164 -> 533,164 -> 533,156 -> 528,156 -> 528,153
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+503,86 -> 508,86
+497,23 -> 497,14 -> 497,23 -> 499,23 -> 499,16 -> 499,23 -> 501,23 -> 501,17 -> 501,23
+509,125 -> 513,125
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+532,146 -> 536,146
+516,82 -> 521,82
+510,65 -> 510,57 -> 510,65 -> 512,65 -> 512,63 -> 512,65 -> 514,65 -> 514,64 -> 514,65
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+509,129 -> 513,129
+541,148 -> 545,148
+490,39 -> 490,42 -> 483,42 -> 483,49 -> 503,49 -> 503,42 -> 495,42 -> 495,39
+494,132 -> 494,134 -> 487,134 -> 487,139 -> 502,139 -> 502,134 -> 499,134 -> 499,132
+497,23 -> 497,14 -> 497,23 -> 499,23 -> 499,16 -> 499,23 -> 501,23 -> 501,17 -> 501,23
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+511,113 -> 511,116 -> 509,116 -> 509,120 -> 522,120 -> 522,116 -> 516,116 -> 516,113
+490,39 -> 490,42 -> 483,42 -> 483,49 -> 503,49 -> 503,42 -> 495,42 -> 495,39
+541,144 -> 545,144
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+511,113 -> 511,116 -> 509,116 -> 509,120 -> 522,120 -> 522,116 -> 516,116 -> 516,113
+538,150 -> 542,150
+510,65 -> 510,57 -> 510,65 -> 512,65 -> 512,63 -> 512,65 -> 514,65 -> 514,64 -> 514,65
+511,113 -> 511,116 -> 509,116 -> 509,120 -> 522,120 -> 522,116 -> 516,116 -> 516,113
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+515,129 -> 519,129
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+510,65 -> 510,57 -> 510,65 -> 512,65 -> 512,63 -> 512,65 -> 514,65 -> 514,64 -> 514,65
+522,153 -> 522,156 -> 515,156 -> 515,164 -> 533,164 -> 533,156 -> 528,156 -> 528,153
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+510,86 -> 515,86
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+494,132 -> 494,134 -> 487,134 -> 487,139 -> 502,139 -> 502,134 -> 499,134 -> 499,132
+521,88 -> 526,88
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+510,65 -> 510,57 -> 510,65 -> 512,65 -> 512,63 -> 512,65 -> 514,65 -> 514,64 -> 514,65
+497,129 -> 501,129
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+532,150 -> 536,150
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+547,148 -> 551,148
+493,36 -> 493,33 -> 493,36 -> 495,36 -> 495,35 -> 495,36 -> 497,36 -> 497,33 -> 497,36 -> 499,36 -> 499,35 -> 499,36 -> 501,36 -> 501,34 -> 501,36 -> 503,36 -> 503,34 -> 503,36 -> 505,36 -> 505,26 -> 505,36 -> 507,36 -> 507,31 -> 507,36 -> 509,36 -> 509,33 -> 509,36
+518,108 -> 522,108
+544,146 -> 548,146
+527,101 -> 527,99 -> 527,101 -> 529,101 -> 529,98 -> 529,101 -> 531,101 -> 531,92 -> 531,101 -> 533,101 -> 533,91 -> 533,101 -> 535,101 -> 535,99 -> 535,101 -> 537,101 -> 537,100 -> 537,101 -> 539,101 -> 539,93 -> 539,101
+538,142 -> 542,142
diff --git a/2022/14/test b/2022/14/test
@@ -0,0 +1,2 @@
+498,4 -> 498,6 -> 496,6
+503,4 -> 502,4 -> 502,9 -> 494,9