this repo has no description

Update year 2020

hauleth.dev 955b43c0 b665d6b1

verified
+124
2020/day03.livemd
··· 1 + <!-- livebook:{"persist_outputs":true} --> 2 + 3 + # Day 03 4 + 5 + ```elixir 6 + Mix.install([:kino_aoc]) 7 + ``` 8 + 9 + ## Section 10 + 11 + <!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiIzIiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjAifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} --> 12 + 13 + ```elixir 14 + {:ok, puzzle_input} = 15 + KinoAOC.download_puzzle("2020", "3", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 16 + ``` 17 + 18 + <!-- livebook:{"output":true} --> 19 + 20 + ``` 21 + {:ok, 22 + "....#...##.#.........#....#....\n#.......#...#...#.#............\n#..#..#.#.##....#.#........#...\n........##...................#.\n........#...##...#.#.###.......\n##............#...#.....#.##...\n...........#....###...#.....#..\n.......#......#..##..#.....#...\n..#.#..#....#.........#...#..#.\n.........##......#.....##..##..\n........#.....#....#..##......#\n..#..#.......#..............#..\n.....#.#.......................\n.#.#....#.........#............\n.......#.....#.###.............\n......##......#...........#..#.\n.#...............##...#........\n.....#..##........###.........#\n#...........#..#............#..\n.........#....#..#.#......#....\n.......#.........#..##.........\n.##.....#..................#...\n....#............#.#....#.....#\n..#....#...##....#...#.#...#...\n..........#................#.#.\n#...#.#.#.####..#.#..........#.\n..#...#.##......#...........#..\n..#.....#...#.......#......#..#\n..............#.......#........\n.#..#..........#.....#...#..#.#\n#........#...#......#.......#..\n#..................#...........\n..#...#........#...#..#........\n..............#.....#.....#..#.\n#.#.......#..............##.##.\n....#.#.....##....#...........#\n......#....#...#..#.......#....\n....#..#.#.....#..##.....#....#\n...........#.......#.#.#.......\n#.......#..##........#..#......\n.........#.##..#..............#\n...........#............###.#..\n..#.....#.....##...#.........#.\n....##............##........#..\n.....###..........#......##....\n#...##..#..#..........#........\n....#.....#.......#..#.#...##..\n.#....#........#.#.........#.#.\n##...#.#.....#......#..........\n.....##.....#....#.....###.#..#\n..............#..###..#...#..#.\n....#...#....#.............#.#.\n.#.........#.....#........#.##.\n....#.........#..........#.....\n.......#........#.#.#..........\n#........##....#.........#.....\n..##..........#....#.#...#....#\n#...#.#......#..##..........#.#\n.....#..#...#..#...............\n#...#..............#...........\n.#...#....#..##.....#....#.#...\n.#...#.......#...#..#.##....#..\n#....#........#....#...#.......\n#..#......#.....#.....#..##....\n......#.#....##....##..#...#...\n..#....#.#.###..............#..\n.#.##.......#.#.#..#...#..#....\n..#..........#.#....#..#.#....#\n..........#...#...#..........#.\n..........#.....#.#..#..#....##\n.#.#...##...#...........####...\n........##..#.#..........#.##.#\n#......###...........#...#.....\n..#.#....##.........##....#....\n#....#.##..##..#..#.....#.....#\n.##.....##....##....#.......#..\n#...#.....##....#..........#...\n............#.#.##....#....#...\n....#............#.....#......#\n....................#..........\n..#....................#..#....\n....#.....#........#..##...#...\n#.....#.#....................##\n.#....#.#.#...#..........#....#\n....#...#......#...#.....##...#\n.....#.........................\n.......#..#.#...#...#...#.....#\n...#......#.##.#...#..#...##.#.\n...........................#..#\n..#.#.....#........##..........\n....#...##........#.#.#..#...##\n..##.....#..###.........##.##..\n.#..#.....#...#.............#..\n#..............##...#....##....\n.##......#.#............#......\n.............##...#.#.......#..\n.........#..#..#...............\n........##......#....##........\n...#.........#.#.#.............\n#..........#......#......#..#..\n.............##.#.#..#.#.#...#.\n.....#.........#...............\n..##.#..#.....##..#........#.#.\n.#..........#.#.......#......##\n.#........................#....\n#....#....#...#..#......#......\n........#.......#......#.....#.\n.....#....##..#...###...#....#.\n....#.........#....#......#....\n.............#...#....#.......#\n.....#.........#..#.#..........\n.........#..#........#.#.#.....\n......#.##......#....#.#.##.#..\n.#...#.#...#...#.#......#....##\n.#................#......#.....\n#.#.#...............#..........\n.....#.#.......#...#........#..\n#...#.#.#.##..#...........#..#.\n.............###.........#....#\n.#.....#.......##....##.......#\n....#...#.......#.##.....#.....\n...........##.........#...#....\n..............#.#..#.....#..#..\n#.#...#..#.#.........#......#.#\n#.##.....##....#........#.#.#.#\n##.#.###.........##.......#..#.\n#.....#.....................#..\n.........##........#...........\n" <> ...} 23 + ``` 24 + 25 + ```elixir 26 + slope = 27 + puzzle_input 28 + |> String.split("\n", trim: true) 29 + ``` 30 + 31 + <!-- livebook:{"output":true} --> 32 + 33 + ``` 34 + ["....#...##.#.........#....#....", "#.......#...#...#.#............", 35 + "#..#..#.#.##....#.#........#...", "........##...................#.", 36 + "........#...##...#.#.###.......", "##............#...#.....#.##...", 37 + "...........#....###...#.....#..", ".......#......#..##..#.....#...", 38 + "..#.#..#....#.........#...#..#.", ".........##......#.....##..##..", 39 + "........#.....#....#..##......#", "..#..#.......#..............#..", 40 + ".....#.#.......................", ".#.#....#.........#............", 41 + ".......#.....#.###.............", "......##......#...........#..#.", 42 + ".#...............##...#........", ".....#..##........###.........#", 43 + "#...........#..#............#..", ".........#....#..#.#......#....", 44 + ".......#.........#..##.........", ".##.....#..................#...", 45 + "....#............#.#....#.....#", "..#....#...##....#...#.#...#...", 46 + "..........#................#.#.", "#...#.#.#.####..#.#..........#.", 47 + "..#...#.##......#...........#..", "..#.....#...#.......#......#..#", 48 + "..............#.......#........", ".#..#..........#.....#...#..#.#", 49 + "#........#...#......#.......#..", "#..................#...........", 50 + "..#...#........#...#..#........", "..............#.....#.....#..#.", 51 + "#.#.......#..............##.##.", "....#.#.....##....#...........#", 52 + "......#....#...#..#.......#....", "....#..#.#.....#..##.....#....#", 53 + "...........#.......#.#.#.......", "#.......#..##........#..#......", 54 + ".........#.##..#..............#", "...........#............###.#..", 55 + "..#.....#.....##...#.........#.", "....##............##........#..", 56 + ".....###..........#......##....", "#...##..#..#..........#........", 57 + "....#.....#.......#..#.#...##..", ".#....#........#.#.........#.#.", 58 + "##...#.#.....#......#..........", ".....##.....#....#.....###.#..#", ...] 59 + ``` 60 + 61 + ```elixir 62 + binary_slice("abc", 5, 1) 63 + ``` 64 + 65 + <!-- livebook:{"output":true} --> 66 + 67 + ``` 68 + "" 69 + ``` 70 + 71 + ```elixir 72 + defmodule Toboggan do 73 + def slide(slope, {dx, dy}) do 74 + slope 75 + |> Enum.take_every(dy) 76 + |> Enum.reduce({0, 0}, fn row, {pos, count} -> 77 + dc = if binary_part(row, rem(pos, byte_size(row)), 1) == "#", do: 1, else: 0 78 + 79 + {pos + dx, count + dc} 80 + end) 81 + |> elem(1) 82 + end 83 + end 84 + ``` 85 + 86 + <!-- livebook:{"output":true} --> 87 + 88 + ``` 89 + {:module, Toboggan, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:slide, 2}} 90 + ``` 91 + 92 + ## Part 1 93 + 94 + ```elixir 95 + Toboggan.slide(slope, {3, 1}) 96 + ``` 97 + 98 + <!-- livebook:{"output":true} --> 99 + 100 + ``` 101 + 254 102 + ``` 103 + 104 + ## Part 2 105 + 106 + ```elixir 107 + [ 108 + {1, 1}, 109 + {3, 1}, 110 + {5, 1}, 111 + {7, 1}, 112 + {1, 2} 113 + ] 114 + |> Enum.map(&Toboggan.slide(slope, &1)) 115 + |> Enum.product() 116 + ``` 117 + 118 + <!-- livebook:{"output":true} --> 119 + 120 + ``` 121 + 1666768320 122 + ``` 123 + 124 + <!-- livebook:{"offset":7450,"stamp":{"token":"XCP.NoSFu8ULnZhWAsLV6KwdSJblZR21o6kgNjJs3gczqJcYu7u7w_HScRZAL77iGr_ANQuyNyfr_CBU1KjRZ9e7nllBTnLxF6esiGCVXrSCKYPlWFFGN8VONns6BoBdQss9DU8","version":2}} -->
+484
2020/day04.livemd
··· 1 + <!-- livebook:{"persist_outputs":true} --> 2 + 3 + # Day 04 4 + 5 + ```elixir 6 + Mix.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 26 + passports = 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 433 + Enum.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) 438 + end) 439 + ``` 440 + 441 + <!-- livebook:{"output":true} --> 442 + 443 + ``` 444 + 196 445 + ``` 446 + 447 + ## Part 2 448 + 449 + ```elixir 450 + defmodule 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) 473 + end 474 + 475 + Enum.count(passports, &Part2.valid?/1) 476 + ``` 477 + 478 + <!-- livebook:{"output":true} --> 479 + 480 + ``` 481 + 114 482 + ``` 483 + 484 + <!-- livebook:{"offset":13532,"stamp":{"token":"XCP.TTqFDnEDh1KcybgE2cRzHx79CkCBOfAe1WwEG3cX7vDTkxtUF55KF32ZCFPKqMdo3PkrQc384TMNDJTmch-aqQHkit7xUcJ8qMXwA33agDM5wcdBmkMyp1XHIbZz4GZrr3w","version":2}} -->
+105
2020/day05.livemd
··· 1 + <!-- livebook:{"persist_outputs":true} --> 2 + 3 + # Day 05 4 + 5 + ```elixir 6 + Mix.install([:kino_aoc]) 7 + ``` 8 + 9 + ## Section 10 + 11 + <!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiI1Iiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjAifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} --> 12 + 13 + ```elixir 14 + {:ok, puzzle_input} = 15 + KinoAOC.download_puzzle("2020", "5", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 16 + ``` 17 + 18 + <!-- livebook:{"output":true} --> 19 + 20 + ``` 21 + {:ok, 22 + "FFBBFFFLRL\nFFBBFBBRRL\nFBBBFFBLRL\nBBFBFFBLRR\nBFBBBFFLLL\nBFBBBBBLLR\nFBFBFBFLLR\nBFBFBBFLLR\nFBBFBFBLLL\nBBBFBFBRLL\nBFBBBFBLRL\nFBBFFFBLLR\nBFFBFBFLRL\nFBBBBFBRLR\nFFBBBBBRRL\nFBBFBFFLRL\nFBBBBBBLLR\nFBBFBBBRRL\nFBBFFBFRLL\nFBFBBBBRRR\nBFFBFBFRRL\nBFBFBBBLLR\nFFFFBFBLRL\nFBFFBFFLRL\nFFBFBBBRRR\nFFBFFFFLRR\nFBBBFFFLLR\nFFFFFBFLLL\nBFFFFFFLRL\nFBBBBBFRLR\nBBBFFBBRRR\nFFFFBBBRLL\nFBFFBBBRLR\nBFBBBFFRRL\nBBFBBFBLRL\nBFBFBFFRRR\nBBFBFFFLLL\nFBFBFBFRRR\nBFBFBFFRRL\nBBFBBFBRRL\nFFBBFBFLRL\nFBFFFFFRLR\nFBBFFFBLLL\nFBBBBFFRLL\nFFBBBBBLLL\nBFFBBFFRLR\nFFFBBFBRRR\nFBBBFFFRLL\nFFFBFBFLRL\nBFFBBFFLRL\nBFBBBBBLRL\nBFFFFFBRRR\nFFFBBFBLRL\nFBBBFBFRLL\nFBBFBFBLRR\nBBFBBFFLRR\nFBFFBBFLLL\nFFFFFBBRLL\nFFBBFFBRLR\nBBFFFFFLLL\nBFFFFBFLRR\nFBFBBFFRRL\nBFBFFBBLLR\nFBBBFBBRLR\nBBBFBFFRLL\nBBFFBBFRLR\nFFBFFBBRLR\nFFBBBFBRLR\nBBBFFFBLRR\nBBFBFBFLRR\nBFBBBBBRLR\nBFFFFFBLLR\nFBFFBFFRLL\nBBBFFBBRLR\nFFBBBFBRRR\nBFBBBFBRLR\nFBFFFBBLRL\nFFFBFFFRLL\nBBFFBFFLLL\nBFFBBFFRRR\nFFBFBFBRRL\nFFBBBFBRRL\nFBBFFBBRLR\nFBFFBBFRLR\nBFBFFBBRRR\nBBFBFBBRLR\nFFBFFFFRRL\nBBFFBFFLLR\nFBBFBFBRRR\nBFBFBBBRRL\nFBFBFFBRRL\nFFFBBFFRLL\nBFBFFFFRRR\nFBBFFBFLLR\nFFBFBFFRLL\nFBFFBFBLLL\nFBFBFFFLRL\nBBFFFFFRRR\nFBFFBBFLRR\nFBFFFBFLRL\nFBBBFBBRRL\nBFFBFFFRLR\nFFBBBBFLLR\nBFFFFBFLRL\nBFFBFFBRRR\nFFBFBFBLRL\nBBFFFBBRLL\nFFBFBBFRRR\nFFFBFBFRRL\nFBFFBFBRRR\nFBBBBFBRRL\nFBFFFFFLLR\nFFBFFFFLLR\nFBBBBFFRLR\nBBBFFBBLRR\nBBBFFBFLRR\nFBBFBBBLRR\nFBBFBBFRRL\nFFFBFFBLLL\nFBFFFFBLLL\nBBFFFFBLLL\nFBFFFBFLRR\nFFBFBFFLRR\nBBFBFFFRLL\nFFFBBBFRLR\nFFBFFBBRLL\nBBBFBFFRRL\nBFFBBBBLRR\nBFFFFFFLLL\nBBBFFFBLLL\nFBBBBBFRLL\nFBBFBBBLLR\nBBFBFFFRRR\nBBFFFBBLLL\nFBBFFBFLRL\nBBFBFFFLRR\nBFBFFBFRLL\nBFFFBFBLLR\nBBBFBFBLLL\nBBBFFBFRLR\nFBFFBFBRLR\nBFBBFFFLLL\nBBFFFFBLRR\nBBFFFBBRRL\nBBBFBFFLLL\nBFBFFBFLLL\nFBBBBFFLLR\nFFBFFFFRLR\nFFBBBFBRLL\nBFFFFFFRRL\nBFBFFBBLRL\nBBFBBBFRLL\nBFFFBFFLLR\nBBFBFFBRLL\nBFBBFFFRLL\nBBFBBFBRLR\nFFFBBFBRLR\nBFFFBBFLRL\nFFBFFBFRLL\nFFFBFFBLRL\nBFBBBFFRLR\nBBBFFBBLRL\nBFFBBBBRRL\nFFBBFFFRLL\nBFBFFBFLRL\nBFFBBBBRRR\nBBFBFBFRRL\nBBBFFBFRRL\nBFFFBFBLRL\nFFFBFBFRLR\nFBFFBBBLRR\nFFFFBBBLLL\nBBBFBBFLLR\nBFFBFBFRRR\nBFBFFFBRRR\nBBFBBBBLLR\nFFBBBBBLRL\nFFBFFBFLRR\nFFBBBFBLRR\nBBFBBFBRRR\nFFFFFFBRRR\nBFBFBFBRRL\nBBFFBBBLRR\nBBFBFFFRLR\nFBBFBFBLLR\nBFBBFFBRLL\nFFFFBFBLLR\nBFBFFBBRLR\nFBFFFBFRRR\nBFFBFFFRLL\nFBBBFFFRRR\nFFFBBBFLLL\nFBBBBBBRRL\nFBBFFBBLLR\nBBBFBFFLRR\nBFBBFBFLRR\nFFFBBBBRRR\nBFFFBBFRLR\nFBFFBBFLLR\nFBFFFFFRRL\nBBBFBBFLLL\nBBBFFFFRLR\nFFFFBBBRRR\nFBBBFBBLLL\nBFFBFFBLLL\nFBFBBFBRLR\nFFBFFBBLLR\nFFFFBFFLRR\nFBBFFBFLLL\nFBFBBFBRRR\nBBBFBFBLLR\nBBFFBFBLLL\nFFBFFBFRLR\nFBBBFBBLRR\nBBFBBFBLLL\nFFBFFBFRRR\nFBBBBFFLRL\nBFBBFBFLLR\nFBFBBBFRLR\nBFBBFFBLLR\nFFFBBBFLLR\nFFFBBBFRRL\nBFFFBFBRLR\nBBBFBBFLRR\nBBFBBFFLLR\nBBFBBBBRLR\nFBBFFFFLRR\nFBFBBFFRLL\nFFBFFFFRRR\nFFFBBFFRRL\nFFFBBFBRRL\nFFFBFBFLLR\nFFBBBBFRRR\nBFFFFBBRRL\nBFFFFBFRRR\nBFBBBFBLRR\nFFBBFFFRRL\nFBBBBBBRRR\nBBFBFFBLLR\nFBFFFFBRLL\nBFBBFBFLLL\nFBFFFBBRLL\nFBBBFFBLLR\nBBFBBBFRLR\nFBFBBFBLRR\nFFFFFBFLLR\nFBFBBBFLRL\nFFBFFFBRRR\nFFFBBFFLRL\nBBBFFFFLLR\nBFBFFFFRRL\nFBFBFBBLLR\nFBBBFBFRRL\nBBFBBBBRRL\nBFBBFBFLRL\nBFFBBFFLLR\nBFBFFBBRLL\nFBFFBFFRLR\nFBFBFBFLRR\nBFBFBBFRRR\nFBBBBFBLRL\nFFBBBFFRRR\nFFBBFFBRLL\nFFBBBBBRLL\nFBFFFBFRRL\nFFFBBBFLRL\nBBBFBFFRRR\nFFFBFFFRRR\nFBFFBFFLLL\nFFBBFFBRRL\nBFFBFFBRRL\nFFBBBFFRLR\nBBBFFFFRRR\nBBFBFBBRRR\nFBFBBBBLRR\nBFBFBFBLLL\nFFBBFFBLLR\nBFFFBBBRLR\nBFBBFBBRLR\nBFFFFBBLLR\nFBFBFBBRLR\nBFFBBBFLLR\nFBFFBFBLRL\nBFBFBBBRLL\nBFBBBFFLRL\nFFFBFFFLRR\nBFFBBFBRLL\nFFBBBBFRLL\nBBFFFBBLLR\nFBFBFBFRLR\nBBBFFFBRLR\nBFFFFFBRLR\nBBBFFFFLLL\nFFFBBFBRLL\nBFFFFFBRRL\nFBFFBBBRRL\nFBFBFBBLLL\nFBFBBFBRRL\nFBBFBBBRRR\nBFBFFBBRRL\nFBBBBFBLLL\nFBBBBBBRLR\nBBFFFBFRRL\nFFFFBFBLLL\nFFFFBBFLRR\nFFFFBFFLRL\nBFFFBBFRLL\nBBFFFFBRRR\nBFBFFFFRLL\nBFFFFBFLLR\nBBBFFBBRRL\nBBFBBFBLLR\nBFFFFBFRLR\nFBBBFBFLLR\nFFFFFBBLRR\nBFBFFFFLRR\nFBFBBFFLRL\nFBFFFBBRRR\nBBFBBBFLRL\nBFBBBFFLLR\nBFBFBBFRRL\nFBFFFFBLRL\nFBBFBFFRLR\nBFBFBBBLRR\nBFBFBBFLRL\nBBFFBFFRLL\nFBFFBBBLRL\nBFBFBFFLLR\nFFFBFFBLLR\nFFFBFBBRRR\nBBFBFFFLLR\nFBBBFBFRLR\nFBFFBBBLLL\nFFBFBBFLRR\nFBFBFFFLLL\nBBFFFFFLRL\nFBFBBFBLRL\nBBFFFBFLLR\nBBFBBBBRRR\nBFBBBFFRRR\nFFFBFFBRLL\nFBBBFFFRLR\nBBBFBFBLRL\nFBFFFFBRLR\nBFFFFFBLLL\nFBFFFFBLLR\nBFBBFFBLRR\nBFBFBBBRRR\nBBBFBFBRRR\nFFFBBFFRRR\nFBBBFFFLRR\nBBFBFFFRRL\nBFBFBBFRLR\nBFFFBFBRLL\nFBFFFFFLLL\nFFFBBBBLRL\nFFFBBFFLLL\nFBFFFFBRRR\nFFBFBFBRLR\nBFBFFFBLRR\nBFFFBFBLLL\nFBBFBFFRLL\nFBFBFFFRLL\nFBBBFFBRRR\nFBBBFFBRLL\nFFBBFBBLLL\nFBBBBFBRRR\nBFBBBFBLLR\nFBBBBBFLLR\nFFBBFBFLRR\nBFFBBFBLLR\nFBFFFFBLRR\nBFFB" <> ...} 23 + ``` 24 + 25 + ```elixir 26 + seats = 27 + puzzle_input 28 + |> String.split("\n", trim: true) 29 + ``` 30 + 31 + <!-- livebook:{"output":true} --> 32 + 33 + ``` 34 + ["FFBBFFFLRL", "FFBBFBBRRL", "FBBBFFBLRL", "BBFBFFBLRR", "BFBBBFFLLL", "BFBBBBBLLR", "FBFBFBFLLR", 35 + "BFBFBBFLLR", "FBBFBFBLLL", "BBBFBFBRLL", "BFBBBFBLRL", "FBBFFFBLLR", "BFFBFBFLRL", "FBBBBFBRLR", 36 + "FFBBBBBRRL", "FBBFBFFLRL", "FBBBBBBLLR", "FBBFBBBRRL", "FBBFFBFRLL", "FBFBBBBRRR", "BFFBFBFRRL", 37 + "BFBFBBBLLR", "FFFFBFBLRL", "FBFFBFFLRL", "FFBFBBBRRR", "FFBFFFFLRR", "FBBBFFFLLR", "FFFFFBFLLL", 38 + "BFFFFFFLRL", "FBBBBBFRLR", "BBBFFBBRRR", "FFFFBBBRLL", "FBFFBBBRLR", "BFBBBFFRRL", "BBFBBFBLRL", 39 + "BFBFBFFRRR", "BBFBFFFLLL", "FBFBFBFRRR", "BFBFBFFRRL", "BBFBBFBRRL", "FFBBFBFLRL", "FBFFFFFRLR", 40 + "FBBFFFBLLL", "FBBBBFFRLL", "FFBBBBBLLL", "BFFBBFFRLR", "FFFBBFBRRR", "FBBBFFFRLL", "FFFBFBFLRL", 41 + "BFFBBFFLRL", ...] 42 + ``` 43 + 44 + ```elixir 45 + defmodule Plane do 46 + def lookup(<<>>, _directions, pos, 1), do: pos 47 + 48 + def lookup(<<curr>> <> rest, d, first, dist) do 49 + dist = div(dist, 2) 50 + 51 + {nf, nl} = 52 + if curr == d do 53 + {first, dist} 54 + else 55 + {first + dist, dist} 56 + end 57 + 58 + lookup(rest, d, nf, nl) 59 + end 60 + 61 + def seat_no(id) do 62 + {row, col} = String.split_at(id, 7) 63 + 64 + lookup(row, ?F, 0, 128) * 8 + lookup(col, ?L, 0, 8) 65 + end 66 + end 67 + ``` 68 + 69 + <!-- livebook:{"output":true} --> 70 + 71 + ``` 72 + {:module, Plane, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:seat_no, 1}} 73 + ``` 74 + 75 + ## Part 1 76 + 77 + ```elixir 78 + seats 79 + |> Enum.map(&Plane.seat_no/1) 80 + |> Enum.max() 81 + ``` 82 + 83 + <!-- livebook:{"output":true} --> 84 + 85 + ``` 86 + 947 87 + ``` 88 + 89 + ## Part 2 90 + 91 + ```elixir 92 + seats 93 + |> Enum.sort() 94 + |> Enum.map(&Plane.seat_no/1) 95 + |> Enum.chunk_every(2, 1) 96 + |> Enum.find_value(fn [a, b] -> if b == a + 2, do: a + 1 end) 97 + ``` 98 + 99 + <!-- livebook:{"output":true} --> 100 + 101 + ``` 102 + 636 103 + ``` 104 + 105 + <!-- livebook:{"offset":6707,"stamp":{"token":"XCP.jyVZ5mT4Eh93IIpxW_8l2Aemq91Tmk8CIwY-V3Z73RF3Qd7Yjct-IMJBfvB57vM_l06YF1tv55dZ73nE8aLIHN4OMmL-3l-vRTpT0Qs7Ks6Oc5tQDm2ynrANEp8xknTW7O4","version":2}} -->