aoc2022/13.rkt

50 lines
1.3 KiB
Racket

#lang curly-fn racket
(require "scripts/aoc.rkt")
;; solution for day 13
(define (<=> l r)
(cond
[(= l r) 0]
[(< l r) -1]
[else 1]))
(define (cmp l r)
(match* (l r)
[(_ (? integer?)) (cmp l (list r))]
[((? integer?) _) (cmp (list l) r)]
[('() '()) 0]
[((list* lf lr) '()) 1]
[('() (list* rf rr)) -1]
[((list* (? integer? lf) lr) (list* (? integer? rf) rr))
(match (<=> lf rf)
[0 (cmp lr rr)]
[x x])]
[((list* lf lr) (list* rf rr))
(match (cmp lf rf)
[0 (cmp lr rr)]
[x x])]))
(define (part1 input)
(for/sum ([pair (in-list input)] [idx (in-naturals 1)]
#:when (= -1 (cmp (first pair) (second pair))))
idx))
(define (part2 input)
(define special '(((2)) ((6))))
(define sorted (sort (apply append special input) #{= -1 (cmp %1 %2)}))
(~>> special (map #{index-of sorted %}) (map add1) (apply *)))
(define (parse fname)
(define (parse-line line)
(read (open-input-string (string-replace line "," " "))))
(for/list ([pair-str (in-list (string-split (file->string fname) "\n\n"))])
(map parse-line (string-split pair-str "\n"))))
(module+ main
(define input (parse "inputs/13"))
(answer 13 1 (time (part1 input)))
(answer 13 2 (time (part2 input)))
(displayln "meow"))