Y252WSYR7C5GNY7T5F24CMOFKSMKT2JX542CBP7FPN4EAI7RMZ2QC (ns edition2022.day9-test(:require [clojure.test :refer :all][edition2022.day9 :refer :all]))(deftest rope-movement(testing "vertical movement"(is (=(move-rope [[0 0] [0 0]] [0 1])[[0 1] [0 0]]))(is (=(move-rope [[0 1] [0 0]] [0 1])[[0 2] [0 1]]))(is (=(move-rope [[0 1] [0 0]] [0 -1])[[0 0] [0 0]]))(is (=(move-rope [[0 0] [0 0]] [0 -1])[[0 -1] [0 0]]))(is (=(move-rope [[0 -1] [0 0]] [0 -1])[[0 -2] [0 -1]])))(testing "horizontal movement"(is (=(move-rope [[0 0] [0 0]] [1 0])[[1 0] [0 0]]))(is (=(move-rope [[1 0] [0 0]] [1 0])[[2 0] [1 0]]))(is (=(move-rope [[1 0] [0 0]] [-1 0])[[0 0] [0 0]]))(is (=(move-rope [[0 0] [0 0]] [-1 0])[[-1 0] [0 0]]))(is (=(move-rope [[-1 0] [0 0]] [-1 0])[[-2 0] [-1 0]])))(testing "movement that ends up in diagonal"(testing "vertical"(is (=(move-rope [[1 0] [0 0]] [0 1])[[1 1] [0 0]]))(is (=(move-rope [[-1 0] [0 0]] [0 1])[[-1 1] [0 0]]))(is (=(move-rope [[1 0] [0 0]] [0 -1])[[1 -1] [0 0]]))(is (=(move-rope [[-1 0] [0 0]] [0 -1])[[-1 -1] [0 0]])))(testing "horizontal"(is (=(move-rope [[0 1] [0 0]] [1 0])[[1 1] [0 0]]))(is (=(move-rope [[0 -1] [0 0]] [1 0])[[1 -1] [0 0]]))(is (=(move-rope [[0 1] [0 0]] [-1 0])[[-1 1] [0 0]]))(is (=(move-rope [[0 -1] [0 0]] [-1 0])[[-1 -1] [0 0]]))))(testing "diagonal movements"(is (=(move-rope [[1 1] [0 0]] [0 1])[[1 2] [1 1]]))(is (=(move-rope [[1 1] [0 0]] [1 0])[[2 1] [1 1]]))(is (=(move-rope [[-1 1] [0 0]] [0 1])[[-1 2] [-1 1]]))(is (=(move-rope [[-1 1] [0 0]] [-1 0])[[-2 1] [-1 1]]))(is (=(move-rope [[1 -1] [0 0]] [0 -1])[[1 -2] [1 -1]]))(is (=(move-rope [[1 -1] [0 0]] [1 0])[[2 -1] [1 -1]]))(is (=(move-rope [[-1 -1] [0 0]] [0 -1])[[-1 -2] [-1 -1]]))(is (=(move-rope [[-1 -1] [0 0]] [-1 0])[[-2 -1] [-1 -1]]))))
(ns edition2022.day9(:require [clojure.string :as str]))(def example "R 4\nU 4\nL 3\nD 1\nR 4\nD 1\nL 5\nR 2")(def example-lines (str/split-lines example))(def example-lines2 (str/split-lines "R 5\nU 8\nL 8\nD 3\nR 17\nD 10\nL 25\nU 20\n"))(defn expand-move [[direction times]](->> (cond(= direction "R") [1 0](= direction "L") [-1 0](= direction "U") [0 1](= direction "D") [0 -1])(iterate identity)(take (Integer/parseInt times))))(defn expand-moves [lines](->> lines(map #(str/split % #" "))(map expand-move)(apply concat)))(defn update-position [pos move][(+ (first move) (first pos)) (+ (second move) (second pos))])(defn tail-head-distance [tail head](->> (interleave head tail)(partition 2)(map #(reduce - %))(into [])))(defn update-tail [tail new-head](let [new-distance (tail-head-distance tail new-head)](cond(or (= [2 1] new-distance) (= [1 2] new-distance) (= [2 2] new-distance)) (update-position tail [1 1])(or (= [-2 1] new-distance) (= [-1 2] new-distance) (= [-2 2] new-distance)) (update-position tail [-1 1])(or (= [2 -1] new-distance) (= [1 -2] new-distance) (= [2 -2] new-distance)) (update-position tail [1 -1])(or (= [-2 -1] new-distance) (= [-1 -2] new-distance) (= [-2 -2] new-distance)) (update-position tail [-1 -1])(= [2 0] new-distance) (update-position tail [1 0])(= [0 2] new-distance) (update-position tail [0 1])(= [-2 0] new-distance) (update-position tail [-1 0])(= [0 -2] new-distance) (update-position tail [0 -1]):else tail)))(defn move-rope([rope move] (move-rope rope move 0 rope))([rope move knot prev-rope](if (= (count rope) (inc knot))rope(let [head (nth prev-rope knot)tail (nth rope (inc knot))new-head (if (= knot 0) (update-position head move) (nth rope knot))new-tail (update-tail tail new-head)](recur (assoc rope knot new-head (inc knot) new-tail) move (inc knot) rope)))))(defn execute-moves ([lines] (execute-moves lines 2))([lines rope-length](loop [moves (expand-moves lines)rope (into [] (repeat rope-length [0 0]))tail-visited (vector)](if (empty? moves)tail-visited(let [next-move (first moves)new-rope (move-rope rope next-move)](recur (rest moves) new-rope (conj tail-visited (last new-rope))))))))(comment(tail-head-distance [0 1] [0 3])(tail-head-distance [-2 -1] [-1 -2])(expand-move ["U" 3])(expand-moves example-lines)(count (set (execute-moves example-lines)))(count (set (execute-moves (str/split-lines (slurp "resources/day9.in")))))(count (set (execute-moves example-lines2 10)))(count (set (execute-moves (str/split-lines (slurp "resources/day9.in")) 10)))(set (execute-moves example-lines2 10))(execute-moves ["R 4" "U 4"] 10)(execute-moves [(first example-lines2) (second example-lines2) (nth example-lines2 3)] 10)(execute-moves ["R 5" "U 8" "L 8" "D 3" "R 17"] 10)example-lines2(move-rope [[5 2] [5 1] [3 0] [2 0] [1 0] [0 0] [0 0] [0 0] [0 0] [0 0]] [0 1]))
L 2D 2R 2U 1L 1U 1R 1U 2R 2U 2L 2R 2U 2L 2U 1R 1U 1R 2U 1D 2U 2L 2R 1U 2R 2U 2L 1D 1L 1R 2L 2D 1L 1R 2U 2L 1U 1L 2R 1L 1D 2U 2L 2D 1R 2D 1U 2D 2L 2D 1L 1R 1D 2U 2L 2U 1L 1U 2R 2D 1U 2R 2U 1L 2R 2D 2U 2D 2L 2D 1U 2L 1R 1L 1D 2U 1D 1L 2D 1L 1R 1U 1L 2R 2U 2D 2L 1R 2D 1R 2D 2L 1U 2R 1D 2L 1D 2U 2D 1U 2R 1D 1L 1D 2R 2U 1R 1D 2L 2R 2D 1R 3U 1D 1U 1R 2U 2R 3U 3L 3D 2L 3D 1L 3D 3R 3D 3R 3L 2D 3R 1L 3U 1L 1U 1L 2R 3D 2U 3R 3D 2L 3R 3D 1L 3U 1D 1L 1D 2L 2U 1L 1R 1U 3R 2L 3U 2R 2U 1D 3U 1L 1U 2R 1D 3R 3U 3D 2U 1L 1D 3L 2U 3D 1R 1D 1R 3U 2L 1U 3R 1U 2L 3R 2L 1R 1U 2L 1D 2L 3D 3R 3D 1U 3D 1R 3U 2L 2D 1U 1R 3L 2D 2L 2D 2R 1D 3L 1R 2L 2R 3L 1U 1D 2R 2U 3R 1L 2R 3U 1L 3D 3L 1D 1U 4R 2L 1D 3U 1D 3R 2L 2D 2L 3U 4D 4L 4U 1D 2L 3R 1L 1U 2D 1U 3L 2R 2D 2L 2R 4D 1L 2R 4U 4L 3R 3D 1L 3U 3L 1U 3L 1D 4U 1R 3L 2R 3D 2L 4U 1D 4L 2U 2D 3L 2U 3R 1U 1R 2U 3L 1R 4D 2R 1D 1L 4R 3U 1D 2L 3R 4L 1U 1D 2U 1D 3R 3L 3U 1L 3R 3D 2U 2L 2R 1L 3U 3R 4D 1U 4D 1R 2D 4L 2R 1L 2R 1D 3U 3R 1U 1R 1D 2R 4D 4L 3D 4R 1D 1U 1L 1R 1D 4L 1R 1U 4R 5D 4R 5U 1D 1R 1U 4L 3D 5U 3L 2D 3R 5U 1D 1R 2L 1R 3D 4R 5L 1U 3D 3R 1D 4R 1L 4R 3U 1D 1U 5R 2L 3U 1L 4D 1R 3L 4D 2R 3L 5D 2L 3D 2L 2R 4D 1R 3L 5U 2L 4D 3L 2R 4D 5L 5R 4U 5D 2U 4D 4L 3U 3L 3D 1R 4D 4U 3R 4L 3D 2L 4D 2L 4R 3L 5R 2L 3R 3U 4D 4L 4R 2D 4U 3L 3U 1D 2U 5L 2D 3U 1R 5D 2L 3U 1D 2L 2U 2R 5L 4R 4L 2D 3R 1U 5R 2L 5U 3L 3R 6D 2L 2R 2U 1D 6U 6D 1L 3R 6U 6R 3D 6R 5U 5D 1R 4L 2U 2R 4D 6U 4R 4D 6R 2U 1D 5U 3R 1L 2R 1U 6R 1L 1U 4R 1D 6U 2D 5R 2D 6R 3L 3U 1R 3L 4D 6L 3U 3D 1U 4R 6L 3D 2U 6R 2D 4R 3D 5U 2L 1D 4R 1L 3R 5U 4D 1L 3U 4R 2D 6R 4D 5R 5D 3R 6L 4U 2L 4U 2L 5D 2R 3D 2R 6U 4R 5U 1R 6D 4L 2D 2U 2L 5R 1U 2R 3U 5L 3D 1L 1R 1L 3U 1L 4R 3L 6U 4L 2D 2U 7R 7U 4R 5D 4L 7U 5L 5U 1D 5L 3R 4D 3R 5L 3D 3L 4U 5L 4R 2L 5U 4L 4D 4U 5L 3U 7R 2L 1U 2L 7U 5R 4D 5R 1L 3D 6R 7L 1R 5D 4U 4L 7D 6U 7R 4U 2R 2U 2R 7D 6R 4L 1R 4D 3U 5R 3L 5R 2L 3D 2R 1D 3L 7D 4L 7U 7D 5R 6U 7R 5D 6R 5L 4U 1D 2L 4D 5L 5D 2L 7R 2U 7L 6D 3U 3D 6U 1R 3L 1U 7R 2D 2U 3L 6D 5U 5D 2R 6D 3L 3R 2L 6D 1L 2D 1L 7U 1D 2U 3L 5D 7R 2L 8U 7L 4U 4D 1U 4D 3R 8U 3L 4R 1L 5R 1L 1D 8R 5L 2U 1L 8U 8D 1R 3U 1R 1U 5R 4L 4U 7D 1U 8L 4D 7U 8L 5D 2R 4L 3R 2L 2D 1U 4D 2L 8U 1R 6D 5R 7D 2U 4L 4R 3U 2D 8R 3L 3U 2R 1D 5U 2R 5D 8R 7U 2L 6U 2D 1L 4U 1D 7U 4L 3U 5R 5D 4R 7U 4L 6R 4U 5D 7U 5D 3L 5U 1L 8D 8R 3L 6R 6U 1R 8L 8U 6R 2L 6U 2L 4D 1L 1U 5D 3R 6D 6L 7D 7L 1R 7U 4L 7U 6R 1L 8D 6L 5U 2D 7R 8D 1L 6R 1L 8D 3R 8L 8U 7R 3U 6L 2R 9L 3R 9D 1L 2R 7L 8U 1D 9U 7L 9R 1L 8D 7R 4L 9U 1L 2D 7R 7D 5L 4D 7U 9R 9D 4R 6D 5L 1R 8U 8L 6R 4L 3U 4D 7R 8D 8R 2L 4R 4U 1L 8U 5L 9U 4R 9L 1R 1D 5L 5D 8U 2L 4U 5D 4L 1D 1R 1U 9R 4D 2U 6L 5R 7D 9L 3U 2L 8U 6D 4R 1U 4R 1U 6D 8U 7R 5D 4R 2D 6U 6R 1U 3D 8U 2R 1U 8D 9U 3R 3D 6R 8D 1L 2D 2R 3D 3U 3D 2R 2L 5R 1U 9L 9D 3R 2L 10R 6L 5R 4L 6R 8D 2L 1R 2D 4L 9D 6U 2R 7U 9D 5R 2L 10D 7L 8U 3R 4U 4L 7U 10R 8L 7U 10R 9D 4R 2L 10R 9L 4D 7L 10D 5U 4R 3L 7D 3L 3R 3D 10R 2L 6D 5R 10L 7U 1D 6L 3D 4L 3D 7R 10U 6R 2U 5R 7U 3R 2U 6R 5L 9R 5D 3U 4L 5R 6U 1L 6U 7D 10R 10U 9L 10D 10R 6L 1U 8R 10U 8R 10U 1D 8U 10R 9D 8R 4D 10L 4U 9L 1D 3R 1L 3D 1L 9R 5D 7R 3L 4R 8U 6D 7U 3R 1D 8L 3R 9U 8R 11D 5L 5U 3R 6U 10R 8D 1U 3D 1R 11D 8U 11R 7U 6R 7U 6L 7D 4U 10L 4U 1L 10D 3R 3U 9L 11U 10R 6U 10R 10D 9L 10R 6L 2R 6L 1D 10U 8D 11U 2L 9U 7R 8L 10R 11D 4L 9R 3U 1L 8D 1L 9U 8D 8U 5R 6D 5R 9D 1L 11R 4D 11R 9L 11R 1U 5L 3D 4R 6D 9R 4L 7U 3D 6U 8D 1U 8D 5U 11R 7U 1L 1U 5L 4D 1R 1L 8U 9D 10U 4L 1R 4D 11R 8D 8R 11D 12U 3L 12U 10L 9R 11D 10R 5D 12U 6L 12R 3D 7U 11L 6U 5R 8D 3U 8D 8R 10D 12L 4R 10L 10U 1L 7R 10L 7U 4R 1L 10R 8D 11L 2U 2L 6U 9R 10L 2R 10U 4R 9D 7L 1U 7L 12D 1L 9U 7L 8R 12L 3D 9U 7L 11D 6R 4D 2R 11U 10R 8D 12U 10R 4L 11R 2U 11L 7R 6L 12R 5U 7L 6R 12D 6R 2L 10U 4D 5U 11R 3D 10L 2U 9L 3D 6U 10L 3U 10L 7R 8U 10D 3R 3L 12D 12L 9R 2D 2R 9L 4D 5L 2R 12D 2R 4U 2D 4U 3R 13L 3U 9R 5U 2D 8L 7D 10L 1U 2R 13D 11L 7D 6L 11R 12U 2D 9R 11U 9D 9L 2D 13U 3L 7D 3L 10R 5U 4L 5U 8L 4U 11R 3L 3D 1L 12D 8R 12L 1U 6D 2U 13L 5U 4R 12L 11U 1D 3U 11D 1R 2L 6D 11R 5D 7R 2U 9L 5R 4U 4R 9U 9L 9U 3R 10L 5R 5U 13D 2U 2L 3R 1U 11D 10L 7D 8R 10U 10L 13U 3L 9D 2R 13U 2D 10U 8L 5U 1D 10L 11R 5D 8L 11D 3R 13D 11L 8D 6L 3U 13L 9U 8R 8U 11D 1U 7D 2R 8L 4D 6U 10L 6R 2D 8R 5L 7U 4D 9U 4D 12L 12R 3L 12D 7L 3U 10D 3U 5R 3U 4L 4R 9L 8R 11D 5R 10D 13U 1L 4D 5R 13U 1R 8U 9D 2R 8D 4U 14R 14D 13U 2R 1U 3D 11L 3U 2D 10L 6U 9R 13D 10U 13D 4L 11D 9U 6L 6U 6D 4L 7D 14L 11D 1L 12R 2L 10U 3D 5U 12D 6U 6D 3U 8R 3D 11R 7D 4R 3U 12R 10D 9U 12R 6L 13D 1L 3U 1R 14L 8D 11L 5U 10L 12D 9R 11L 14D 8L 2R 9D 7U 4L 9D 9U 6D 5R 5L 10R 12L 13U 8L 2D 3L 8U 3R 14D 9U 8D 7U 2L 5R 11U 12L 3U 13D 4R 9U 8D 14R 14L 5D 4U 12L 1D 11R 1U 12D 1U 9L 14D 4R 15D 10U 14R 13U 11D 8L 1U 5R 2D 10U 9R 11D 2L 15R 3U 2D 4U 15D 8L 6D 1L 4U 2D 11R 6U 2R 13U 4L 5D 2R 5U 10R 4D 1R 9D 11L 13U 13R 2L 3R 7U 10R 14L 15R 1U 12D 6R 10L 12R 13D 11U 15R 8L 12D 6R 10D 4L 1R 5L 10U 2R 1L 9D 15R 7U 8D 8L 1D 14U 5D 4L 1R 6L 15U 13D 6L 5D 13R 9D 7L 15R 2D 14R 12D 13L 6U 5L 13U 16L 3D 12L 13U 11L 5U 6D 5L 15D 2R 6L 2R 5L 6R 16D 4L 10R 9L 9D 5R 6D 8U 6D 1R 4U 6D 10R 4L 12D 10R 2D 5U 15R 12U 6D 15R 5D 1L 9U 16R 3D 6L 1R 12D 12U 3R 1D 2L 11R 7D 7U 10L 8U 15L 7U 12D 10R 2L 8R 12D 16R 13L 15U 1R 1U 13L 6R 12L 5D 5U 12D 4L 7R 11L 12U 16D 11U 7L 1U 11D 7U 14D 14R 10D 4R 5D 2R 13L 13D 6L 16R 1L 4D 3U 15R 1U 2D 2U 2D 3U 7D 16U 11L 8R 1D 6U 1R 5L 6U 5D 3L 13U 8L 11D 17U 12L 16U 1D 6U 17D 7U 12R 3U 6L 10R 1L 14U 11L 8U 10L 14D 4R 3L 14D 13L 17R 12U 9D 7U 2R 10L 16U 9R 17D 14U 9L 13R 13L 5U 14L 4R 10U 2L 9D 17L 17U 9D 9L 4U 15L 2U 17R 1L 5R 2U 5R 5L 17R 4U 12R 11L 17U 11D 15U 10R 7D 9L 15U 1D 6L 13R 7D 12L 6U 14R 11D 2L 4R 14L 17R 2D 1R 13L 12D 12L 16D 14L 4R 14U 15L 17U 9D 13R 6D 2R 4L 8U 16R 10L 6U 7D 4L 15D 2U 14L 5R 8L 2D 14U 7R 5U 13L 9D 2U 18R 9U 13R 9L 5D 10U 18D 13U 13D 14L 3R 2L 13D 11R 17L 15D 3L 1U 10L 14D 15L 13R 12D 4L 1D 2R 16D 10U 11L 12U 1D 2R 3U 2R 12L 6D 1L 13R 11U 8L 8D 10R 5U 6L 7R 4U 9L 6D 10L 14U 11D 1L 7R 3U 16L 11D 13L 14U 10L 3R 12U 9R 11U 10L 8D 5U 9L 16R 17D 3R 5D 13U 8R 5U 16R 2U 13D 16L 9D 14L 15U 15L 1D 8L 7D 1R 11D 16R 9U 14L 18U 4D 14L 14D 9R 6L 1R 4L 11D 17L 9R 10L 19U 12D 15R 9L 3D 13R 6D 19R 9D 1L 13D 8L 19U 14R 18D 10R 7L 18U 18D 5L 1U 10D 10U 19R 14L 7D 19U 10L 3U 17D 1L 5U 7R 16D 3U 8D 17U 17D 17L 14D 19R 8D 14L 7U 7L 5D 6L 1U 14L 10U 15L 7D 14L 11R 5D 14L 13R 2L 19D 7R 8L 16U 4L 9U 17R 15L 8U 15D 5R 8L 16R 6D 17U 19D 19R 10D 4U 12D 2L 18D 13L 7U 17L 13D 5U 2L 6R 4U 19L 4D 8U 7L 3R 4U 17L 1U 6R 9D 16R 4D 9R 9L 11U 17D 18U 18R 16L 7R 18U 5L 4D 7