From a3f17cd2b72ccd81d44593534efdc67b1b4056fb Mon Sep 17 00:00:00 2001 From: Malte Tammena Date: Fri, 9 Dec 2022 07:16:58 +0100 Subject: [PATCH] Solve day09 --- day09/input | 2000 ++++++++++++++++++++++++++++++++++++++++ day09/input.test | 8 + day09/src/main.rs | 63 +- day09/src/positions.rs | 115 +++ 4 files changed, 2184 insertions(+), 2 deletions(-) create mode 100644 day09/input create mode 100644 day09/input.test create mode 100644 day09/src/positions.rs diff --git a/day09/input b/day09/input new file mode 100644 index 0000000..6ce54a5 --- /dev/null +++ b/day09/input @@ -0,0 +1,2000 @@ +L 1 +R 1 +L 1 +U 1 +R 2 +U 1 +D 2 +R 2 +U 1 +D 2 +U 2 +L 2 +D 1 +U 1 +D 2 +L 2 +D 1 +L 2 +D 2 +L 1 +U 2 +R 2 +L 1 +D 2 +L 2 +R 2 +D 2 +L 1 +U 1 +R 1 +U 1 +L 1 +D 1 +R 1 +U 2 +D 2 +R 1 +U 1 +R 1 +L 1 +U 1 +R 1 +D 1 +L 1 +U 1 +R 1 +D 1 +U 1 +D 1 +U 1 +R 2 +L 2 +D 2 +L 2 +R 1 +U 2 +L 2 +R 1 +U 1 +R 2 +D 2 +R 2 +L 2 +U 2 +R 2 +D 2 +R 1 +U 1 +L 2 +R 1 +U 1 +D 2 +U 2 +D 1 +R 2 +L 2 +D 2 +L 2 +R 2 +U 1 +R 2 +L 2 +D 2 +L 1 +D 1 +R 2 +L 1 +U 2 +R 1 +U 2 +D 1 +U 2 +D 1 +L 1 +R 2 +D 2 +R 2 +U 2 +R 1 +U 2 +R 2 +U 1 +R 1 +D 2 +U 2 +R 2 +U 1 +R 2 +D 2 +R 1 +L 1 +U 3 +L 2 +U 1 +L 2 +U 1 +D 1 +U 2 +D 1 +U 2 +R 2 +L 1 +U 3 +R 1 +U 1 +R 3 +L 3 +D 3 +L 2 +U 1 +D 3 +U 1 +R 1 +L 1 +R 2 +L 1 +R 3 +L 3 +D 1 +R 2 +L 3 +U 3 +D 1 +L 2 +U 2 +D 2 +L 2 +U 1 +R 1 +L 2 +R 3 +L 3 +D 3 +R 2 +D 3 +U 1 +L 3 +R 1 +U 2 +L 1 +D 3 +L 1 +U 1 +D 3 +L 3 +U 2 +D 1 +U 2 +L 3 +R 1 +U 2 +D 2 +R 3 +D 3 +U 2 +D 3 +L 3 +R 3 +L 1 +U 3 +L 1 +D 1 +L 2 +D 2 +R 1 +L 3 +R 2 +L 3 +R 3 +L 1 +D 1 +U 3 +L 2 +R 2 +L 2 +D 3 +U 3 +L 3 +U 3 +D 1 +U 2 +R 2 +U 1 +D 3 +L 3 +R 1 +L 3 +U 3 +D 1 +L 3 +D 2 +R 1 +U 1 +R 1 +D 2 +L 2 +U 1 +L 2 +R 2 +L 2 +D 3 +U 3 +D 4 +L 3 +D 4 +R 3 +L 2 +U 3 +R 3 +U 1 +R 4 +U 2 +D 1 +R 3 +L 1 +R 1 +D 3 +R 2 +D 1 +R 2 +L 2 +U 2 +D 1 +R 1 +U 2 +R 3 +L 2 +D 1 +U 3 +R 2 +D 4 +L 3 +U 1 +R 1 +D 2 +U 1 +R 3 +L 4 +D 2 +L 1 +U 3 +L 2 +U 3 +R 1 +D 1 +L 2 +R 4 +D 4 +U 1 +R 3 +U 3 +R 1 +U 3 +L 2 +U 3 +L 2 +D 4 +U 1 +R 1 +L 2 +R 2 +D 2 +L 2 +D 2 +U 4 +D 4 +L 2 +U 2 +D 3 +L 4 +U 4 +D 4 +R 1 +D 4 +R 1 +D 1 +L 1 +R 1 +L 1 +D 2 +L 4 +D 2 +R 3 +L 1 +D 2 +U 3 +L 2 +U 3 +R 4 +D 4 +U 1 +L 1 +U 4 +L 4 +U 3 +D 2 +R 3 +L 1 +D 3 +U 3 +R 1 +L 3 +U 1 +D 1 +R 1 +U 3 +R 2 +L 1 +D 1 +L 3 +U 1 +D 1 +L 2 +R 3 +U 4 +L 5 +D 5 +R 5 +D 3 +U 3 +D 1 +L 5 +R 2 +U 1 +L 2 +D 1 +L 1 +D 4 +R 1 +U 1 +L 1 +U 1 +D 3 +L 4 +D 1 +U 5 +L 1 +R 5 +L 2 +R 4 +D 5 +U 2 +D 3 +U 4 +L 1 +R 2 +U 4 +L 4 +D 3 +R 1 +U 1 +R 3 +D 3 +U 5 +L 3 +D 3 +U 5 +R 4 +L 1 +D 4 +U 1 +L 1 +R 4 +D 5 +L 5 +D 3 +R 5 +U 3 +R 2 +D 2 +U 2 +D 5 +R 5 +D 5 +R 2 +D 5 +U 2 +D 2 +R 1 +L 5 +D 2 +U 2 +R 5 +U 1 +D 5 +U 5 +L 2 +D 5 +L 1 +R 4 +U 4 +D 1 +L 5 +U 4 +L 1 +R 3 +L 3 +R 3 +L 3 +D 3 +R 4 +U 5 +L 2 +D 3 +U 2 +L 1 +R 5 +U 1 +L 3 +U 4 +L 4 +D 4 +R 1 +D 4 +R 5 +D 5 +U 5 +R 5 +L 3 +D 3 +U 2 +R 5 +U 5 +R 2 +D 5 +R 1 +U 2 +D 5 +L 3 +R 5 +U 5 +R 4 +D 6 +L 4 +U 4 +L 6 +R 2 +L 4 +U 5 +L 1 +U 6 +D 4 +R 3 +U 2 +R 1 +D 5 +L 4 +U 2 +R 6 +U 1 +L 2 +D 6 +U 1 +R 2 +L 3 +R 2 +L 5 +U 1 +R 3 +D 3 +L 4 +R 5 +U 1 +D 3 +R 6 +D 5 +R 4 +D 3 +U 2 +D 4 +R 5 +U 4 +R 2 +L 2 +U 5 +D 5 +U 6 +D 4 +U 5 +L 5 +R 1 +D 3 +R 3 +L 3 +D 3 +L 3 +U 6 +R 5 +D 6 +U 5 +L 1 +R 4 +L 1 +U 4 +L 5 +D 5 +U 4 +D 3 +R 3 +L 4 +R 4 +U 6 +L 5 +D 2 +U 3 +R 4 +U 5 +L 5 +D 6 +R 5 +D 5 +L 3 +U 6 +L 3 +U 5 +D 2 +U 4 +R 4 +U 3 +D 1 +R 2 +L 6 +R 2 +L 3 +U 5 +L 1 +R 4 +D 2 +U 5 +D 2 +R 4 +U 6 +R 6 +L 6 +U 6 +L 4 +R 5 +D 3 +U 1 +D 6 +L 1 +D 3 +L 4 +D 6 +U 3 +D 2 +L 2 +U 5 +D 2 +U 5 +D 6 +R 4 +D 1 +U 1 +D 5 +U 1 +L 7 +U 3 +R 3 +U 5 +D 2 +R 7 +D 6 +L 7 +R 6 +L 3 +R 3 +U 1 +L 4 +D 4 +L 6 +R 1 +U 4 +L 3 +R 3 +D 3 +L 2 +D 7 +U 7 +D 7 +R 2 +L 6 +D 2 +R 6 +D 6 +U 5 +L 4 +U 3 +D 6 +U 3 +D 1 +L 7 +U 7 +L 4 +R 3 +D 6 +U 2 +L 6 +D 3 +U 7 +D 2 +R 7 +D 4 +L 4 +R 4 +U 2 +D 3 +U 2 +L 4 +R 4 +L 4 +D 6 +R 4 +U 1 +R 7 +D 7 +U 7 +R 6 +D 4 +U 2 +D 4 +L 5 +U 4 +D 6 +R 4 +U 2 +R 1 +U 4 +D 5 +R 1 +D 7 +R 4 +U 1 +D 4 +U 6 +L 6 +R 1 +D 1 +R 1 +D 6 +R 6 +D 3 +U 1 +D 5 +R 4 +L 1 +D 6 +R 6 +L 8 +U 1 +D 7 +R 4 +L 2 +R 6 +U 7 +L 2 +D 5 +R 6 +D 3 +L 4 +R 5 +U 7 +L 3 +U 8 +L 1 +U 6 +L 8 +R 7 +D 2 +U 3 +R 4 +L 8 +D 4 +L 1 +U 1 +D 7 +U 8 +R 7 +D 2 +L 5 +U 6 +D 7 +R 4 +L 1 +R 3 +U 1 +R 2 +U 1 +D 7 +R 6 +U 7 +D 6 +L 2 +D 8 +U 4 +R 8 +L 5 +D 6 +L 7 +U 7 +R 8 +L 5 +D 5 +R 4 +L 5 +U 8 +D 4 +U 6 +D 2 +U 5 +R 7 +L 8 +U 7 +R 3 +L 8 +R 6 +D 4 +R 2 +D 6 +R 5 +D 2 +U 6 +L 4 +U 8 +R 3 +U 1 +L 6 +R 1 +L 3 +R 1 +U 3 +L 8 +D 5 +U 6 +L 8 +D 6 +R 2 +U 6 +R 4 +L 8 +D 1 +R 6 +D 8 +U 6 +D 6 +L 3 +U 4 +D 2 +L 2 +D 7 +L 5 +U 3 +R 8 +D 6 +R 5 +L 8 +U 5 +L 9 +R 7 +D 5 +R 2 +U 5 +L 3 +D 9 +R 4 +U 1 +L 3 +R 5 +L 7 +R 8 +D 1 +U 4 +L 4 +R 3 +U 8 +L 8 +D 8 +U 9 +R 6 +U 3 +R 2 +U 8 +D 9 +R 3 +L 2 +U 9 +R 9 +L 8 +D 2 +R 1 +L 8 +U 7 +R 3 +L 1 +R 9 +L 4 +R 2 +U 3 +D 8 +R 5 +U 9 +L 9 +R 1 +D 5 +R 5 +U 4 +L 9 +R 6 +D 5 +L 2 +R 6 +U 1 +D 5 +L 3 +R 1 +U 5 +R 4 +D 4 +U 8 +D 2 +U 6 +R 6 +U 5 +R 3 +U 5 +R 5 +L 8 +D 9 +L 7 +R 1 +U 7 +R 5 +U 6 +R 8 +U 2 +R 2 +U 8 +R 7 +D 3 +R 6 +L 8 +R 4 +L 8 +R 8 +U 8 +R 3 +L 3 +U 1 +L 9 +D 9 +R 9 +U 4 +R 1 +L 3 +D 4 +U 5 +R 7 +D 6 +L 9 +U 7 +L 4 +R 8 +U 8 +D 4 +L 5 +D 9 +U 2 +D 9 +R 4 +D 8 +R 8 +D 8 +U 9 +L 6 +R 6 +L 2 +U 9 +L 4 +U 10 +L 1 +R 10 +D 3 +U 6 +R 5 +D 3 +R 4 +L 4 +U 7 +D 9 +R 2 +D 10 +U 9 +L 7 +D 4 +R 2 +L 10 +D 5 +R 5 +U 9 +R 4 +L 7 +R 5 +D 3 +R 6 +D 8 +R 6 +D 10 +R 7 +U 4 +D 5 +U 6 +L 3 +D 3 +U 10 +R 10 +U 10 +D 9 +R 6 +D 2 +R 9 +D 8 +R 7 +U 10 +R 4 +U 6 +R 7 +U 2 +R 5 +U 6 +L 4 +U 8 +L 6 +D 8 +R 2 +U 2 +L 4 +U 4 +R 5 +U 10 +D 8 +U 7 +R 5 +D 3 +L 2 +R 9 +U 10 +L 1 +U 5 +L 1 +D 3 +L 9 +R 9 +U 2 +D 3 +U 8 +R 10 +L 2 +U 9 +D 4 +U 4 +D 10 +L 4 +D 3 +R 3 +L 2 +U 8 +L 4 +D 6 +R 2 +L 3 +D 6 +L 4 +D 5 +L 7 +U 9 +L 3 +D 4 +R 6 +L 10 +U 5 +L 3 +R 3 +D 6 +U 1 +L 3 +R 5 +D 8 +R 11 +U 2 +L 11 +R 7 +U 8 +R 4 +D 4 +U 6 +D 4 +U 9 +D 5 +R 9 +D 9 +U 6 +D 1 +U 3 +L 4 +U 3 +D 11 +U 11 +R 4 +L 3 +U 5 +D 1 +R 4 +U 6 +D 4 +U 3 +D 8 +L 7 +R 8 +L 9 +R 3 +D 4 +U 6 +L 2 +U 6 +R 3 +D 8 +R 1 +L 5 +U 8 +D 3 +R 8 +L 8 +U 3 +R 2 +U 11 +L 9 +U 4 +D 10 +L 7 +D 1 +U 2 +D 7 +R 4 +L 2 +U 8 +L 5 +U 5 +D 1 +L 11 +R 4 +L 7 +U 2 +D 9 +L 4 +U 11 +R 8 +L 1 +D 10 +U 5 +R 4 +L 8 +U 8 +D 11 +U 8 +D 3 +R 4 +U 8 +R 2 +U 3 +R 9 +D 4 +L 2 +D 4 +L 4 +U 4 +R 5 +U 4 +L 10 +U 4 +L 4 +R 8 +D 5 +L 2 +U 5 +D 9 +U 10 +D 6 +R 9 +D 4 +R 10 +U 4 +D 12 +R 7 +L 12 +R 8 +L 11 +U 1 +D 4 +L 1 +D 7 +R 1 +L 5 +R 9 +L 3 +D 7 +L 2 +R 6 +U 2 +D 2 +U 9 +L 4 +U 11 +D 4 +R 7 +D 7 +L 11 +U 11 +L 1 +D 9 +U 6 +R 3 +D 3 +L 9 +R 7 +L 6 +D 6 +R 11 +D 10 +U 11 +R 1 +U 2 +R 9 +L 6 +U 7 +D 5 +U 7 +R 4 +U 12 +R 2 +D 1 +L 7 +R 5 +D 6 +R 1 +D 11 +R 9 +L 6 +U 11 +D 7 +L 7 +R 9 +L 7 +D 12 +U 7 +D 12 +R 3 +L 2 +R 10 +D 1 +L 9 +R 3 +D 6 +R 11 +U 2 +L 2 +U 3 +R 3 +L 6 +U 3 +R 1 +L 5 +R 7 +U 2 +D 8 +L 9 +U 7 +L 9 +D 12 +U 3 +D 9 +U 1 +L 10 +D 9 +L 11 +U 6 +R 9 +U 10 +L 5 +R 11 +U 3 +R 9 +D 12 +U 1 +D 11 +R 12 +U 1 +D 7 +L 1 +U 7 +L 5 +U 8 +L 2 +R 6 +U 13 +R 3 +D 8 +U 2 +L 5 +U 7 +L 7 +U 13 +L 3 +R 5 +D 1 +L 9 +U 2 +L 7 +R 9 +U 12 +R 9 +L 13 +R 1 +U 11 +R 4 +U 6 +D 6 +R 13 +D 13 +U 5 +L 9 +U 2 +D 9 +R 12 +D 13 +U 9 +D 10 +U 11 +R 11 +U 12 +D 5 +L 1 +R 2 +U 2 +D 5 +U 1 +D 8 +R 8 +L 1 +U 9 +L 11 +D 10 +R 1 +D 6 +U 5 +D 11 +L 13 +D 2 +R 1 +L 1 +R 7 +L 1 +U 2 +D 6 +U 4 +L 7 +U 8 +D 7 +L 11 +U 5 +D 5 +R 1 +D 6 +R 1 +U 9 +L 11 +D 6 +U 10 +D 10 +R 2 +U 13 +L 5 +U 9 +L 13 +U 7 +L 3 +D 9 +L 13 +R 5 +L 5 +U 5 +L 13 +U 10 +L 1 +R 10 +L 8 +R 13 +U 13 +R 7 +D 6 +R 4 +L 5 +U 3 +D 6 +R 13 +U 9 +L 10 +U 13 +R 3 +D 8 +L 8 +U 5 +L 9 +U 4 +D 11 +L 14 +U 11 +R 1 +D 7 +U 4 +R 11 +U 3 +R 2 +U 11 +L 6 +R 2 +D 5 +L 1 +U 1 +L 11 +R 5 +U 10 +D 12 +R 3 +L 6 +R 3 +D 9 +L 4 +D 11 +L 11 +D 4 +R 10 +D 3 +L 12 +D 8 +U 7 +R 2 +D 1 +L 5 +U 11 +L 9 +R 4 +U 4 +D 11 +R 9 +D 3 +U 6 +L 4 +U 4 +L 8 +U 6 +L 14 +R 13 +D 5 +R 5 +U 5 +R 2 +U 8 +L 12 +R 2 +U 12 +D 4 +R 3 +L 5 +D 11 +R 7 +U 9 +D 10 +L 1 +D 4 +U 4 +D 1 +R 9 +L 10 +R 11 +L 8 +D 10 +R 10 +L 3 +R 1 +L 9 +D 4 +L 8 +R 7 +U 12 +R 5 +L 10 +R 7 +U 6 +R 7 +U 8 +D 1 +U 1 +L 1 +R 2 +D 14 +U 4 +D 5 +R 2 +D 1 +R 5 +D 6 +R 3 +L 12 +U 11 +D 1 +L 7 +R 10 +U 2 +R 6 +U 11 +R 12 +U 2 +R 4 +L 1 +D 7 +U 2 +D 9 +U 12 +D 11 +U 2 +L 4 +R 10 +U 13 +R 2 +L 8 +R 13 +L 11 +R 13 +L 13 +R 5 +D 2 +U 10 +D 14 +L 8 +U 11 +R 1 +L 15 +U 13 +L 4 +D 9 +L 1 +U 14 +R 10 +D 2 +R 15 +L 12 +R 15 +U 15 +L 3 +U 1 +L 1 +R 9 +D 11 +L 9 +D 3 +U 12 +R 1 +D 7 +L 8 +R 10 +D 2 +L 4 +D 2 +U 12 +D 12 +L 15 +U 3 +D 13 +U 13 +D 3 +R 4 +L 7 +D 6 +U 7 +D 7 +R 2 +D 2 +R 10 +L 12 +U 14 +D 1 +U 5 +L 8 +R 1 +U 5 +D 8 +U 1 +D 15 +U 13 +L 15 +R 1 +L 10 +U 14 +D 15 +R 10 +L 13 +D 8 +L 7 +U 11 +R 7 +U 10 +D 15 +L 1 +U 5 +L 2 +R 6 +L 4 +U 15 +R 13 +U 4 +R 7 +U 4 +R 10 +L 3 +U 10 +R 10 +D 13 +R 11 +L 12 +D 12 +U 7 +R 8 +D 14 +L 4 +R 4 +L 8 +D 6 +R 8 +L 5 +U 6 +L 7 +U 14 +D 14 +R 14 +L 9 +D 5 +U 14 +R 16 +L 4 +R 14 +U 3 +D 10 +L 5 +R 9 +D 4 +R 14 +L 16 +D 13 +L 4 +R 13 +D 5 +R 5 +U 1 +R 6 +L 15 +D 16 +R 15 +D 11 +R 11 +D 6 +U 7 +L 10 +D 7 +U 12 +R 6 +L 2 +U 7 +L 8 +U 14 +L 5 +U 6 +L 10 +R 16 +L 13 +D 13 +U 7 +R 9 +L 8 +U 3 +D 6 +R 2 +L 4 +R 15 +D 12 +U 7 +D 4 +U 2 +L 10 +D 4 +L 11 +D 12 +R 5 +L 13 +U 16 +L 12 +R 3 +L 16 +R 14 +L 8 +R 7 +U 7 +L 7 +D 12 +R 2 +D 5 +R 14 +U 9 +D 15 +U 2 +L 10 +D 1 +U 13 +L 2 +R 13 +D 5 +U 1 +D 2 +L 7 +D 14 +U 12 +D 8 +U 10 +L 3 +R 1 +U 14 +R 8 +L 12 +R 8 +U 2 +R 1 +D 14 +U 5 +D 11 +R 16 +U 1 +R 13 +D 2 +U 14 +R 11 +D 12 +U 17 +R 12 +L 6 +U 4 +R 16 +D 4 +R 2 +D 1 +U 6 +D 11 +R 8 +L 7 +R 3 +U 3 +L 14 +R 11 +L 9 +U 9 +L 2 +R 6 +U 11 +R 9 +L 15 +U 7 +R 6 +D 15 +U 11 +L 5 +U 2 +R 8 +D 13 +L 5 +U 6 +R 13 +D 15 +U 11 +L 10 +R 16 +L 14 +U 15 +R 3 +L 9 +U 11 +L 6 +R 7 +L 6 +D 16 +U 8 +R 2 +U 14 +D 14 +R 15 +D 2 +L 16 +D 14 +U 17 +D 6 +L 16 +D 7 +R 2 +U 17 +D 2 +U 2 +D 15 +U 5 +R 9 +L 10 +D 16 +U 1 +L 5 +U 6 +R 10 +D 11 +R 1 +U 7 +R 13 +U 6 +R 2 +L 11 +D 13 +U 8 +D 4 +R 15 +U 8 +R 14 +L 17 +U 5 +L 12 +U 11 +L 14 +R 12 +L 2 +D 10 +L 14 +D 10 +L 11 +U 15 +D 7 +U 5 +R 10 +U 4 +R 14 +U 3 +D 9 +L 6 +D 10 +L 1 +U 4 +L 15 +R 4 +U 13 +D 18 +R 15 +L 3 +U 17 +R 5 +L 3 +D 3 +L 1 +U 10 +L 3 +R 5 +U 13 +D 2 +R 17 +D 3 +U 4 +L 15 +D 5 +L 18 +U 7 +D 7 +U 10 +L 18 +D 14 +U 18 +L 11 +D 3 +L 15 +D 14 +L 16 +R 2 +D 8 +L 12 +U 11 +R 12 +D 2 +L 3 +R 12 +U 7 +L 9 +D 8 +U 7 +L 10 +D 2 +U 10 +D 16 +L 17 +R 13 +L 12 +R 18 +L 6 +U 2 +D 6 +L 15 +D 8 +U 14 +R 12 +L 8 +R 6 +L 17 +U 5 +D 4 +L 8 +U 16 +R 8 +U 12 +L 1 +R 6 +D 11 +L 10 +U 13 +R 4 +L 9 +R 7 +D 1 +L 17 +R 4 +L 13 +R 8 +D 14 +U 3 +R 10 +L 18 +R 11 +U 3 +D 5 +U 2 +L 14 +R 12 +D 12 +R 11 +U 5 +D 17 +R 2 +D 6 +L 13 +D 4 +L 5 +R 7 +U 7 +L 12 +D 16 +U 6 +L 1 +R 18 +D 4 +R 11 +D 10 +L 11 +D 2 +L 1 +D 5 +U 2 +R 19 +D 10 +U 14 +R 1 +U 11 +R 15 +D 2 +L 15 +U 19 +R 3 +L 2 +D 12 +R 2 +L 15 +R 8 +D 3 +R 8 +D 11 +R 17 +D 5 +R 16 +L 8 +R 12 +L 5 +R 14 +D 3 +R 19 +D 4 +R 18 +L 4 +U 12 +D 7 +L 8 +R 11 +U 14 +L 12 +U 17 +L 1 +D 5 +R 8 +L 18 +U 16 +L 15 +D 13 +U 18 +R 11 +L 7 +R 19 +L 15 +U 10 +L 4 +R 9 +U 7 +R 8 +L 16 +R 8 +L 17 +D 8 +L 17 +D 18 +U 9 +D 2 +L 6 +U 6 +L 7 +D 18 +R 1 +U 13 +L 2 +U 1 +R 8 +U 11 +D 14 +R 6 +U 13 +R 2 +D 11 +L 5 +U 12 +D 7 +U 4 +R 4 +D 19 +R 17 +L 10 +U 5 +L 1 +U 4 +L 6 +D 11 +L 16 +D 9 +R 16 +L 3 +R 1 +D 3 +L 5 +U 18 +D 13 +R 10 +U 5 +D 4 +U 17 +R 4 +D 18 +U 1 diff --git a/day09/input.test b/day09/input.test new file mode 100644 index 0000000..9874df2 --- /dev/null +++ b/day09/input.test @@ -0,0 +1,8 @@ +R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2 diff --git a/day09/src/main.rs b/day09/src/main.rs index e7a11a9..0af1eaa 100644 --- a/day09/src/main.rs +++ b/day09/src/main.rs @@ -1,3 +1,62 @@ -fn main() { - println!("Hello, world!"); +use std::{ + fs::File, + io::{BufRead, BufReader}, +}; + +use positions::{Dir, Rope}; + +mod positions; + +#[derive(Debug, Default, PartialEq, Eq)] +enum SolvePuzzle { + First, + #[default] + Second, +} + +fn solve_puzzle(reader: R) -> usize { + let lines = reader + .lines() + .map(Result::unwrap) + .flat_map(Dir::parse_line) + .collect::>(); + lines.visited.len() +} + +fn main() { + let mut args = ::std::env::args().skip(1); + let file = args.next().unwrap_or_else(|| String::from("./input")); + let solve = args + .next() + .map(|arg| match arg.as_str() { + "first" => SolvePuzzle::First, + "second" => SolvePuzzle::Second, + _ => unreachable!(), + }) + .unwrap_or_default(); + let reader = BufReader::new(File::open(file).expect("Opening file")); + let solution = match solve { + SolvePuzzle::First => solve_puzzle::<2, _>(reader), + SolvePuzzle::Second => solve_puzzle::<10, _>(reader), + }; + println!("{}", solution); +} + +#[cfg(test)] +mod tests { + use std::io::Cursor; + + use super::*; + + #[test] + fn example_on_first() { + let reader = Cursor::new(include_str!("../input.test")); + assert_eq!(solve_puzzle::<2, _>(reader), 13); + } + + #[test] + fn example_on_second() { + let reader = Cursor::new(include_str!("../input.test")); + assert_eq!(solve_puzzle::<10, _>(reader), 1); + } } diff --git a/day09/src/positions.rs b/day09/src/positions.rs new file mode 100644 index 0000000..f98d880 --- /dev/null +++ b/day09/src/positions.rs @@ -0,0 +1,115 @@ +use std::{collections::HashSet, ops::AddAssign}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Dir { + Left, + Right, + Up, + Down, +} + +#[derive(Debug)] +pub struct Rope { + pub visited: HashSet<(isize, isize)>, + knots: [(isize, isize); N], +} + +impl Rope { + pub fn push(&mut self, dir: Dir) { + // Adjust the head + self.knots[0] += dir; + // Fix possibly wrong position of second element + self.verify_knot_position(1); + } + + fn verify_knot_position(&mut self, knot: usize) { + let head = self.knots[knot - 1]; + let tail = self.knots[knot]; + let (x_off, y_off) = (head.0 - tail.0, head.1 - tail.1); + if x_off.abs() <= 1 && y_off.abs() <= 1 { + // everything is fine + return; + } + self.fix_knot_position(knot, x_off, y_off); + } + + fn fix_knot_position(&mut self, knot: usize, x_off: isize, y_off: isize) { + let tail = &mut self.knots[knot]; + match (x_off, y_off) { + (-2, 0) => *tail += Dir::Left, + (2, 0) => *tail += Dir::Right, + (0, -2) => *tail += Dir::Up, + (0, 2) => *tail += Dir::Down, + (x_off, y_off) if x_off < 0 && y_off < 0 => { + tail.0 -= 1; + tail.1 -= 1 + } + (x_off, y_off) if x_off < 0 && y_off > 0 => { + tail.0 -= 1; + tail.1 += 1 + } + (x_off, y_off) if x_off > 0 && y_off < 0 => { + tail.0 += 1; + tail.1 -= 1 + } + (x_off, y_off) if x_off > 0 && y_off > 0 => { + tail.0 += 1; + tail.1 += 1 + } + _ => unreachable!(), + } + if knot == N - 1 { + // Last knot, remember new position + self.visited.insert(*tail); + } else { + self.verify_knot_position(knot + 1) + } + } +} + +impl Dir { + pub fn parse_line>(line: S) -> impl Iterator { + let (dir, count) = line.as_ref().split_at(1); + // Remove leading whitespace + let count = &count[1..]; + let dir = match dir { + "L" => Self::Left, + "R" => Self::Right, + "U" => Self::Up, + "D" => Self::Down, + _ => unreachable!(), + }; + ::std::iter::repeat(dir).take(count.parse().unwrap()) + } +} + +impl FromIterator for Rope { + fn from_iter>(iter: T) -> Self { + iter.into_iter().fold(Self::default(), |mut acc, dir| { + acc.push(dir); + acc + }) + } +} + +impl Default for Rope { + fn default() -> Self { + Self { + visited: [(0, 0)].into_iter().collect(), + knots: [(0, 0); N], + } + } +} + +impl AddAssign for (isize, isize) { + fn add_assign(&mut self, rhs: Dir) { + let (x_add, y_add) = match rhs { + Dir::Left => (-1, 0), + Dir::Right => (1, 0), + Dir::Up => (0, -1), + Dir::Down => (0, 1), + }; + self.0 += x_add; + self.1 += y_add; + } +}