aoc2023/5.rkt

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"))