this repo has no description
at master 14 kB view raw
1<!-- livebook:{"persist_outputs":true} --> 2 3# Day 04 4 5```elixir 6Mix.install([:kino_aoc]) 7``` 8 9## Section 10 11<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiI0Iiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjAifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} --> 12 13```elixir 14{:ok, puzzle_input} = 15 KinoAOC.download_puzzle("2020", "4", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 16``` 17 18<!-- livebook:{"output":true} --> 19 20``` 21{:ok, 22 "hcl:#6b5442 ecl:brn iyr:2019\npid:637485594 hgt:171cm\neyr:2021 byr:1986\n\neyr:2025 iyr:1938 byr:2014 hcl:#341e13\nhgt:66cm\npid:70195175\n\nhcl:#efcc98\niyr:2011 ecl:hzl\neyr:2020 hgt:174cm pid:589700330\n\nhcl:#bba027 eyr:2027 cid:54\necl:brn pid:153cm\niyr:2028 hgt:173cm\nbyr:2004\n\nhcl:b45cec\niyr:2011 ecl:oth hgt:185cm eyr:2029 pid:178cm\n\nhgt:185cm iyr:2016 eyr:2029 hcl:#888785 pid:026540921\n\neyr:2025\nhcl:6962f7 byr:2015 ecl:oth iyr:1974\nhgt:191cm\npid:2616015\n\npid:268398556 iyr:2019 ecl:grn\neyr:2027 byr:1951 hcl:#18171d hgt:67cm\n\neyr:2029 hgt:153cm ecl:brn pid:183179186 byr:2013 hcl:#623a2f\niyr:1957\n\ncid:121 iyr:1922 hcl:752fbc pid:79577560 byr:2025\nhgt:61cm eyr:1971\n\niyr:2016\neyr:2024 hcl:#18171d hgt:184cm\necl:hzl byr:1992 pid:751161201\n\neyr:2021 ecl:blu byr:1938 iyr:2016 hcl:#b6652a pid:313406514 hgt:191cm\n\nhcl:#623a2f eyr:2021\necl:brn\npid:145249653 hgt:167cm iyr:2019 byr:1991\n\niyr:2022 pid:175cm\nbyr:2021 eyr:2027 ecl:#f615b1\nhgt:172in hcl:#ceb3a1\n\nhgt:173in\necl:#0cba5e pid:1885981567 iyr:1968\nbyr:1952\neyr:1942\n\necl:oth eyr:2023 hgt:65cm pid:521737908 byr:1971 hcl:z iyr:2017\n\nbyr:1936\nhcl:#cfa07d\necl:brn iyr:2011 pid:589047874\neyr:2025\n\nhcl:#fffffd\npid:912552538\ncid:159 hgt:160cm iyr:2012\neyr:2023 ecl:hzl\nbyr:1946\n\niyr:2015\necl:amb hgt:72in\ncid:59 pid:782818257 hcl:#18171d eyr:2026\nbyr:1952\n\nhgt:173cm iyr:2018 cid:96 ecl:amb byr:1986 pid:783160698 eyr:2026\nhcl:#602927\n\nhcl:#a97842 cid:199 pid:912273414 eyr:2030\nhgt:171cm ecl:hzl iyr:2011 byr:1960\n\necl:amb hgt:156cm\niyr:2013\nhcl:#ceb3a1\ncid:116 pid:567057004 byr:1942\neyr:2029\n\necl:#cddc40\npid:045090966 cid:254\nhgt:75in hcl:#733820 eyr:2026 byr:1956\niyr:2015\n\npid:156cm\neyr:2040\nhgt:176cm ecl:#02e67d hcl:b7c0e6\niyr:1959 cid:129 byr:2022\n\nhgt:160cm byr:1933\necl:blu eyr:2029 iyr:2012 hcl:#888785 pid:028571975\n\niyr:2017\nhcl:#390f37 hgt:171cm ecl:brn byr:1931 pid:015365720 eyr:2030\n\niyr:2014 pid:697057757\neyr:2026 hgt:188cm\necl:gry byr:1926\n\npid:484310015 hcl:#fffffd hgt:150cm iyr:2018\ncid:53 ecl:gry eyr:2021 byr:1957\n\nhgt:156cm\neyr:2026 byr:1963\npid:063272603 ecl:brn iyr:2011\nhcl:#888785\n\nbyr:1955 pid:310518398 hgt:191cm iyr:2018\necl:oth eyr:2023 cid:132 hcl:#888785\n\nbyr:1938 hcl:#623a2f eyr:2023\niyr:2010\nhgt:165cm\npid:170304863\ncid:290 ecl:amb\n\neyr:2026\npid:021468065 hgt:164cm\nbyr:1996 iyr:2016 hcl:#18171d\necl:brn\n\nbyr:2027 ecl:oth pid:8258823391 hgt:153in hcl:#733820 eyr:1948\n\nbyr:2026 ecl:#cd275a iyr:2012 eyr:2036 pid:5917499975\n\nbyr:2004\ncid:151\nhcl:99ecb1\neyr:2033 pid:871137711 iyr:1997\nhgt:184cm ecl:oth\n\nbyr:2011\nhcl:z ecl:#eee1d2 hgt:59cm eyr:1925 iyr:2030 pid:#02ee78\n\npid:742658992\nhcl:#888785\nbyr:1995\neyr:2024 hgt:162cm iyr:2013 cid:169 ecl:gry\n\nhgt:152cm byr:1946\neyr:2027 iyr:2018\npid:352799678\nhcl:#238da0\necl:amb\ncid:71\n\nhcl:#623a2f pid:723616064 eyr:2021\nhgt:172cm\nbyr:1926 iyr:2013\necl:grn\n\niyr:2019 hgt:94 byr:2028 eyr:1986\npid:#ee7f00\n\necl:amb\neyr:2027 pid:188153423 byr:1957 hcl:#d67ae1\niyr:2011 hgt:183cm\n\nbyr:1950 ecl:#e2495d iyr:2010 hgt:166cm eyr:2034 pid:151457075\n\neyr:1981\nbyr:2016 iyr:2029 pid:153cm ecl:#55c2a4 hcl:z\nhgt:76cm\n\nhgt:184cm ecl:amb eyr:2021\nhcl:#623a2f\npid:414607669 iyr:1960 byr:2002\n\neyr:2027 iyr:2020 hgt:179cm byr:1991\npid:969568248\necl:blu\n\nhgt:175cm pid:536803427 hcl:#a97842 iyr:2012\necl:grn byr:1950 eyr:2027\n\neyr:2028 hgt:60in hcl:#733820 iyr:2018 ecl:oth pid:871909483\nbyr:1930\n\nhgt:155cm iyr:2020 byr:1960 eyr:2021\npid:515710074 ecl:amb hcl:#341e13\n\nbyr:1922 hcl:z iyr:1977 ecl:brn\neyr:2023 hgt:119 pid:865700639\n\necl:gry hcl:959fcd pid:#633ac1\nbyr:2011 hgt:68in\neyr:2020\n\niyr:1972 hcl:z cid:149 byr:2020\nhgt:166in pid:4548657 eyr:1960\necl:#cc987c\n\neyr:2023 hcl:#b6652a iyr:2015\nhgt:187in pid:547953710 byr:1979 ecl:grn\n\niyr:2018\npid:508691429 ecl:oth eyr:2025 hgt:187cm cid:270\nhcl:#888785 byr:1977\n\nhgt:168cm eyr:2032 byr:2020\necl:gry iyr:1982\nhcl:z pid:648015564\n\nhcl:#fffffd pid:911858643 iyr:2016 ecl:gry eyr:2030 byr:1992 hgt:156cm\n\npid:241562994 eyr:2026 ecl:grn hgt:164cm\nhcl:#c0946f byr:1945 iyr:2015 cid:296\n\nbyr:1976 pid:269322775 ecl:hzl\nhgt:162cm hcl:#b6652a\neyr:2022 cid:335 iyr:2012\n\neyr:2028\nhgt:106\npid:268626219 hcl:#a97842\niyr:2011\necl:grn byr:" <> ...} 23``` 24 25```elixir 26passports = 27 puzzle_input 28 |> String.split("\n\n", trim: true) 29 |> Enum.map(fn passport -> 30 passport 31 |> String.split(~r/\s/, trim: true) 32 |> Map.new(fn <<key::3-binary, ":", data::binary>> -> 33 {key, data} 34 end) 35 end) 36``` 37 38<!-- livebook:{"output":true} --> 39 40``` 41[ 42 %{ 43 "byr" => "1986", 44 "ecl" => "brn", 45 "eyr" => "2021", 46 "hcl" => "#6b5442", 47 "hgt" => "171cm", 48 "iyr" => "2019", 49 "pid" => "637485594" 50 }, 51 %{ 52 "byr" => "2014", 53 "eyr" => "2025", 54 "hcl" => "#341e13", 55 "hgt" => "66cm", 56 "iyr" => "1938", 57 "pid" => "70195175" 58 }, 59 %{ 60 "ecl" => "hzl", 61 "eyr" => "2020", 62 "hcl" => "#efcc98", 63 "hgt" => "174cm", 64 "iyr" => "2011", 65 "pid" => "589700330" 66 }, 67 %{ 68 "byr" => "2004", 69 "cid" => "54", 70 "ecl" => "brn", 71 "eyr" => "2027", 72 "hcl" => "#bba027", 73 "hgt" => "173cm", 74 "iyr" => "2028", 75 "pid" => "153cm" 76 }, 77 %{ 78 "ecl" => "oth", 79 "eyr" => "2029", 80 "hcl" => "b45cec", 81 "hgt" => "185cm", 82 "iyr" => "2011", 83 "pid" => "178cm" 84 }, 85 %{"eyr" => "2029", "hcl" => "#888785", "hgt" => "185cm", "iyr" => "2016", "pid" => "026540921"}, 86 %{ 87 "byr" => "2015", 88 "ecl" => "oth", 89 "eyr" => "2025", 90 "hcl" => "6962f7", 91 "hgt" => "191cm", 92 "iyr" => "1974", 93 "pid" => "2616015" 94 }, 95 %{ 96 "byr" => "1951", 97 "ecl" => "grn", 98 "eyr" => "2027", 99 "hcl" => "#18171d", 100 "hgt" => "67cm", 101 "iyr" => "2019", 102 "pid" => "268398556" 103 }, 104 %{ 105 "byr" => "2013", 106 "ecl" => "brn", 107 "eyr" => "2029", 108 "hcl" => "#623a2f", 109 "hgt" => "153cm", 110 "iyr" => "1957", 111 "pid" => "183179186" 112 }, 113 %{ 114 "byr" => "2025", 115 "cid" => "121", 116 "eyr" => "1971", 117 "hcl" => "752fbc", 118 "hgt" => "61cm", 119 "iyr" => "1922", 120 "pid" => "79577560" 121 }, 122 %{ 123 "byr" => "1992", 124 "ecl" => "hzl", 125 "eyr" => "2024", 126 "hcl" => "#18171d", 127 "hgt" => "184cm", 128 "iyr" => "2016", 129 "pid" => "751161201" 130 }, 131 %{ 132 "byr" => "1938", 133 "ecl" => "blu", 134 "eyr" => "2021", 135 "hcl" => "#b6652a", 136 "hgt" => "191cm", 137 "iyr" => "2016", 138 "pid" => "313406514" 139 }, 140 %{ 141 "byr" => "1991", 142 "ecl" => "brn", 143 "eyr" => "2021", 144 "hcl" => "#623a2f", 145 "hgt" => "167cm", 146 "iyr" => "2019", 147 "pid" => "145249653" 148 }, 149 %{ 150 "byr" => "2021", 151 "ecl" => "#f615b1", 152 "eyr" => "2027", 153 "hcl" => "#ceb3a1", 154 "hgt" => "172in", 155 "iyr" => "2022", 156 "pid" => "175cm" 157 }, 158 %{ 159 "byr" => "1952", 160 "ecl" => "#0cba5e", 161 "eyr" => "1942", 162 "hgt" => "173in", 163 "iyr" => "1968", 164 "pid" => "1885981567" 165 }, 166 %{ 167 "byr" => "1971", 168 "ecl" => "oth", 169 "eyr" => "2023", 170 "hcl" => "z", 171 "hgt" => "65cm", 172 "iyr" => "2017", 173 "pid" => "521737908" 174 }, 175 %{ 176 "byr" => "1936", 177 "ecl" => "brn", 178 "eyr" => "2025", 179 "hcl" => "#cfa07d", 180 "iyr" => "2011", 181 "pid" => "589047874" 182 }, 183 %{ 184 "byr" => "1946", 185 "cid" => "159", 186 "ecl" => "hzl", 187 "eyr" => "2023", 188 "hcl" => "#fffffd", 189 "hgt" => "160cm", 190 "iyr" => "2012", 191 "pid" => "912552538" 192 }, 193 %{ 194 "byr" => "1952", 195 "cid" => "59", 196 "ecl" => "amb", 197 "eyr" => "2026", 198 "hcl" => "#18171d", 199 "hgt" => "72in", 200 "iyr" => "2015", 201 "pid" => "782818257" 202 }, 203 %{ 204 "byr" => "1986", 205 "cid" => "96", 206 "ecl" => "amb", 207 "eyr" => "2026", 208 "hcl" => "#602927", 209 "hgt" => "173cm", 210 "iyr" => "2018", 211 "pid" => "783160698" 212 }, 213 %{ 214 "byr" => "1960", 215 "cid" => "199", 216 "ecl" => "hzl", 217 "eyr" => "2030", 218 "hcl" => "#a97842", 219 "hgt" => "171cm", 220 "iyr" => "2011", 221 "pid" => "912273414" 222 }, 223 %{ 224 "byr" => "1942", 225 "cid" => "116", 226 "ecl" => "amb", 227 "eyr" => "2029", 228 "hcl" => "#ceb3a1", 229 "hgt" => "156cm", 230 "iyr" => "2013", 231 "pid" => "567057004" 232 }, 233 %{ 234 "byr" => "1956", 235 "cid" => "254", 236 "ecl" => "#cddc40", 237 "eyr" => "2026", 238 "hcl" => "#733820", 239 "hgt" => "75in", 240 "iyr" => "2015", 241 "pid" => "045090966" 242 }, 243 %{ 244 "byr" => "2022", 245 "cid" => "129", 246 "ecl" => "#02e67d", 247 "eyr" => "2040", 248 "hcl" => "b7c0e6", 249 "hgt" => "176cm", 250 "iyr" => "1959", 251 "pid" => "156cm" 252 }, 253 %{ 254 "byr" => "1933", 255 "ecl" => "blu", 256 "eyr" => "2029", 257 "hcl" => "#888785", 258 "hgt" => "160cm", 259 "iyr" => "2012", 260 "pid" => "028571975" 261 }, 262 %{ 263 "byr" => "1931", 264 "ecl" => "brn", 265 "eyr" => "2030", 266 "hcl" => "#390f37", 267 "hgt" => "171cm", 268 "iyr" => "2017", 269 "pid" => "015365720" 270 }, 271 %{ 272 "byr" => "1926", 273 "ecl" => "gry", 274 "eyr" => "2026", 275 "hgt" => "188cm", 276 "iyr" => "2014", 277 "pid" => "697057757" 278 }, 279 %{ 280 "byr" => "1957", 281 "cid" => "53", 282 "ecl" => "gry", 283 "eyr" => "2021", 284 "hcl" => "#fffffd", 285 "hgt" => "150cm", 286 "iyr" => "2018", 287 "pid" => "484310015" 288 }, 289 %{ 290 "byr" => "1963", 291 "ecl" => "brn", 292 "eyr" => "2026", 293 "hcl" => "#888785", 294 "hgt" => "156cm", 295 "iyr" => "2011", 296 "pid" => "063272603" 297 }, 298 %{ 299 "byr" => "1955", 300 "cid" => "132", 301 "ecl" => "oth", 302 "eyr" => "2023", 303 "hcl" => "#888785", 304 "hgt" => "191cm", 305 "iyr" => "2018", 306 "pid" => "310518398" 307 }, 308 %{ 309 "byr" => "1938", 310 "cid" => "290", 311 "ecl" => "amb", 312 "eyr" => "2023", 313 "hcl" => "#623a2f", 314 "hgt" => "165cm", 315 "iyr" => "2010", 316 "pid" => "170304863" 317 }, 318 %{ 319 "byr" => "1996", 320 "ecl" => "brn", 321 "eyr" => "2026", 322 "hcl" => "#18171d", 323 "hgt" => "164cm", 324 "iyr" => "2016", 325 "pid" => "021468065" 326 }, 327 %{ 328 "byr" => "2027", 329 "ecl" => "oth", 330 "eyr" => "1948", 331 "hcl" => "#733820", 332 "hgt" => "153in", 333 "pid" => "8258823391" 334 }, 335 %{"byr" => "2026", "ecl" => "#cd275a", "eyr" => "2036", "iyr" => "2012", "pid" => "5917499975"}, 336 %{ 337 "byr" => "2004", 338 "cid" => "151", 339 "ecl" => "oth", 340 "eyr" => "2033", 341 "hcl" => "99ecb1", 342 "hgt" => "184cm", 343 "iyr" => "1997", 344 "pid" => "871137711" 345 }, 346 %{ 347 "byr" => "2011", 348 "ecl" => "#eee1d2", 349 "eyr" => "1925", 350 "hcl" => "z", 351 "hgt" => "59cm", 352 "iyr" => "2030", 353 "pid" => "#02ee78" 354 }, 355 %{ 356 "byr" => "1995", 357 "cid" => "169", 358 "ecl" => "gry", 359 "eyr" => "2024", 360 "hcl" => "#888785", 361 "hgt" => "162cm", 362 "iyr" => "2013", 363 "pid" => "742658992" 364 }, 365 %{ 366 "byr" => "1946", 367 "cid" => "71", 368 "ecl" => "amb", 369 "eyr" => "2027", 370 "hcl" => "#238da0", 371 "hgt" => "152cm", 372 "iyr" => "2018", 373 "pid" => "352799678" 374 }, 375 %{ 376 "byr" => "1926", 377 "ecl" => "grn", 378 "eyr" => "2021", 379 "hcl" => "#623a2f", 380 "hgt" => "172cm", 381 "iyr" => "2013", 382 "pid" => "723616064" 383 }, 384 %{"byr" => "2028", "eyr" => "1986", "hgt" => "94", "iyr" => "2019", "pid" => "#ee7f00"}, 385 %{ 386 "byr" => "1957", 387 "ecl" => "amb", 388 "eyr" => "2027", 389 "hcl" => "#d67ae1", 390 "hgt" => "183cm", 391 "iyr" => "2011", 392 "pid" => "188153423" 393 }, 394 %{ 395 "byr" => "1950", 396 "ecl" => "#e2495d", 397 "eyr" => "2034", 398 "hgt" => "166cm", 399 "iyr" => "2010", 400 "pid" => "151457075" 401 }, 402 %{ 403 "byr" => "2016", 404 "ecl" => "#55c2a4", 405 "eyr" => "1981", 406 "hcl" => "z", 407 "hgt" => "76cm", 408 "iyr" => "2029", 409 "pid" => "153cm" 410 }, 411 %{ 412 "byr" => "2002", 413 "ecl" => "amb", 414 "eyr" => "2021", 415 "hcl" => "#623a2f", 416 "hgt" => "184cm", 417 "iyr" => "1960", 418 ... 419 }, 420 %{"byr" => "1991", "ecl" => "blu", "eyr" => "2027", "hgt" => "179cm", "iyr" => "2020", ...}, 421 %{"byr" => "1950", "ecl" => "grn", "eyr" => "2027", "hcl" => "#a97842", ...}, 422 %{"byr" => "1930", "ecl" => "oth", "eyr" => "2028", ...}, 423 %{"byr" => "1960", "ecl" => "amb", ...}, 424 %{"byr" => "1922", ...}, 425 %{...}, 426 ... 427] 428``` 429 430## Part 1 431 432```elixir 433Enum.count(passports, fn passport -> 434 required = ~w[byr iyr eyr hgt hcl ecl pid] 435 keys = Map.keys(passport) 436 437 Enum.all?(required, & &1 in keys) 438end) 439``` 440 441<!-- livebook:{"output":true} --> 442 443``` 444196 445``` 446 447## Part 2 448 449```elixir 450defmodule Part2 do 451 def valid?(passport) do 452 [ 453 year(passport["byr"]) in 1920..2002, 454 year(passport["iyr"]) in 2010..2020, 455 year(passport["eyr"]) in 2020..2030, 456 case hgt(passport["hgt"]) do 457 {cm, "cm"} -> cm in 150..193 458 {i, "in"} -> i in 59..79 459 _ -> false 460 end, 461 Map.get(passport, "hcl", "") =~ ~r/^#[0-9a-f]{6}$/, 462 passport["ecl"] in ~w[amb blu brn gry grn hzl oth], 463 Map.get(passport, "pid", "") =~ ~r/^\d{9}$/ 464 ] 465 |> Enum.all?() 466 end 467 468 defp year(nil), do: false 469 defp year(y), do: elem(Integer.parse(y), 0) 470 471 defp hgt(nil), do: false 472 defp hgt(h), do: Integer.parse(h) 473end 474 475Enum.count(passports, &Part2.valid?/1) 476``` 477 478<!-- livebook:{"output":true} --> 479 480``` 481114 482``` 483 484<!-- livebook:{"offset":13532,"stamp":{"token":"XCP.TTqFDnEDh1KcybgE2cRzHx79CkCBOfAe1WwEG3cX7vDTkxtUF55KF32ZCFPKqMdo3PkrQc384TMNDJTmch-aqQHkit7xUcJ8qMXwA33agDM5wcdBmkMyp1XHIbZz4GZrr3w","version":2}} -->