diff options
author | Hunky Jimpjorps <thechairman@thechairman.info> | 2023-12-05 14:44:52 -0500 |
---|---|---|
committer | Hunky Jimpjorps <thechairman@thechairman.info> | 2023-12-05 14:44:52 -0500 |
commit | 2c5ef0de53a74b0805a111313279c008ac60a64e (patch) | |
tree | cefc68a9a938bbe6bdd05d51137c85acd1c38853 /aoc2023-other | |
parent | e18df290edcd9c863bf2008a70b6ccbf1e49b36a (diff) | |
download | gleam_aoc-2c5ef0de53a74b0805a111313279c008ac60a64e.tar.gz gleam_aoc-2c5ef0de53a74b0805a111313279c008ac60a64e.zip |
day 5 complete
Diffstat (limited to 'aoc2023-other')
-rw-r--r-- | aoc2023-other/day-05/day-05.rkt | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/aoc2023-other/day-05/day-05.rkt b/aoc2023-other/day-05/day-05.rkt index 78f44da..0373619 100644 --- a/aoc2023-other/day-05/day-05.rkt +++ b/aoc2023-other/day-05/day-05.rkt @@ -40,21 +40,33 @@ (define (remap-range r mapper [acc '()]) (match-define (seed-range r-start r-end) r) (match mapper + ; mapper exhausted ['() (cons r acc)] + ; range to the left - not covered by this mapping, so keep as-is [(list* (map-range m-start _ _) _) #:when (< r-end m-start) (cons r acc)] + ; range to the right - move to next map-range [(list* (map-range _ m-end _) ms) #:when (< m-end r-start) (remap-range r ms acc)] + ; range is inside map-range - transform whole range [(list* (map-range m-start m-end offset) _) #:when (and (<= m-start r-start) (<= r-end m-end)) (cons (seed-range (+ r-start offset) (+ r-end offset)) acc)] + ; range overlaps start only - keep left side, transform right side + [(list* (map-range m-start m-end offset) ms) + #:when (and (< r-start m-start) (<= r-end m-end)) + (remap-range (seed-range (add1 m-end) r-end) + ms + (cons (seed-range (+ m-start offset) (+ r-end offset)) acc))] + ; range overlaps end - transform left side, pass right side [(list* (map-range m-start m-end offset) ms) #:when (and (< m-start r-start) (<= m-end r-end)) (remap-range (seed-range (add1 m-end) r-end) ms (cons (seed-range (+ r-start offset) (+ m-end offset)) acc))] + ; range overlaps whole map-range - keep left side, transform middle, pass right side [(list* (map-range m-start m-end offset) ms) (remap-range (seed-range (add1 m-end) r-end) ms |