52 lines
1.3 KiB
Racket
52 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 all-packets (list* '((2)) '((6)) (apply append input)))
|
||
|
(define sorted (sort all-packets #{= -1 (cmp %1 %2)}))
|
||
|
(* (add1 (index-of sorted '((2))))
|
||
|
(add1 (index-of sorted '((6))))))
|
||
|
|
||
|
(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"))
|