32 lines
880 B
Racket
32 lines
880 B
Racket
#lang racket
|
|
|
|
(require "../lib.rkt")
|
|
|
|
(define input (map string->list (problem-input 3)))
|
|
|
|
;; priority : char? -> natural?
|
|
(define (priority c)
|
|
(define lower-offset (sub1 (char->integer #\a)))
|
|
(define upper-offset (sub1 (char->integer #\A)))
|
|
(if (char-lower-case? c)
|
|
(- (char->integer c) lower-offset)
|
|
(+ 26 (- (char->integer c) upper-offset))))
|
|
|
|
;; unique : (listof char?) -> char?
|
|
(define (unique rucksack)
|
|
(define len (/ (length rucksack) 2))
|
|
(first (set-intersect (take rucksack len) (drop rucksack len))))
|
|
|
|
;; unique : (list/c (listof char?) (listof char?) (listof char?)) -> char?
|
|
(define (badge rucksacks)
|
|
(first (apply set-intersect rucksacks)))
|
|
|
|
(define part1
|
|
(for/sum ([rucksack input])
|
|
(priority (unique rucksack))))
|
|
|
|
(define part2
|
|
(for/sum ([rucksacks (in-slice 3 input)])
|
|
(priority (badge rucksacks))))
|
|
|
|
(show-solution part1 part2) |