diff --git a/5.rkt b/5.rkt new file mode 100644 index 0000000..af8570f --- /dev/null +++ b/5.rkt @@ -0,0 +1,76 @@ +#lang curly-fn racket + +(require "scripts/aoc.rkt") + +;; solution for day 5 + +(struct rngmap [dst src len] #:transparent) + +(define (transform-layer num mapping) + (or + (for/first ([entry (in-list mapping)] + #:do [(match-define (rngmap dst src len) entry)] + #:when (>= num src) + #:when (< num (+ src len))) + (+ dst (- num src))) + num)) + +(define (transform-all num mappings) + (for/fold ([cur-num num]) ([mapping (in-list mappings)]) + (transform-layer cur-num mapping))) + +(define (part1 input) + (apply min + (for/list ([num (in-list (first input))]) + (transform-all num (rest input))))) + +(define (part2-transform-layer iset mapping) + (define-values [rem-src dst] + (for/fold ([cur-src iset] [cur-dst (is:make-integer-set '())]) + ([entry (in-list mapping)] + #:do [(match-define (rngmap dst src len) entry)]) + (define entry-src (is:make-range src (+ src (sub1 len)))) + (define captured-values (is:intersect cur-src entry-src)) + (define captured-wfs (is:integer-set-contents captured-values)) + (define transformed-wfs + (for/list ([wfs-entry (in-list captured-wfs)]) + (cons (+ dst (- (car wfs-entry) src)) + (+ dst (- (cdr wfs-entry) src))))) + (define transformed-iset (is:make-integer-set transformed-wfs)) + (values (is:subtract cur-src entry-src) (is:union cur-dst transformed-iset)))) + (is:union rem-src dst)) + +(define (part2-transform-all iset mappings) + (for/fold ([cur-iset iset]) ([mapping (in-list mappings)]) + (part2-transform-layer cur-iset mapping))) + +(define (part2 input) + (define ranges (first input)) + (define ranges-iset + (for/fold ([is (is:make-integer-set '())]) + ([chunk (in-slice 2 (in-list ranges))]) + (is:union is + (is:make-range (first chunk) (+ (first chunk) (sub1 (second chunk))))))) + (define mappings (rest input)) + (define ranges-out (part2-transform-all ranges-iset mappings)) + (car (first (is:integer-set-contents ranges-out)))) + +(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)) + +; (part2 (parse "inputs/5-test1")) +; (error) + +(module+ main + (define input (parse "inputs/5")) + (answer 5 1 (time (part1 input))) + (answer 5 2 (time (part2 input))) + (displayln "meow")) diff --git a/inputs/5 b/inputs/5 new file mode 100644 index 0000000..6808607 --- /dev/null +++ b/inputs/5 @@ -0,0 +1,197 @@ +seeds: 1972667147 405592018 1450194064 27782252 348350443 61862174 3911195009 181169206 626861593 138786487 2886966111 275299008 825403564 478003391 514585599 6102091 2526020300 15491453 3211013652 546191739 + +seed-to-soil map: +325190047 421798005 78544109 +4034765382 1473940091 137996533 +403734156 658668780 288666603 +2574766003 2624114227 17352982 +1931650757 2203381572 98211987 +4263596455 2843660329 31370841 +1614547845 2641467209 55121215 +3441604278 2032673361 170708211 +692400759 563703672 94965108 +2992851755 3824700930 114550818 +3957953582 2540115966 24844899 +0 500342114 59804107 +4172761915 2577017231 47096996 +2029862744 3548344768 52256082 +2620304610 2875031170 99567251 +3982798481 3939251748 51966901 +2325101894 1616388089 203150170 +3612312489 1611936624 4451465 +787365867 0 77461445 +1341614907 4162572181 132395115 +2542801978 3468402968 31964025 +223387052 947335383 59156225 +2297805420 1819538259 27296474 +2082118826 3991218649 171353532 +3374211778 3040047171 67392500 +2592118985 1341614907 28185625 +2253472358 2495782904 44333062 +4219858911 3780963386 43737544 +59804107 560146221 3557451 +3107402573 3600600850 64973479 +1669669060 3115086052 235712356 +2719871861 1369800532 104139559 +3172376052 2301593559 194189345 +2980795389 2564960865 12056366 +1905381416 3350798408 26269341 +63361558 261772511 160025494 +2824011420 3377067749 91335219 +3366565397 3107439671 7646381 +282543277 77461445 42646770 +3713793353 2696588424 147071905 +2528252064 1877585624 14549914 +3927202691 1846834733 30750891 +3665815578 3500366993 47977775 +1474010022 1892135538 140537823 +3616763954 3665574329 49051624 +2915346639 2974598421 65448750 +864827312 120108215 141664296 +3860865258 3714625953 66337433 + +soil-to-fertilizer map: +3835605444 4098164436 1662218 +682286299 0 63480553 +396476124 2072802434 285810175 +1644893571 655614677 162631098 +3625179075 4099826654 40627721 +1431211762 1859120625 213681809 +2853687843 4140454375 103601386 +1390165578 2358612609 41046184 +2405285827 3959200676 138963760 +900243562 1478767251 170015757 +3727732722 3084190064 107872722 +893948759 1084467374 6294803 +210337617 818245775 186138507 +1807524669 63480553 592134124 +825849944 1090762177 68098815 +3837267662 3192062786 457699634 +0 1648783008 210337617 +3665806796 2405285827 61925926 +1070259319 1158860992 319906259 +745766852 1004384282 80083092 +2957289229 4244055761 50911535 +2544249587 3649762420 309438256 +3008200764 2467211753 616978311 + +fertilizer-to-water map: +1169336944 3024036226 46676171 +1263157944 1445876546 148868263 +2080390054 2683279801 65621604 +949040795 1266013203 61140343 +2146011658 2793621589 110265098 +525510412 2618124082 65155719 +2977122301 3122211455 179751286 +3885825304 713560214 409141992 +1081017627 4124851079 88319317 +590666131 2039951828 38597255 +3596454634 1981772613 58179215 +2256276756 2078549083 315165891 +1639631621 1122702206 143310997 +2858399301 1327153546 118723000 +3654633849 3301962741 72039868 +749412925 3549292249 161128796 +1412026207 541983534 151190298 +1054901322 4268850991 26116305 +1829368778 3374002609 175289640 +1216013115 2570979253 47144829 +2806900243 3070712397 51499058 +1563216505 3760425124 76415116 +1782942618 3710421045 29953038 +629263386 2903886687 120149539 +2060339013 3740374083 20051041 +3156873587 3836840240 52553243 +2693038006 4010988842 113862237 +3726673717 2411827666 159151587 +2004658418 4213170396 55680595 +1812895656 525510412 16473122 +1010181138 2748901405 44720184 +910541721 693173832 20386382 +930928103 2393714974 18112692 +3209426830 1594744809 387027804 +2571442647 3889393483 121595359 + +water-to-light map: +555269773 2142838063 230952411 +2879443939 2889030006 80512763 +192641991 2686257040 106620606 +786222184 967781117 56662479 +3467110983 4162792381 132174915 +1955778230 0 505352386 +2461130616 1138855522 99691153 +1436321461 1403321335 440861327 +2625559119 1024443596 104825859 +1255310011 2792877646 96152360 +1877182788 697994377 78595442 +3732975066 3467110983 374194949 +842884663 2373790474 56459390 +299262597 2430249864 256007176 +3599285898 3841305932 133689168 +4107170015 3974995100 187797281 +0 505352386 192641991 +1090535351 1238546675 164774660 +2959956702 1129269455 9586067 +1351462371 1844182662 84859090 +2730384978 1929041752 149058961 +899344053 776589819 191191298 +2560821769 2078100713 64737350 + +light-to-temperature map: +4103141199 3912772142 105835099 +1994281004 833968687 112844016 +4208976298 1124841590 85990998 +3756966983 4018607241 111390720 +3868357703 1907239336 234783496 +2368591640 1210832588 293667703 +882426579 2320467318 1111854425 +3064998388 717457244 33489309 +3578938096 946812703 178028887 +2107125020 750946553 83022134 +3157760738 3432321743 421177358 +717457244 4129997961 164969335 +2190147154 2142022832 178444486 +3098487697 3853499101 59273041 +2662259343 1504500291 402739045 + +temperature-to-humidity map: +0 1820412620 129662806 +613828383 2855382935 55943394 +4004726464 3519717349 290240832 +769767991 99996214 1720416406 +3126066249 3043992795 475724554 +2490184397 2434241003 421141932 +129662806 1950075426 484165577 +689805485 0 79962506 +669771777 79962506 20033708 +3601790803 3809958181 402935661 +3043992795 4212893842 82073454 + +humidity-to-location map: +1305211417 3371927062 89487200 +947159122 0 358052295 +324330151 2021970861 8067408 +332397559 654359706 174171341 +506568900 3311893445 60033617 +11065691 828531047 45586147 +3556729147 369117986 26689998 +3583419145 395807984 258551722 +2356886904 984938593 400606547 +1394698617 874117194 110821399 +566602517 3946624826 164852367 +2998901322 2301963630 256425441 +0 358052295 11065691 +3331964991 3087129289 34908052 +1505520016 2106676497 195287133 +56651838 2819450976 267678313 +3366873043 3293025783 18867662 +3385740705 3122037341 170988442 +2281795782 2799796942 19654034 +2301449816 1966533773 55437088 +3992934054 3677118500 118543139 +3255326763 2030038269 76638228 +3849868384 3803559156 143065670 +2757493451 2558389071 241407871 +3841970867 3795661639 7897517 +1700807149 1385545140 580988633 +731454884 3461414262 215704238 diff --git a/inputs/5-test1 b/inputs/5-test1 new file mode 100644 index 0000000..f756727 --- /dev/null +++ b/inputs/5-test1 @@ -0,0 +1,33 @@ +seeds: 79 14 55 13 + +seed-to-soil map: +50 98 2 +52 50 48 + +soil-to-fertilizer map: +0 15 37 +37 52 2 +39 0 15 + +fertilizer-to-water map: +49 53 8 +0 11 42 +42 0 7 +57 7 4 + +water-to-light map: +88 18 7 +18 25 70 + +light-to-temperature map: +45 77 23 +81 45 19 +68 64 13 + +temperature-to-humidity map: +0 69 1 +1 0 69 + +humidity-to-location map: +60 56 37 +56 93 4