From 35127773880a4cf985779e6b82e04209dcf2792c Mon Sep 17 00:00:00 2001
From: Oscar Najera <hi@oscarnajera.com>
Date: Fri, 9 Dec 2022 13:17:36 +0100
Subject: [AoC2022] Elisp 09-01

---
 AoC2022/09/input     | 2000 ++++++++++++++++++++++++++++++++++++++++++++++++++
 AoC2022/09/solver.el |   78 ++
 2 files changed, 2078 insertions(+)
 create mode 100644 AoC2022/09/input
 create mode 100644 AoC2022/09/solver.el

(limited to 'AoC2022')

diff --git a/AoC2022/09/input b/AoC2022/09/input
new file mode 100644
index 0000000..b429d1b
--- /dev/null
+++ b/AoC2022/09/input
@@ -0,0 +1,2000 @@
+R 1
+U 1
+D 1
+U 1
+R 2
+D 2
+R 2
+D 2
+R 1
+U 1
+L 1
+U 2
+D 2
+R 1
+D 1
+R 2
+U 2
+R 2
+L 2
+D 2
+L 2
+U 2
+D 2
+L 2
+R 2
+D 1
+U 2
+D 2
+U 1
+L 2
+D 2
+R 1
+U 2
+D 2
+L 1
+D 2
+L 2
+R 2
+U 2
+D 2
+U 1
+R 1
+U 1
+D 1
+R 2
+L 2
+D 1
+U 1
+R 1
+L 1
+U 1
+D 1
+L 1
+U 1
+D 1
+U 2
+D 2
+U 1
+D 1
+U 1
+L 1
+R 2
+L 1
+D 1
+U 1
+R 1
+L 2
+U 2
+L 2
+U 2
+D 1
+R 2
+D 2
+L 2
+R 1
+U 2
+R 1
+D 2
+L 1
+D 1
+L 1
+D 2
+R 1
+U 1
+L 1
+U 2
+D 2
+L 1
+U 2
+D 2
+R 1
+U 1
+R 1
+L 2
+D 1
+L 2
+U 2
+L 2
+D 2
+L 2
+D 2
+U 1
+L 1
+U 2
+R 1
+D 1
+R 1
+D 1
+R 1
+D 2
+U 1
+R 1
+U 1
+R 1
+D 1
+U 3
+L 2
+R 2
+L 3
+R 1
+L 1
+U 2
+L 1
+U 3
+D 3
+L 3
+D 2
+L 3
+U 1
+L 1
+R 2
+D 3
+L 1
+R 1
+U 2
+L 2
+D 3
+U 2
+D 3
+R 3
+U 1
+D 3
+L 3
+R 2
+U 3
+D 1
+U 1
+R 1
+L 2
+R 1
+L 2
+D 3
+L 1
+D 3
+R 2
+U 1
+D 1
+R 3
+D 1
+L 1
+U 2
+D 1
+L 3
+U 3
+R 1
+D 1
+U 3
+D 2
+L 3
+R 2
+L 1
+D 2
+U 1
+R 2
+L 1
+U 2
+R 2
+L 2
+U 2
+L 2
+U 2
+R 1
+U 2
+D 3
+U 1
+D 1
+L 2
+U 1
+L 2
+R 3
+L 2
+R 3
+L 1
+R 2
+L 2
+R 1
+D 3
+L 3
+D 2
+R 1
+D 1
+U 1
+D 2
+R 3
+U 3
+D 3
+R 3
+L 1
+U 1
+R 3
+U 2
+L 1
+R 1
+L 3
+D 3
+R 2
+U 1
+L 2
+D 2
+R 1
+U 3
+D 2
+R 1
+L 4
+D 3
+R 3
+L 1
+D 1
+R 3
+U 3
+L 2
+D 4
+U 3
+D 2
+L 4
+D 2
+R 1
+D 3
+R 3
+D 1
+U 4
+R 1
+U 4
+D 2
+U 4
+L 1
+R 1
+L 2
+R 1
+D 1
+L 4
+U 1
+R 4
+D 3
+R 1
+U 3
+R 3
+U 2
+L 3
+U 2
+L 2
+R 4
+U 2
+D 3
+R 4
+D 1
+U 4
+D 3
+R 2
+D 3
+R 1
+D 1
+U 1
+R 3
+L 1
+U 3
+L 1
+D 3
+L 3
+D 3
+R 3
+D 3
+U 1
+R 4
+D 2
+R 2
+U 1
+R 1
+D 1
+L 4
+D 2
+L 1
+U 4
+D 1
+L 2
+U 4
+D 3
+U 3
+L 2
+R 2
+D 1
+L 4
+D 2
+R 3
+D 4
+R 4
+U 1
+D 1
+L 2
+R 1
+D 4
+R 2
+L 1
+D 4
+L 3
+R 3
+U 4
+R 3
+D 3
+L 2
+R 1
+D 3
+L 2
+R 3
+D 1
+L 2
+U 3
+R 4
+D 4
+U 3
+R 2
+D 3
+R 3
+D 1
+R 4
+U 3
+R 5
+U 1
+D 2
+R 5
+U 1
+R 3
+L 1
+U 1
+L 1
+D 1
+R 5
+U 2
+D 3
+R 4
+L 5
+R 2
+D 1
+L 2
+U 2
+D 3
+R 5
+D 2
+R 5
+D 5
+U 5
+D 1
+L 5
+U 3
+D 2
+R 1
+D 5
+R 2
+D 2
+R 5
+U 3
+L 2
+U 1
+L 4
+R 5
+L 3
+R 2
+U 2
+D 3
+L 1
+U 3
+L 4
+R 5
+L 1
+U 4
+L 1
+D 5
+R 3
+U 5
+R 3
+L 2
+U 4
+D 2
+U 4
+L 1
+U 1
+L 1
+R 4
+D 4
+U 4
+R 5
+D 2
+U 2
+L 3
+U 4
+D 3
+L 2
+R 4
+U 1
+L 3
+R 3
+D 1
+L 2
+R 5
+U 2
+L 2
+R 2
+L 4
+D 4
+L 2
+U 4
+R 2
+L 3
+U 4
+L 5
+D 5
+L 5
+U 3
+L 5
+R 2
+D 4
+L 5
+U 3
+D 2
+L 2
+D 2
+U 2
+D 4
+R 5
+U 5
+L 3
+R 5
+D 3
+L 1
+D 1
+L 1
+D 5
+R 2
+L 1
+U 2
+L 3
+U 2
+R 2
+L 5
+R 3
+U 2
+R 1
+L 4
+D 4
+U 3
+R 2
+L 2
+D 3
+L 2
+R 4
+L 1
+U 6
+R 2
+D 5
+L 4
+U 3
+R 6
+D 6
+L 4
+D 3
+R 2
+D 2
+L 2
+R 2
+D 4
+L 6
+D 3
+L 5
+R 4
+L 5
+U 3
+L 6
+U 5
+L 3
+R 2
+U 3
+L 1
+D 1
+L 3
+U 4
+L 5
+D 3
+L 2
+U 5
+D 4
+L 3
+R 1
+U 3
+D 4
+U 3
+D 3
+U 6
+D 4
+R 3
+U 6
+R 1
+U 3
+R 3
+U 3
+R 5
+U 6
+L 1
+R 2
+D 5
+U 3
+D 4
+U 4
+D 4
+L 1
+U 4
+D 3
+L 1
+U 5
+R 3
+U 3
+R 1
+U 1
+L 3
+R 3
+U 4
+R 1
+L 3
+U 2
+L 2
+D 2
+L 4
+U 4
+L 3
+U 4
+R 2
+U 1
+D 2
+U 2
+D 5
+L 5
+R 1
+D 3
+L 4
+R 3
+D 6
+U 7
+D 5
+L 7
+D 5
+U 3
+D 1
+L 2
+R 2
+D 7
+U 7
+D 3
+L 2
+U 1
+L 6
+D 5
+R 4
+U 3
+R 5
+U 6
+L 6
+U 6
+L 1
+R 5
+U 7
+R 5
+U 5
+R 4
+U 5
+D 6
+R 4
+D 7
+L 7
+U 5
+R 2
+U 7
+R 3
+D 5
+R 5
+D 4
+U 1
+L 6
+R 4
+D 6
+L 6
+R 2
+U 7
+L 3
+D 5
+L 4
+R 3
+L 1
+U 3
+D 3
+R 5
+U 1
+L 6
+U 7
+R 7
+D 4
+L 4
+U 6
+R 7
+U 4
+R 1
+L 1
+R 4
+U 7
+D 1
+U 5
+D 3
+R 7
+L 1
+D 4
+U 6
+D 2
+L 3
+U 1
+D 6
+L 1
+D 5
+R 3
+U 3
+L 6
+D 5
+R 4
+U 5
+L 4
+R 4
+U 7
+R 1
+L 7
+U 2
+R 4
+L 1
+D 5
+U 4
+L 6
+D 2
+R 3
+L 2
+D 5
+R 5
+U 7
+R 4
+D 7
+U 6
+R 6
+L 6
+R 6
+U 1
+D 1
+R 3
+D 2
+U 3
+R 3
+D 8
+U 1
+R 5
+L 8
+D 8
+L 7
+D 3
+U 6
+R 6
+U 8
+D 3
+U 2
+R 2
+D 7
+U 8
+D 5
+L 2
+R 8
+U 3
+L 2
+R 5
+U 3
+R 6
+L 8
+U 8
+R 8
+L 2
+U 1
+D 1
+U 4
+L 1
+U 2
+L 4
+D 2
+U 4
+D 3
+L 8
+D 3
+R 3
+L 2
+D 7
+L 5
+R 5
+L 3
+R 4
+L 7
+D 6
+U 3
+L 3
+D 4
+R 4
+L 3
+D 5
+U 2
+R 4
+U 6
+L 7
+D 2
+R 6
+L 3
+D 8
+L 8
+R 2
+U 7
+D 7
+U 3
+R 7
+U 8
+L 5
+D 6
+R 6
+U 8
+R 1
+U 3
+R 5
+L 4
+D 7
+U 6
+R 8
+L 2
+R 6
+U 1
+L 4
+D 1
+L 2
+U 4
+R 2
+U 4
+R 5
+L 3
+R 1
+L 4
+R 7
+D 7
+R 1
+U 5
+L 6
+D 4
+R 4
+D 5
+U 8
+L 3
+D 8
+L 6
+U 5
+D 1
+R 7
+L 2
+D 1
+R 7
+L 5
+D 8
+U 6
+D 1
+L 8
+U 8
+L 1
+R 1
+U 2
+D 9
+L 5
+D 9
+L 4
+U 8
+D 3
+R 6
+L 1
+R 8
+D 7
+L 6
+U 7
+R 6
+U 2
+L 3
+D 6
+L 5
+U 3
+R 1
+U 6
+D 1
+U 2
+L 9
+R 2
+L 2
+R 9
+D 1
+R 2
+U 7
+D 7
+U 5
+R 4
+U 9
+L 5
+U 9
+D 5
+L 1
+R 3
+L 1
+U 1
+D 7
+L 8
+D 2
+L 7
+D 1
+L 6
+R 2
+D 1
+U 9
+D 4
+U 8
+L 8
+U 1
+L 8
+D 6
+U 1
+R 2
+U 3
+R 4
+D 4
+U 4
+L 9
+D 5
+L 2
+U 6
+D 8
+U 6
+R 1
+L 6
+D 5
+R 3
+L 4
+R 6
+L 5
+R 4
+L 6
+D 5
+R 8
+D 6
+L 1
+U 8
+R 8
+U 8
+R 3
+U 2
+D 9
+L 9
+U 3
+D 5
+L 2
+D 2
+R 3
+L 2
+D 8
+R 6
+D 9
+R 5
+L 9
+R 2
+L 9
+U 5
+R 9
+D 3
+R 1
+U 1
+L 6
+R 7
+D 7
+U 3
+R 2
+L 5
+D 2
+L 8
+U 8
+R 9
+U 5
+R 1
+U 9
+D 8
+R 10
+U 9
+D 5
+R 4
+D 8
+U 4
+L 7
+U 10
+L 8
+R 10
+L 9
+D 9
+L 4
+R 7
+U 4
+D 3
+U 10
+R 6
+D 9
+L 5
+R 3
+D 7
+R 9
+D 4
+L 9
+D 3
+R 7
+U 6
+L 6
+R 6
+L 7
+D 8
+L 7
+U 5
+D 8
+L 8
+U 9
+L 5
+D 9
+U 9
+R 3
+D 1
+U 9
+L 9
+U 6
+R 4
+U 6
+D 10
+U 4
+R 9
+D 9
+R 2
+D 10
+L 9
+U 8
+L 2
+D 7
+L 10
+R 2
+L 9
+R 9
+L 10
+U 6
+D 7
+R 1
+D 9
+R 5
+L 7
+D 4
+U 7
+L 3
+D 3
+R 4
+L 8
+U 1
+L 1
+D 10
+U 2
+D 9
+L 2
+D 8
+U 2
+D 3
+R 6
+U 3
+R 5
+U 4
+L 6
+R 10
+L 1
+D 2
+L 3
+U 11
+R 5
+U 11
+D 11
+U 10
+D 2
+L 10
+U 8
+R 4
+D 11
+U 11
+R 11
+U 5
+D 3
+R 7
+D 9
+U 9
+R 5
+U 8
+D 7
+U 9
+D 2
+U 11
+L 7
+D 1
+R 9
+D 2
+R 5
+U 4
+R 11
+D 1
+L 2
+R 1
+U 5
+D 4
+L 10
+R 11
+U 6
+L 3
+U 11
+R 1
+D 1
+L 2
+U 5
+R 6
+U 9
+R 11
+D 9
+L 11
+U 6
+R 5
+L 7
+D 6
+U 9
+D 5
+U 6
+R 10
+D 11
+R 4
+U 7
+L 5
+U 7
+L 2
+R 6
+L 10
+D 3
+R 6
+L 9
+D 8
+L 1
+R 1
+L 1
+R 3
+D 8
+L 10
+D 2
+U 1
+D 1
+L 3
+R 10
+L 3
+U 1
+D 2
+U 2
+D 3
+U 1
+R 8
+U 8
+D 10
+U 6
+L 5
+U 6
+D 4
+R 9
+D 9
+R 9
+D 11
+L 3
+D 7
+R 9
+L 7
+U 7
+D 7
+R 4
+L 3
+R 5
+U 3
+L 9
+D 10
+L 1
+R 9
+L 6
+D 5
+L 6
+D 4
+U 7
+L 8
+R 7
+L 5
+U 9
+R 1
+L 1
+D 12
+R 5
+U 1
+L 8
+D 11
+U 5
+D 5
+R 4
+D 10
+R 2
+U 6
+D 2
+L 12
+D 1
+R 10
+U 4
+D 8
+L 7
+D 9
+R 7
+D 1
+R 10
+D 5
+U 7
+D 12
+R 9
+U 2
+D 3
+U 5
+D 2
+U 6
+D 3
+U 7
+D 4
+R 11
+D 2
+L 3
+R 9
+L 2
+R 12
+L 3
+D 5
+U 7
+D 6
+R 9
+D 12
+R 11
+D 5
+U 5
+D 2
+R 1
+U 6
+R 6
+D 5
+L 9
+U 10
+D 4
+U 1
+R 3
+D 10
+U 1
+R 9
+D 8
+L 1
+D 12
+U 11
+D 12
+L 2
+R 9
+U 12
+D 6
+L 1
+R 4
+L 8
+D 8
+L 6
+R 10
+L 8
+D 4
+U 11
+L 1
+R 5
+L 6
+R 10
+D 12
+R 3
+L 9
+D 10
+U 6
+D 9
+R 7
+U 9
+R 10
+U 10
+L 10
+U 1
+L 3
+D 7
+L 12
+U 4
+R 3
+U 1
+L 8
+R 5
+U 4
+L 4
+D 5
+R 4
+D 11
+L 9
+D 5
+L 7
+U 6
+R 8
+U 7
+D 3
+U 1
+L 6
+U 8
+D 2
+R 7
+D 2
+U 1
+L 9
+U 8
+L 10
+U 4
+D 12
+L 12
+D 5
+R 3
+U 1
+D 1
+R 11
+L 10
+R 11
+L 6
+R 3
+L 13
+R 6
+L 4
+R 10
+D 9
+R 13
+U 8
+L 7
+R 7
+L 10
+R 9
+U 4
+L 1
+D 1
+L 12
+D 6
+L 3
+R 4
+U 6
+L 12
+D 2
+U 5
+R 11
+L 2
+U 8
+R 10
+D 2
+U 6
+L 4
+D 2
+U 9
+L 7
+D 5
+L 6
+U 9
+R 6
+L 9
+R 1
+U 3
+L 6
+R 6
+U 8
+D 1
+R 5
+U 12
+D 9
+U 10
+D 13
+L 10
+R 4
+L 13
+R 9
+L 9
+D 6
+U 8
+D 6
+U 8
+D 10
+R 3
+L 11
+R 8
+D 4
+R 2
+U 10
+D 9
+U 8
+R 5
+D 10
+L 11
+R 7
+D 9
+U 7
+L 6
+U 3
+L 5
+U 6
+D 1
+U 3
+R 8
+L 5
+U 3
+R 13
+L 8
+D 1
+U 8
+L 6
+D 11
+U 4
+D 1
+R 9
+D 11
+R 1
+D 2
+R 10
+U 2
+D 12
+U 6
+R 13
+U 6
+D 4
+R 11
+U 6
+R 9
+U 10
+D 3
+R 2
+L 13
+U 14
+D 14
+R 6
+D 9
+U 5
+D 2
+L 5
+R 10
+L 3
+R 8
+D 9
+U 10
+R 11
+U 8
+L 8
+R 12
+D 13
+U 7
+R 14
+D 9
+L 12
+R 13
+L 10
+D 11
+L 7
+U 6
+D 14
+L 14
+D 13
+U 11
+R 11
+U 9
+L 8
+D 2
+L 9
+R 12
+U 5
+D 9
+U 10
+R 1
+L 2
+D 8
+L 8
+R 4
+U 2
+L 13
+R 9
+L 12
+D 7
+L 14
+D 13
+R 12
+D 10
+L 5
+U 12
+R 6
+L 3
+U 14
+R 8
+U 10
+R 5
+U 3
+D 1
+R 6
+U 9
+R 4
+L 9
+U 7
+R 6
+U 8
+R 10
+U 9
+R 9
+U 12
+L 14
+R 2
+U 11
+L 12
+D 5
+R 15
+L 10
+U 8
+R 6
+U 8
+R 6
+D 2
+U 9
+L 15
+D 13
+L 14
+U 1
+D 9
+U 6
+R 8
+L 6
+D 3
+L 13
+R 7
+U 1
+L 8
+U 7
+D 8
+R 1
+D 6
+L 8
+R 14
+D 14
+U 9
+L 14
+R 15
+U 11
+L 14
+D 14
+L 1
+U 5
+L 3
+R 4
+L 13
+R 5
+D 14
+R 4
+U 7
+D 9
+R 4
+U 6
+D 11
+R 12
+D 13
+U 15
+D 10
+R 1
+D 1
+U 10
+L 14
+R 13
+U 6
+D 10
+U 15
+D 3
+U 8
+D 2
+U 15
+R 6
+U 12
+L 9
+R 2
+D 6
+R 15
+D 13
+R 2
+D 5
+R 8
+U 3
+R 10
+D 6
+L 7
+D 6
+R 11
+U 13
+D 1
+L 7
+U 7
+L 4
+U 10
+D 4
+R 10
+U 2
+L 2
+U 4
+R 7
+D 15
+R 15
+D 7
+R 14
+U 3
+D 8
+L 2
+U 11
+D 11
+U 9
+R 5
+L 3
+D 9
+R 12
+L 2
+R 10
+D 6
+R 6
+U 15
+R 10
+D 16
+R 5
+U 14
+R 16
+U 5
+L 10
+R 14
+L 15
+R 13
+L 15
+R 12
+L 9
+D 16
+U 13
+D 16
+R 2
+U 1
+D 15
+L 7
+D 5
+R 9
+U 8
+R 12
+U 3
+D 16
+R 11
+D 1
+U 3
+D 4
+U 10
+L 8
+R 4
+L 8
+R 8
+U 8
+L 9
+D 16
+U 7
+D 6
+R 1
+D 3
+L 15
+U 9
+D 9
+U 1
+L 9
+D 7
+U 14
+R 1
+D 11
+L 16
+U 13
+L 3
+R 12
+L 9
+R 9
+L 9
+U 5
+R 10
+D 14
+L 8
+R 7
+L 12
+R 13
+D 5
+U 10
+R 12
+U 11
+L 7
+R 9
+D 7
+L 11
+D 1
+R 8
+D 7
+U 6
+D 10
+R 13
+L 16
+U 10
+L 5
+R 12
+L 16
+U 6
+D 10
+U 3
+D 7
+U 7
+D 15
+L 2
+R 9
+U 8
+D 11
+L 15
+U 10
+D 10
+L 6
+D 14
+L 5
+U 3
+D 9
+U 2
+D 16
+U 6
+D 3
+R 15
+D 12
+R 9
+L 16
+R 4
+U 9
+L 8
+R 11
+L 14
+D 6
+U 11
+L 6
+R 7
+U 8
+R 7
+U 8
+D 7
+U 6
+L 15
+U 3
+D 6
+U 3
+R 6
+D 3
+L 10
+R 14
+L 17
+D 12
+L 15
+D 5
+R 6
+D 4
+R 6
+D 5
+U 8
+D 10
+R 13
+D 6
+U 3
+L 5
+U 3
+R 11
+D 11
+U 8
+L 5
+U 11
+L 7
+R 16
+L 11
+D 3
+L 16
+D 14
+R 1
+U 10
+L 7
+U 4
+D 11
+L 9
+R 3
+D 1
+L 7
+R 17
+D 17
+R 11
+U 4
+R 15
+L 10
+R 13
+U 17
+D 16
+L 16
+U 14
+D 11
+U 10
+D 12
+L 11
+R 5
+D 17
+U 1
+R 5
+L 14
+D 14
+R 5
+L 6
+R 11
+U 13
+R 10
+U 15
+L 2
+R 8
+D 3
+R 11
+L 8
+R 11
+U 5
+L 12
+U 2
+L 16
+D 5
+L 17
+R 10
+D 15
+L 16
+U 1
+D 10
+R 13
+L 6
+D 5
+R 13
+U 2
+D 16
+L 9
+U 11
+D 13
+U 16
+L 6
+R 15
+D 10
+U 17
+L 15
+D 7
+R 6
+D 15
+R 11
+L 14
+U 12
+D 18
+R 6
+U 16
+L 1
+U 10
+R 15
+U 3
+L 12
+D 9
+L 11
+D 18
+R 11
+L 12
+U 5
+L 13
+D 2
+R 11
+D 10
+L 15
+R 5
+D 17
+R 6
+L 16
+R 11
+D 1
+R 5
+U 13
+R 11
+D 13
+L 12
+U 10
+D 9
+R 1
+D 15
+R 1
+D 17
+R 10
+U 11
+R 14
+L 17
+R 2
+L 1
+D 12
+R 6
+U 18
+R 3
+L 8
+R 11
+L 15
+U 8
+L 7
+D 2
+L 9
+D 9
+L 11
+U 5
+D 8
+U 16
+R 13
+L 7
+D 6
+U 16
+L 9
+U 3
+R 4
+L 12
+U 18
+D 7
+L 10
+R 16
+D 1
+R 4
+U 4
+R 13
+D 6
+L 5
+R 3
+D 10
+U 4
+L 17
+D 9
+R 8
+L 1
+D 8
+L 16
+D 3
+U 3
+R 1
+U 9
+R 13
+D 3
+L 4
+R 6
+D 10
+U 16
+L 9
+U 5
+L 14
+U 8
+D 17
+L 18
+D 5
+U 10
+R 14
+L 8
+U 6
+R 5
+U 19
+L 9
+U 2
+D 7
+U 14
+R 17
+L 16
+D 15
+U 11
+D 4
+L 16
+U 14
+D 6
+L 3
+R 18
+L 17
+D 6
+L 10
+U 7
+D 11
+L 15
+U 12
+L 6
+D 6
+L 14
+U 17
+L 7
+D 2
+L 7
+U 12
+L 17
+R 16
+U 19
+L 12
+U 10
+L 6
+U 3
+D 16
+L 5
+D 15
+L 7
+R 6
+D 2
+R 19
+L 4
+D 18
+R 19
+D 9
+R 11
+L 17
+R 1
+U 15
+R 3
+D 18
+L 13
+U 7
+D 7
+R 15
+U 4
+D 16
+R 6
+U 4
+R 10
+U 10
+R 1
+D 19
+R 13
+U 7
+L 13
+D 15
+U 2
+L 18
+D 5
+U 5
+D 10
+L 8
+D 13
+U 8
+L 15
+D 12
+U 11
+D 17
+L 14
+R 4
+D 19
+L 6
+D 5
+L 13
+D 16
+U 1
+R 14
+U 15
+L 18
+D 7
+L 14
+D 11
+L 7
+D 18
+U 16
+L 1
+R 18
+L 1
+U 19
+R 3
+D 1
diff --git a/AoC2022/09/solver.el b/AoC2022/09/solver.el
new file mode 100644
index 0000000..d1eac37
--- /dev/null
+++ b/AoC2022/09/solver.el
@@ -0,0 +1,78 @@
+;;; solver.el --- Day 09 -*- lexical-binding: t; -*-
+;;
+;; Copyright (C) 2022 Óscar Nájera
+;;
+;; Author: Óscar Nájera <hi@oscarnajera.com>
+;; Maintainer: Óscar Nájera <hi@oscarnajera.com>
+;; Created: December 09, 2022
+;; Modified: December 09, 2022
+;;
+;; This file is not part of GNU Emacs.
+;;
+;;; Commentary:
+;;
+;;  Day 09
+;;
+;;; Code:
+
+(defsubst solver-diff (head tail)
+  (cons (- (car head) (car tail)) (- (cdr head) (cdr tail))))
+
+(defsubst solver-distance-1 (vec)
+  "Norm 1 distance."
+  (+ (abs (car vec)) (abs (cdr vec))))
+
+(defsubst solver-diagonal (vec)
+  (and (= 1 (abs (car vec))) (= 1 (abs (cdr vec)))))
+
+
+(defun solver-move (direction)
+  (cl-ecase direction
+    ('R (lambda (x) (cl-incf (car x))))
+    ('L (lambda (x) (cl-decf (car x))))
+    ('U (lambda (x) (cl-incf (cdr x))))
+    ('D (lambda (x) (cl-decf (cdr x))))))
+;; WARN This need to be bytecompiled otherwise the lambda is not capturing diff-v in the closure
+(defun solver-puller (diff-v)
+  (let ((distance (solver-distance-1 diff-v)))
+    (cond
+     ((or (<= distance 1)
+          (solver-diagonal diff-v)) #'identity)
+     ((= distance 2)
+      (pcase diff-v
+        (`(0 . ,d) (solver-move (if (= d 2) 'U 'D)))
+        (`(,d . 0) (solver-move (if (= d 2) 'R 'L)))))
+     ((= distance 3)
+      (lambda (x)
+        (funcall (solver-move (if (< 0 (car diff-v)) 'R 'L)) x)
+        (funcall (solver-move (if (< 0 (cdr diff-v)) 'U 'D)) x)))
+     (t (error "Head moved too far")))))
+
+(with-temp-buffer
+  (insert-file-contents "input")
+;;   (insert "R 4
+;; U 4
+;; L 3
+;; D 1
+;; R 4
+;; D 1
+;; L 5
+;; R 2")
+  (let (path
+        (head (cons 0 0))
+        (tail (cons 0 0))
+        (moves
+         (thread-last
+           (split-string (buffer-string) "\n" t)
+           (mapcar (lambda (inst) (let ((move (split-string inst)))
+                                    (cons (intern (car move))
+                                          (string-to-number (cadr move))))))
+           )))
+    (dolist (move moves)
+      (dotimes (_ (cdr move))
+        (funcall (solver-move (car move)) head)
+        (funcall (solver-puller (solver-diff head tail)) tail)
+        (push (cons (car tail) (cdr tail)) path)))
+    (= 6384 (length (cl-remove-duplicates path :test #'equal))))
+
+
-- 
cgit v1.2.3