this repo has no description

2024 day 10

hauleth.dev 987d2410 4e0ad565

verified
Changed files
+218
2024
+218
2024/day10.livemd
··· 1 + <!-- livebook:{"persist_outputs":true} --> 2 + 3 + # Day 10 4 + 5 + ```elixir 6 + Mix.install([:kino_aoc]) 7 + ``` 8 + 9 + ## Section 10 + 11 + <!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiIxMCIsInNlc3Npb25fc2VjcmV0IjoiQURWRU5UX09GX0NPREVfU0VTU0lPTiIsInllYXIiOiIyMDI0In0","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} --> 12 + 13 + ```elixir 14 + {:ok, puzzle_input} = 15 + KinoAOC.download_puzzle("2024", "10", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 16 + ``` 17 + 18 + <!-- livebook:{"output":true} --> 19 + 20 + ``` 21 + {:ok, 22 + "543067650323210321032110356789890110710189878760134567\n612148941212306782345091235410765227893258759651021298\n701238932301456798106787549323454336794567549842330807\n898547215450589867287654678892961245987654456732498910\n987656306769678956398013234781870301256003301201567821\n234543215878760145478920105690210982340112210341056932\n109650124981232230569834124567345673451234985452347845\n018744323890341021656765033438454589298545676701037796\n199803210787650110765017842129823672107655677812378987\n785012345654789541874326956010510563201234389983405676\n174321498723498632903455467173421454102348210234514430\n065430239014323721212762398982567876218959650149623521\n145540128765017890101871081071018967327968743898734678\n236692134984178768718981012567894458456876212798604329\n987783005673269659654108923458763349663212108789015012\n896654012562154546743267830309854218767103419276126787\n765780123473043432890154321212903109878756578125435698\n434099874984012301740125654567812893469017647030165556\n323101065765101787434436763058906732154178736543256765\n013298187890678696325569892143215440043289128954343894\n010367296541549045016678765014300351234567037760012983\n329458305032132134787867410967891267653438546891898012\n458789414145010120196986323898763298344129655432743210\n567076523236678743285898456777654101201098766653658901\n456167654107549658374567689985403100312434985567877014\n343228943298938569843210576876312238920125676656986323\n651014543498127478755765435410278947437876985543235434\n743223672567078369876890324320127656506987234350145632\n894102981089569232125981210451256543215432122341076541\n765091234676352101034674323401237894101341001456789830\n014780365445443032126501012532345743103210112565898321\n123689876034321145098432107645236743254101101876543210\n094545763125210056788943258896107858969010332987674301\n785430432106782169877652349787567967678321245696784561\n876021569045893458965601654343478914565414326781093870\n987109878010432167014298710234323901258905015492012901\n789219894324569052123109620123217892109876012323458692\n654308765543678743013234538994106543010870965410069783\n789877787632189852101110145885287676521961871012178654\n034565896601087601211001406776896789437652676523468743\n121053795542194512389132312345445676548943989430549012\n262342187634765433498545434531230107401232104321678298\n876533014123892324567696526540043298340981010780890187\n983414523016101019876587017832134781256672125690743296\n032101654327892100345678789901295690764543434321652345\n123089789236743981234589654800387789835678987787601336\n854176590187656876104310343211456876544549016098543223\n965765410194545675465231230898565963233432145123210112\n876894321243232980370110141767653210112321039654101101\n146765232100101061289879852632154100203410128789210322\n036787103761267876518768763543069911012543454376325412\n123498654854356987405650654985678892327632567215436701\n210567569983543292314321569876301765438761078904589898\n325456478754330101223433478765432654349652987615678765"} 23 + ``` 24 + 25 + ```elixir 26 + map = 27 + for {row, y} <- puzzle_input |> String.split("\n", trim: true) |> Enum.with_index(), 28 + {h, x} <- row |> String.to_charlist() |> Enum.with_index(), 29 + into: %{}, 30 + do: {{x, y}, h - ?0} 31 + ``` 32 + 33 + <!-- livebook:{"output":true} --> 34 + 35 + ``` 36 + %{ 37 + {37, 47} => 3, 38 + {38, 2} => 4, 39 + {1, 26} => 5, 40 + {32, 15} => 4, 41 + {35, 30} => 3, 42 + {37, 53} => 4, 43 + {4, 5} => 4, 44 + {8, 50} => 3, 45 + {11, 39} => 1, 46 + {22, 38} => 1, 47 + {20, 41} => 8, 48 + {29, 25} => 6, 49 + {29, 26} => 0, 50 + {47, 27} => 0, 51 + {31, 42} => 4, 52 + {9, 34} => 0, 53 + {47, 38} => 2, 54 + {20, 3} => 7, 55 + {47, 44} => 1, 56 + {22, 37} => 3, 57 + {22, 36} => 0, 58 + {45, 7} => 7, 59 + {19, 38} => 0, 60 + {27, 21} => 9, 61 + {9, 33} => 1, 62 + {26, 41} => 4, 63 + {52, 42} => 8, 64 + {21, 35} => 2, 65 + {42, 8} => 6, 66 + {19, 22} => 9, 67 + {16, 10} => 3, 68 + {21, 45} => 5, 69 + {11, 8} => 7, 70 + {26, 21} => 0, 71 + {21, 48} => 1, 72 + {50, 40} => 9, 73 + {10, 25} => 9, 74 + {11, 19} => 0, 75 + {16, 38} => 5, 76 + {35, 15} => 8, 77 + {37, 15} => 6, 78 + {35, 26} => 7, 79 + {28, 20} => 1, 80 + {45, 19} => 9, 81 + {27, 22} => 8, 82 + {16, 24} => 5, 83 + {6, 18} => 0, 84 + {10, 32} => 2, 85 + {32, ...} => 8, 86 + {...} => 7, 87 + ... 88 + } 89 + ``` 90 + 91 + ```elixir 92 + starts = Enum.filter(map, fn {_, elev} -> elev == 0 end) 93 + ``` 94 + 95 + <!-- livebook:{"output":true} --> 96 + 97 + ``` 98 + [ 99 + {{38, 5}, 0}, 100 + {{24, 7}, 0}, 101 + {{11, 35}, 0}, 102 + {{3, 9}, 0}, 103 + {{15, 36}, 0}, 104 + {{41, 32}, 0}, 105 + {{51, 14}, 0}, 106 + {{51, 24}, 0}, 107 + {{5, 12}, 0}, 108 + {{4, 35}, 0}, 109 + {{40, 4}, 0}, 110 + {{46, 4}, 0}, 111 + {{22, 30}, 0}, 112 + {{27, 12}, 0}, 113 + {{7, 4}, 0}, 114 + {{24, 43}, 0}, 115 + {{31, 20}, 0}, 116 + {{29, 42}, 0}, 117 + {{29, 9}, 0}, 118 + {{10, 2}, 0}, 119 + {{0, 20}, 0}, 120 + {{15, 20}, 0}, 121 + {{14, 0}, 0}, 122 + {{42, 48}, 0}, 123 + {{40, 15}, 0}, 124 + {{43, 14}, 0}, 125 + {{19, 2}, 0}, 126 + {{14, 22}, 0}, 127 + {{34, 35}, 0}, 128 + {{38, 42}, 0}, 129 + {{23, 5}, 0}, 130 + {{0, 11}, 0}, 131 + {{44, 11}, 0}, 132 + {{15, 30}, 0}, 133 + {{17, 44}, 0}, 134 + {{31, 32}, 0}, 135 + {{48, 28}, 0}, 136 + {{21, 39}, 0}, 137 + {{49, 13}, 0}, 138 + {{29, 45}, 0}, 139 + {{4, 37}, 0}, 140 + {{53, 31}, 0}, 141 + {{45, 46}, 0}, 142 + {{43, 29}, 0}, 143 + {{8, 0}, 0}, 144 + {{47, 42}, 0}, 145 + {{7, 14}, 0}, 146 + {{52, ...}, 0}, 147 + {{...}, ...}, 148 + {...}, 149 + ... 150 + ] 151 + ``` 152 + 153 + ```elixir 154 + defmodule Trail do 155 + def traverse(start, map), do: MapSet.new(traverse(start, map, [])) 156 + 157 + defp traverse({curr, 9}, _map, acc), do: [[{curr, 9} | acc]] 158 + defp traverse({curr, elev}, map, acc) do 159 + curr 160 + |> surroundings() 161 + |> then(&Map.take(map, &1)) 162 + |> Enum.filter(fn {_, h} -> elev + 1 == h end) 163 + |> Enum.flat_map(&traverse(&1, map, [{curr, elev} | acc])) 164 + end 165 + 166 + defp surroundings({x, y}) do 167 + [ 168 + {x, y - 1}, 169 + {x - 1, y}, 170 + {x, y + 1}, 171 + {x + 1, y} 172 + ] 173 + end 174 + end 175 + ``` 176 + 177 + <!-- livebook:{"output":true} --> 178 + 179 + ``` 180 + {:module, Trail, <<70, 79, 82, 49, 0, 0, 11, ...>>, {:surroundings, 1}} 181 + ``` 182 + 183 + ## Part 1 184 + 185 + ```elixir 186 + starts 187 + |> Enum.map(fn start -> 188 + Trail.traverse(start, map) 189 + |> MapSet.new(&hd/1) 190 + |> MapSet.size() 191 + end) 192 + |> Enum.sum() 193 + ``` 194 + 195 + <!-- livebook:{"output":true} --> 196 + 197 + ``` 198 + 733 199 + ``` 200 + 201 + ## Section 202 + 203 + ```elixir 204 + starts 205 + |> Enum.map(fn start -> 206 + Trail.traverse(start, map) 207 + |> MapSet.size() 208 + end) 209 + |> Enum.sum() 210 + ``` 211 + 212 + <!-- livebook:{"output":true} --> 213 + 214 + ``` 215 + 1514 216 + ``` 217 + 218 + <!-- livebook:{"offset":6605,"stamp":{"token":"XCP.68U6SzidJCV7il26kiMv6z5qLEx_50_v2V7x6LqV9t8LQG1-aShVMNE1DEgCj9SwpKOn02np0aeSu5T1parIYMF9MeWGGfqP-oc4UGnDiDGDtJ5RGqdwcxcPjuPUQmCtZj0","version":2}} -->