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