47 lines
1.7 KiB
Racket
47 lines
1.7 KiB
Racket
#lang curly-fn racket
|
|
|
|
(require "scripts/aoc.rkt")
|
|
|
|
;; solution for day 5
|
|
|
|
(struct rngmap [dst src len] #:transparent)
|
|
|
|
(define (transform-layer mapping iset)
|
|
(for/fold ([cur-src iset] [cur-dst (is:make-empty)]
|
|
#:result (is:union cur-src cur-dst))
|
|
([entry (in-list mapping)] #:do [(match-define (rngmap dst src len) entry)])
|
|
(define src-range (is:make-xrange src (+ src len)))
|
|
(define transform-src (is:intersect cur-src src-range))
|
|
(define transform-dst
|
|
(is:map #{cons (+ dst (- (car %) src)) (+ dst (- (cdr %) src))} transform-src))
|
|
(values (is:subtract cur-src src-range) (is:union cur-dst transform-dst))))
|
|
|
|
(define (part1 input)
|
|
(~> (foldl transform-layer (is:make-range* (first input)) (rest input))
|
|
is:integer-set-contents first car))
|
|
|
|
(define (part2 input)
|
|
(define init-range
|
|
(~> (for/list ([range (in-slice 2 (first input))])
|
|
(cons (first range) (+ (first range) (second range))))
|
|
is:make-xrange*))
|
|
(~> (foldl transform-layer init-range (rest input))
|
|
is:integer-set-contents first car))
|
|
|
|
(define (parse fname)
|
|
(match-define (cons initial mappings) (string-split (file->string fname) "\n\n"))
|
|
(define initial-nums (map string->number (rest (string-split initial " "))))
|
|
(define mapping-nums
|
|
(for/list ([map-str (in-list mappings)])
|
|
(define entries (rest (string-split map-str "\n")))
|
|
(for/list ([entry (in-list entries)])
|
|
(match-define (list dst src len) (map string->number (string-split entry " ")))
|
|
(rngmap dst src len))))
|
|
(cons initial-nums mapping-nums))
|
|
|
|
(module+ main
|
|
(define input (parse "inputs/5"))
|
|
(answer 5 1 (time (part1 input)))
|
|
(answer 5 2 (time (part2 input)))
|
|
(displayln "meow"))
|