You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
aoc-racket/typed/day16.rkt

78 lines
3.3 KiB
Racket

#lang typed/racket
;;bg; wow this one came out ugly
(require typed/rackunit trivial/regexp/no-colon)
(provide (all-defined-out))
(: parse-sues (-> String (Listof (Listof String))))
(define (parse-sues str)
(for/list ([ln (in-list (string-split str "\n"))])
: (Listof (Listof String))
(define attr-str (second (or (regexp-match #px"^.*?: (.*)$" ln) (error 'bg))))
(string-split attr-str ", ")))
(define master-attrs (file->lines "../day16-input-master-attrs.txt"))
(: q1 (-> String (U #f Integer)))
(define (q1 input-str)
(define sues (parse-sues input-str))
(for/or ([(sue-attrs sue-number) (in-indexed sues)])
: (U #f Integer)
(let loop : (U #f Integer) ([sue-attrs sue-attrs] [acc : (U #f Integer) #f])
(cond
[(null? sue-attrs)
acc]
[(member (car sue-attrs) master-attrs)
(loop (cdr sue-attrs) (add1 sue-number))]
[else
#f]))))
;(for/and ([sue-attr (in-list sue-attrs)])
; : (U #f Integer)
; (and (member sue-attr master-attrs) (add1 sue-number)))
(: q2 (-> String (U #f Integer)))
(define (q2 input-str)
(: attrs->datums (-> (Listof Any) (Listof (Listof Any))))
(define (attrs->datums attrs)
(map (λ (attr) (cast (read (open-input-string (format "(~a)" attr))) (Listof Any))) ;;bg;
#;(compose1 read open-input-string
(λ(attr) (format "(~a)" attr))) attrs))
(define sues (for/list ([sue-attrs (parse-sues input-str)])
: (Listof (Listof (Listof Any)))
(attrs->datums sue-attrs)))
(define master-datums : (Listof (List Symbol Index))
(cast (attrs->datums master-attrs) (Listof (List Symbol Index))))
(for/or ([(sue-datums sue-number) (in-indexed sues)])
: (U #f Integer)
(let loop : (U #f Integer) ([sue-datums : (Listof (Listof Any)) sue-datums] [acc : (U #f Integer) #f])
(if (null? sue-datums)
acc
(let* ([sue-key (caar sue-datums)]
[sue-value (cast (cadar sue-datums) Natural)]
[master-value (second (or (assoc sue-key master-datums) (error 'bg)))]
[cmp (case sue-key
[(cats: trees:) >]
[(pomeranians: goldfish:) <]
[else =])])
(if (cmp sue-value master-value)
(loop (cdr sue-datums) (add1 sue-number))
#f))))))
;(for/and ([sue-datum (in-list sue-datums)])
; : (U #f Integer)
; (and
; (let* ([sue-key (first sue-datum)]
; [sue-value (second sue-datum)]
; [master-value (second (assoc sue-key master-datums))]
; [cmp (case sue-key
; [(cats: trees:) >]
; [(pomeranians: goldfish:) <]
; [else =])])
; (cmp sue-value master-value))
; (add1 sue-number)))) )
(module+ test
(define input-str (file->string "../day16-input.txt"))
(check-equal? (q1 input-str) 103)
(check-equal? (q2 input-str) 405))