this repo has no description
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}} -->