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