+124
2020/day03.livemd
+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
+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
+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}} -->