-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday-20.clj
51 lines (43 loc) · 1.13 KB
/
day-20.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
(ns day-20
(:require [hashp.core]))
(def parse-int #(Integer/parseInt %))
(defn parse-tile [lines]
(let [[title tile] (split-at 1 lines)]
{:id (->> title first (re-find #"\d+") parse-int)
:tile tile}))
(defn parse [input]
(->> input
(clojure.string/split-lines)
(partition-by empty?)
(remove #{'("")})
(map parse-tile)))
(defn tile->node [{:keys [id tile]}]
[{:id id
:edge (first tile)}
{:id id
:edge (last tile)}
{:id id
:edge (apply str (map first tile))}
{:id id
:edge (apply str (map last tile))}])
(def gen-reverse
(juxt identity #(update % :edge (comp (partial apply str) reverse))))
(defn edges->adj-list [acc [id id']]
(-> acc
(update id (fnil conj #{}) id')
(update id' (fnil conj #{}) id)))
(defn puzzle1 [input]
(->> input
parse
(mapcat tile->node)
(mapcat gen-reverse)
(group-by :edge)
(vals)
(map #(map :id %))
(filter second)
(reduce edges->adj-list {})
(filter #(= (count (val %)) 2))
(map key)
(apply *)))
(def input (->> (slurp "input20.txt")))
(time (puzzle1 input))