aoc2020/12.rkt

52 lines
1.5 KiB
Racket

#lang curly-fn racket
(require "scripts/aoc.rkt")
;; solution for day 12
;; helper functions here
(define d->r degrees->radians)
(define (part1 input)
(define-values [dir s]
(for/fold ([dir 0] [s 0]) ([ins (in-list input)])
(match-define (cons ltr num) ins)
(match ltr
["N" (values dir (+ s (* +i num)))]
["S" (values dir (- s (* +i num)))]
["E" (values dir (+ s num))]
["W" (values dir (- s num))]
["L" (values (+ dir (d->r num)) s)]
["R" (values (- dir (d->r num)) s)]
["F" (values dir (+ s (make-polar num dir)))])))
(inexact->exact (round (+ (abs (real-part s)) (abs (imag-part s))))))
(define (part2 input)
(define-values [s w]
(for/fold ([s 0] [w 10+1i]) ([ins (in-list input)])
(match-define (cons ltr num) ins)
(match ltr
["N" (values s (+ w (* +i num)))]
["S" (values s (- w (* +i num)))]
["E" (values s (+ w num))]
["W" (values s (- w num))]
["L" (values s (* w (make-polar 1 (d->r num))))]
["R" (values s (* w (make-polar 1 (d->r (- num)))))]
["F" (values (+ s (* w num)) w)])))
(inexact->exact (round (+ (abs (real-part s)) (abs (imag-part s))))))
(module+ main
(define input
(for/list ([line (in-list (file->lines "inputs/12"))])
(match line
[(pregexp #px"^(.)([0-9]+)$" (list _ dir (app string->number num)))
(cons dir num)])))
;; part 1
(answer 12 1 (part1 input))
;; part 2
(answer 12 2 (part2 input))
(displayln "meow"))