1
0
Fork 0
advent-23/p04.janet

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))))