43 lines
1.1 KiB
Plaintext
Executable file
43 lines
1.1 KiB
Plaintext
Executable file
#!/usr/bin/env janet
|
|
(use spork/test)
|
|
|
|
(defn intersection
|
|
"Return the intersection between two arrays. Assumes no dupes and not efficient"
|
|
[a b]
|
|
(filter (fn [x] (has-value? a x)) b))
|
|
|
|
(def peg
|
|
~{:card-num (* "Card" :s+ (<- :d+) ":" :s+)
|
|
:num-group (* (<- :d+) :s+ (+ :num-group (<- :d+)))
|
|
:main (* :card-num (/ (* (group :num-group) :s+ "|" :s+ (group :num-group)) ,intersection))})
|
|
(defn pmatch [input] (peg/match peg input))
|
|
|
|
(defn get-score [input]
|
|
(-> input
|
|
pmatch
|
|
1 # get second index of peg
|
|
length
|
|
dec
|
|
math/exp2
|
|
math/floor))
|
|
|
|
(defn solve [lines]
|
|
(print (sum (map get-score lines))))
|
|
|
|
(start-suite)
|
|
|
|
(def example
|
|
[["Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53" 8]
|
|
["Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19" 2]
|
|
["Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1" 2]
|
|
["Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83" 1]
|
|
["Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36" 0]
|
|
["Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11" 0]])
|
|
|
|
(each [e correct] example
|
|
(assert (= correct (get-score e))))
|
|
|
|
(end-suite)
|
|
|
|
(print (with [f (file/open "p04.txt")] (solve (file/lines f))))
|