From d1874405b3d65481ef40ebe17067716de92ae0ad Mon Sep 17 00:00:00 2001 From: Guido Schweizer Date: Sun, 10 Dec 2023 21:14:45 +0100 Subject: [PATCH] day5 --- day_5/data | 245 ++++++++++++++++++++++++++++++++++++++++++++++++ day_5/impl.rb | 50 ++++++++++ day_5/impl_2.rb | 109 +++++++++++++++++++++ day_5/run.rb | 24 +++++ day_5/test.rb | 59 ++++++++++++ 5 files changed, 487 insertions(+) create mode 100644 day_5/data create mode 100644 day_5/impl.rb create mode 100644 day_5/impl_2.rb create mode 100644 day_5/run.rb create mode 100644 day_5/test.rb diff --git a/day_5/data b/day_5/data new file mode 100644 index 0000000..845b4df --- /dev/null +++ b/day_5/data @@ -0,0 +1,245 @@ +seeds: 3037945983 743948277 2623786093 391282324 195281306 62641412 769611781 377903357 2392990228 144218002 1179463071 45174621 2129467491 226193957 1994898626 92402726 1555863421 340215202 426882817 207194644 + +seed-to-soil map: +3078006360 2182201339 30483272 +803630304 624445326 165226844 +2393736333 2745251526 281120946 +717936870 789672170 85693434 +598717319 410599330 27984688 +3999095007 2024628810 157572529 +3605588191 3026372472 22322803 +3555659576 2678166775 3396919 +968857148 438584018 1780307 +3216227818 2212684611 87459567 +2302084376 4122083708 91651957 +970637455 0 188112122 +507182228 299146916 40412346 +1372302034 1689624457 202945009 +1370123632 191483770 2178402 +324787204 193662172 105484744 +3116425470 2671328191 6838584 +626702007 875365604 82756204 +1575247043 978774853 317322423 +3134996187 4213735665 81231631 +2024628810 2681563694 63687832 +714565222 188112122 3371648 +547594574 1620884480 51122745 +3529388087 3374604163 26271489 +709458211 973428243 5107011 +2713008276 3985570976 98361735 +2088316642 3048695275 213767734 +3627910994 2300144178 371184013 +2674857279 4083932711 38150997 +1229789645 958121808 15306435 +4156667536 3328662676 45941487 +0 1296097276 324787204 +3108489632 3320726838 7935838 +4202609023 3667512001 92358273 +1352266801 978535254 239599 +1352506400 1672007225 17617232 +1245096080 440364325 107170721 +2811370011 3400875652 266636349 +430271948 547535046 76910280 +1158749577 339559262 71040068 +3559056495 3262463009 46531696 +3123264054 3308994705 11732133 +3303687385 3759870274 225700702 + +soil-to-fertilizer map: +2937874770 2957653952 339980892 +1886469734 2145122669 192293654 +3277855662 822424488 19779182 +2622882196 2393077006 314992574 +3449876679 3769116301 525850995 +583550735 842203670 1302918999 +2145755543 345297835 477126653 +2078763388 2890661797 66992155 +2650514 2708069580 182592217 +0 2337416323 2650514 +530540566 2340066837 53010169 +185242731 0 345297835 +3975727674 3449876679 319239622 + +fertilizer-to-water map: +861477134 5168332 68211907 +136969509 2229711837 29094441 +2823248929 1150509810 118368045 +3678888284 3073610919 53498438 +3948051821 3682691325 96234592 +1302827191 2387840795 504257794 +1198743248 1926818347 104083943 +1807084985 1104177008 46332802 +2143096098 619653304 259805223 +2063436946 2385211148 2629647 +2066066593 445026117 35759449 +358008423 537865723 81787581 +621204445 0 5168332 +2724438904 1861632296 65186051 +1853417787 2258806278 126404870 +3933311080 4141091197 14740741 +851739278 2892098589 9737856 +4044286413 3029323079 44287840 +1979822657 1778018007 83614289 +2101826042 2084781230 3070511 +4088574253 4268409625 26557671 +929689041 111346117 211974050 +3566310597 4155831938 112577687 +439796004 2030902290 53878940 +166063950 1490707297 191944473 +8760514 888219041 128208995 +3794695843 3778925917 57203243 +3029323079 3127109357 409045756 +2792635116 77722143 30613813 +3438368835 4013149435 127941762 +3732386722 3620382204 62309121 +2402901321 1682651770 95366237 +0 879458527 8760514 +493674944 2901836445 39780529 +3851899086 3536155113 81411994 +2498267558 1268877855 221829442 +4117947021 3836129160 177020275 +2789624955 108335956 3010161 +1141663091 480785566 57080157 +2104896553 406826572 38199545 +533455473 1016428036 87748972 +626372777 2087851741 141860096 +2720097000 73380239 4341904 +4115131924 3617567107 2815097 +768232873 323320167 83506405 + +water-to-light map: +3846882465 367033980 98093832 +1878565977 3292746518 62917983 +4255729420 661438934 39237876 +469590509 2191298319 301681796 +381948234 1999013894 87642275 +3688496086 199351627 156562666 +1300818753 2086656169 104642150 +806539912 2798447654 224466318 +1265336919 355914293 11119687 +1405460903 1914042148 28882526 +2577391070 1942924674 56089220 +3680239306 4136990116 8256780 +1941483960 700676810 607954854 +3845058752 3022913972 1823713 +4239658038 1308631664 16071382 +2566162195 4254580741 11228875 +1671792383 3831845903 10462472 +3944976297 3842308375 294681741 +3290662499 3160062910 132683608 +2549438814 1324703046 16723381 +3423346107 1341426427 27108304 +1031006230 3355664501 234330689 +1276456606 4145246896 24362147 +3450454411 54538430 144813197 +1682254855 465127812 196311122 +54538430 1403802338 272790856 +2633480290 2492980115 305467539 +3595267608 4169609043 84971698 +3242064105 3644614138 48598394 +3077581200 4265809616 29157680 +771272305 1368534731 35267607 +1434343429 1676593194 237448954 +327329286 3589995190 54618948 +3106738880 3024737685 135325225 +2938947829 3693212532 138633371 + +light-to-temperature map: +2777813298 2971073270 586210802 +1687968665 0 334152507 +4159107034 3882460035 135860262 +0 2095520416 192800212 +3640671099 3557284072 3145370 +2455782705 3560429442 322030593 +2022121172 1272848785 266199456 +773517036 914869331 357979454 +1131496490 1539048241 556472175 +3364024100 4018320297 60669366 +3643816469 2455782705 515290565 +192800212 334152507 580716824 +3424693466 4078989663 215977633 + +temperature-to-humidity map: +4072523312 605654847 17750681 +1174610018 540191835 65463012 +2038455907 3792024734 100202248 +2539396783 866566556 128459181 +96342672 2296045868 14715058 +3827330744 1522255720 106701221 +3816190028 4081148893 11140716 +1706101724 3892226982 188921911 +3780839952 623405528 35350076 +765616949 1813669629 408993069 +4225769488 3778728770 13295964 +2752105545 1645897858 167771771 +2138658155 1121517092 400738628 +4239065452 4155853973 55901844 +3934031965 96342672 35726394 +3005272654 658755604 22724553 +3989311833 4211755817 83211479 +280430452 3186777866 320785315 +111057730 2310760926 65268270 +176326000 3659551759 104104452 +1895023635 1628956941 16940917 +4093334384 3507563181 132435104 +3027997207 132069066 179421352 +1477400307 311490418 228701417 +2934949875 2225723089 70322779 +601215767 681480157 100836818 +2919877316 3763656211 15072559 +3969758359 3639998285 19553474 +3207418559 2613356473 573421393 +4090273993 2222662698 3060391 +1911964552 995025737 126491355 +2667855964 782316975 84249581 +1240073030 2376029196 237327277 +702052585 4092289609 63564364 + +humidity-to-location map: +2848734682 2982177676 22285660 +3380476660 3717224958 24199873 +3201930685 734568132 100088122 +764851360 4087339561 71173655 +188169313 2953711255 28466421 +3189375901 2832231336 12554784 +3369909102 47909639 10567558 +47909639 3741424831 99762378 +2871020342 58477197 7400020 +3042878026 3409715295 146497875 +1196348942 2734551883 97679453 +3418711171 3387790447 21924848 +1587973141 573552831 65833150 +1121006696 889063447 75342246 +1294028395 567796360 5756471 +3302018807 499906065 67890295 +2915035031 2921050411 32660844 +1982422286 3064299481 301982155 +704786709 4084864539 2475022 +299076626 834656254 54407193 +3623423724 2182055199 207702290 +388851709 2881400789 39649622 +147672017 3592293988 40497296 +2947695875 639385981 95182151 +707261731 3556213170 36080818 +2284404441 2389757489 138657919 +353483819 2146687309 35367890 +2519626540 441189704 58319568 +743342549 3366281636 21508811 +2878420362 2844786120 36614669 +216635734 4212526404 82440892 +3440636019 1235194267 182787705 +2577946108 964405693 270788574 +1453221956 3877915244 70435137 +836025015 1861705628 284981681 +1299784866 499509272 396793 +1859942766 3948350381 122479520 +2423062360 3004463336 59836145 +3404676533 4070829901 14034638 +1399208768 4158513216 54013188 +1300181659 342162595 99027109 +1523657093 3652908910 64316048 +3851243640 1417981972 443723656 +3831126014 3632791284 20117626 +1653806291 2528415408 206136475 +428501331 65877217 276285378 +2482898505 3841187209 36728035 \ No newline at end of file diff --git a/day_5/impl.rb b/day_5/impl.rb new file mode 100644 index 0000000..5f1ad5f --- /dev/null +++ b/day_5/impl.rb @@ -0,0 +1,50 @@ +#prepare the input which is a string containing new lines +def parse(input) + data = [] + map = [] + input.each_line do |line| + if data.empty? + data << line.split(":").last.split(" ").map(&:to_i) + next + end + if line.include?(":") && !map.empty? + puts map + data << map + map = [] + next + end + next if line.include?(":") + next if line.strip.empty? + # build the map + target,source,ranges = line.split(" ").map(&:to_i) + diff = target-source + map << [source,ranges,diff] + end + data << map + data +end + +# result should a single string or integer +def calculate(data) + seeds = nil + data.each do |d| + if seeds.nil? + seeds = d + next + end + # start mapping + new_seeds = seeds.map do |seed| + mapped = seed + d.each do |mapping| + source,ranges,diff = mapping + if source <= seed && seed <= source + ranges + mapped = seed + diff + break + end + end + mapped + end + seeds = new_seeds + end + seeds.min +end diff --git a/day_5/impl_2.rb b/day_5/impl_2.rb new file mode 100644 index 0000000..0f299ef --- /dev/null +++ b/day_5/impl_2.rb @@ -0,0 +1,109 @@ +#prepare the input which is a string containing new lines +def parse(input) + data = [] + map = [] + input.each_line do |line| + if data.empty? + seed_ranges = [] + seeds = line.split(":").last.split(" ").map(&:to_i) + (seeds.length/2).times do |i| + seed_ranges << [seeds[2*i],seeds[2*i+1]] + end + data << seed_ranges + next + end + if line.include?(":") && !map.empty? + data << map + map = [] + next + end + next if line.include?(":") + next if line.strip.empty? + # build the map + target,source,ranges = line.split(" ").map(&:to_i) + diff = target-source + map << [source,ranges,diff] + end + data << map + data +end + +# result should a single string or integer +def calculate(data) + seeds = nil + data.each do |d| + if seeds.nil? + seeds = d + next + end + # start mapping + i=0 + d.each do |mapping| + new_seeds = [] + map_start,map_range,diff = mapping + map_end = map_start + map_range -1 + + puts "map: #{map_start}--#{map_end} doing #{diff}" + seeds.each do |seed_pair| + seed_start,seed_range = seed_pair + seed_end = seed_start+seed_range + + # <---|---|---> + if seed_start <= map_start && map_end <= seed_end + puts "<---|---|--->" + new_seed_start = seed_start + new_seed_range = map_start - seed_start + additional_start = map_start + diff + additional_range = map_end - map_start + third_start = map_end + third_end = seed_end - map_end + new_seeds << [new_seed_start,new_seed_range] + new_seeds << [additional_start,additional_range] + new_seeds << [third_start,third_end] + next + end + + # |---<---|---> + if map_start <= seed_start && map_end >= seed_start && map_end <= seed_end + puts "|---<---|--->" + new_seed_start = seed_start + diff + new_seed_range = map_end - seed_start + additional_start = map_end + additional_range = seed_end - map_end + new_seeds << [new_seed_start,new_seed_range] + new_seeds << [additional_start,additional_range] + next + end + + # <---|--->---| + if seed_start <= map_start && seed_end >= map_start && seed_end <= map_end + puts "<---|--->---|" + new_seed_start = seed_start + new_seed_range = map_start - seed_start + additional_start = map_start + diff + additional_range = seed_end - map_start + new_seeds << [new_seed_start,new_seed_range] + new_seeds << [additional_start,additional_range] + next + end + # |---<-->---| + if map_start <= seed_start && seed_end <= map_end + puts "|---<-->---|" + new_seed_start = seed_start + diff + new_seed_range = seed_range + new_seeds << [new_seed_start,new_seed_range] + next + end + + # else + new_seeds << seed_pair + end + pp new_seeds + seeds = new_seeds + end + break if i==1 + i+=1 + end + seeds = seeds.map{|seed_pair| seed_pair[0]} + seeds.min +end diff --git a/day_5/run.rb b/day_5/run.rb new file mode 100644 index 0000000..a10726f --- /dev/null +++ b/day_5/run.rb @@ -0,0 +1,24 @@ +if ARGV[0] == "2" + require_relative "impl_2" +else + require_relative "impl" +end + + +def print(result) + if result.is_a? Array + result.map! {|l| "#{l}\n" } + end + + puts result +end + +def run + puts "running your implementation" + input = File.new("day_5/data").read + data = parse(input) + result = calculate(data) + print(result) +end + +run diff --git a/day_5/test.rb b/day_5/test.rb new file mode 100644 index 0000000..93bff85 --- /dev/null +++ b/day_5/test.rb @@ -0,0 +1,59 @@ +if ARGV[0] == "2" + require_relative "impl_2" + RESULT = 46 +else + require_relative "impl" + RESULT = 35 +end + + +INPUT = <<~IN +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 +IN + +def test_example + parsed = parse(INPUT) + result = calculate(parsed) + + if result == RESULT + puts "Test successful. Now run with real input" + puts "ruby day_5/run.rb #{ARGV[0]}" + else + puts "Test failed" + puts "expected \"#{RESULT}\" got \"#{result}\"" + end +end + +test_example