this repo has no description

Start year 2024

hauleth.dev f395887e ef17f468

verified
+102
2023/day01.livemd
···
+
<!-- livebook:{"persist_outputs":true} -->
+
+
# Day 01
+
+
```elixir
+
Mix.install([
+
{:kino_aoc, ">= 0.0.0"}
+
])
+
```
+
+
## Section
+
+
<!-- livebook:{"attrs":{"assign_to":"puzzle_input","day":"1","session_secret":"ADVENT_OF_CODE_SESSION","year":"2023"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
+
+
```elixir
+
{:ok, puzzle_input} =
+
KinoAOC.download_puzzle("2023", "1", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
{:ok,
+
"two934seven1\n8825eightknfv\nsevenoneqbfzntsix55\nfoursqpqvv192rdrbtcccfourone\n9jpzhpxqthreelmrnlhfqmn4\nonedpsckg3xdhmgtsixthreefivejlncszkxeight\n4twofour\n7eighttwo17fournsmrznntgjrdpkdjvx\n573\nninethree3\n3gngzkpkgrf\nqeightwo2xjvfkfiveone\ntwoonej26\nsgoneightfoureight5sevenjzsqghg\nbnrb36xtjd7four9\nthreepprhsff3prbpfivesevenseven4\n38sevennineninemnfzklttkxnine3\n8mllzkfqklhonefivemv4\nonedcqlqcrzn66three\n1fourjthreefc2gbtbdzsix\neight7two4258\n4hmfzdzf\n26dsmdzznm7\nplckvxznnineh34eight2\ndhrvd4eightgxznhqmh\n5fxhhkghvm3nineshpcxhtwo6fourhrktpbq\nqklhmhmdlgeighttwoonetwo52five\n86threemmpchhzdvsvxfzrj\n9clvchpgrslnkhdmfkjmlrvgnf\n8ncpdtspfivethree\ngtbtkqcgvh8945\nsevencrkbt3btljpdpgstlf\n8nine37bpkmtghhnc2hnreightwohvs\n5qxmsrthreempcmpdcnnv41\n8threezrxhxgx4g\njhsb3onep1\neight71rnz\n7p16lrxktlr6\n8one5fivelvdbjzz\n1nine2twodhnineonesixkqfcbgdlfg\nfour8sixfourfive\npjdmt4one8sdsdhhqxlqgzpk6qrtdvxm\nsixzfourkdpmnn92qbjkjqfqpn\n42threefiveh\n5fhgzt8threemzhblb6\nbbc3kxhvbfrn8four6five\n91fknhthreefour\nsix9fttmqpninethreevhgtrxklbvxbljsp1\nfour5five1471mtfv\n3bjkggcntwo3ptmjhmthree7\nfour2eightone\nthreedrzktlgbz4five\ndmpgttqfivekcdjbf49six\n9bplkkgrxgjqjqb3seven\n4861sx4six\nhjzmxtxvxkkpbvgpvmgb4two8bqxlvponesq\nlkxxtkctlphjfivepjlrg1\nxszdbbvxjrfxs2vrmmbfourpzcfmgppk33eightwors\n966fourflbfsk3\n1bskshtjseven5qlbjhqgzhbzxvlxsvtcmmzseven\n56two28cbhfsdcjsix2four\n6s5qcmvjltqeightslhnzmvbfvcmxj\ntwosevenjxk6lhrkknnkq\nkjkj2lkkldqbgzhglmthree9\nftxhnpms1onetwoxg2\nthree9sixsevenmrgggztckzgzv7\nstvgmjgnine2vvsnjhlzkstwo5szsbvzjdzb\nv6\nthreetwolscvhrlmm3r\ntwo17kblkphfninefour6six1\none6fiveeight9sixjzljjfknrhkzxr\ndgpqm43xthreekxgspjzrzcsix\n2two8fourpppb2\nfiveseven5four\n5rttwofivefnmbkn8nine2eight\n43threeninelgnpzrdtbc1lbkjkvqrdcd\n1seventx\nnctwonefourjzgskmxjmq2\nrpzpht2tdxczzfthreeseven\ntwo1seven\n6bjztkxhsixkgnkroneightht\n9mqzkgmv4vxqrpf4\n49hlj\n46gv\n75sixfddn75\neight87xzjkdpnnjjfqeight\n9pfcdhxbcrnpsnmvkqnsqsninedgtlmmc5\nxmfbn34\n99lvrrndpqcnhznn\nqsmxhxfph24three\nlql25\n8five1dhrkm\ntwoninefourcxksqfmn1\n7eightdclrvn\none2seveneight3ninemcpnmonetwo\n33fivefivenftbczsdstlxzbp\n9r97five\n5fivessskxvnt6qqbkkqrggxg9gsdtbptpn\nthreesjdpjdkczjgthree6\ntwojqm86\nbttrx15qfznmdncnz5\nppckphrtzhstd3xvthzrxxlrrjtk\nqkm6ckeight7gnmqkltz6jsrgjhbck\nzdjjjlpmjtphbjpm9threeskqrphxbfqqeightone\nkonesix1three\nfour24391rzxtffour\nhsevenfive36fqrbjpfj7\ndxdcssixbcnp8two639\nhnvg2\nsixeighthmqkjjsix6tbvdhzone2vsn\ndfzlxq7pjmq5\n5n3\ntwovjcgxdsdngt2smfxfqxeight\nftpjlnvg5qshclfzqtc2eightninefivecsrgk\nzzgsjsjffpvcgfmjtnpkrsqlmpzlt9four\n4btrhpznzr8oneightg\npph2one\n5seveneighteight\n31sfrfrcgmseven\nfour7bdqgrhfive3\nnbrzbggpseven9prthjvknq\n3sixonefourh\nfourgkrpkzdmhtwoseven6txplz\nfour84ldbhnkxjph\n6eightonesrb\ngnmckftk62jgsjxzpk\nbzctx9onetmcnzhxkrtchjgqxv66\n1three5\n27two\n34eightwox\n6ndgrbmfkfive2ksxfbnjbl7fkrm\nkxpz4gjmgcgzzq63five\nnfvmfrbc151one8nggsdqvm\n4clnctseven5nsn5\nhcrpbvqmmdbstlxccthkththreebm6\ngdnmh6cslzhjhdl8nine\nsevenninethreefive4bgknpbnine\n2sevent6three1\n2jbrmdxgpnine7\nnshlgtbkmcmgkmqone3\ndklhc9sevenrxxzzxltsnlltqcjrbgprnx\ngmrjhlvzppmklnl39\nkv86eight3dcdpp6pmdzcvsix\nfiveseven2sevensix6952\n3xrtthnsevenjxsxpzvc\n256nmzrlzbczv\n4dp7onesixvpcf\n25onesevenonexvnst4smvlfszcrv\nlcxncproneseven37five\nninezjsrptfivenhsqxrdz7one\ncscdmnfrcxfqdtkmhkldgjlxdjqsxslhdzvvt4\nsixfnjnfkqm67blkmnqtwo\nfivethree7\n2five5ninegcmqbkpp61npkpml9\n3qktrxninefour\nqdhmxstwo44two\n21nine\nrbnineone3xppvtbmv3sevenvxkkgmgklg\nmcvzplmpvptwo38\nsv176threeone\n5vksixqsccgdkrrfourcgnpsfxbvj\nxxtwone6eight\nthreeonespkbnsj9onesevenpz5\nfivenncrfvhfdsevengxzkxbkrklgsfvllrkbx4\n69kp1seven8dqkrx\ndmb9ccghdjjpjxfivehtwo4\n6nhgdkpdone\ntfvqdqdqcszxbrdmmrninesct2\n8sevenfour2eight8rskc\ncpmgffcvln9sjdsgfivesix5rppfsfmmqtffive\n5two7\n7threecrkljthreetwo\n6qgqzsdhprd\n959zgjscgtm\nfourtwoppfrdqgtseven9\n8bbchvoneeightr\ngtddrb1rznsdjtonethree5four\n8rrskfzlmlbrsninezdzpt3\n6njhmkpp4onefive8two\n4cqpnkcxjtwoqzqmjnqccfs256hcnqpfm\nnineeightseven62sixhlxlps\ndtqplzzf87threecthree\nmqptgzjxddxgxpjr5\n9194jbjjktwofive\nfive514foursevendzxlh2\n6nineeight85zvx\nfour8gsgrstfmdv99hpkfgptzqkhsmgsnlggrseven\n9three298\n3fpttzk35\nrbtckzonexkqmfxrnsbsrkqbq66sixkcqfzjfour\nsixkdcrrrppcsix399fccnsbhfxvfiveft\nxfjxbfvmb" <> ...}
+
```
+
+
## Part 1
+
+
```elixir
+
puzzle_input
+
|> String.split()
+
|> Enum.map(fn line ->
+
for <<c <- line>>, c in ?0..?9, do: c - ?0
+
end)
+
|> Enum.map(fn nums -> List.first(nums) * 10 + List.last(nums) end)
+
|> Enum.sum()
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
52974
+
```
+
+
## Part 2
+
+
The tricky part there is that words can overlap, and we need to take that up to the account. It took me way too much time to understand that.
+
+
```elixir
+
defmodule Part2 do
+
def parse(""), do: []
+
def parse(<<c>> <> rest) when c in ?1..?9, do: [c - ?0 | parse(rest)]
+
+
words = ~w[one two three four five six seven eight nine]
+
+
for {word, idx} <- Enum.with_index(words, 1) do
+
def parse(unquote(word) <> _ = str) do
+
<<_>> <> rest = str
+
[unquote(idx) | parse(rest)]
+
end
+
end
+
+
def parse(<<_>> <> rest), do: parse(rest)
+
end
+
+
puzzle_input
+
|> String.split()
+
|> Enum.map(&Part2.parse/1)
+
|> Enum.map(fn nums -> List.first(nums) * 10 + List.last(nums) end)
+
|> Enum.sum()
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
53340
+
```
+
+
```elixir
+
words = ~w[one two three four five six seven eight nine]
+
pattern = Enum.concat(1..9, words) |> Enum.join("|")
+
+
to_num = fn n ->
+
if v = Enum.find_index(words, &(&1 == n)), do: v + 1, else: String.to_integer(n)
+
end
+
+
puzzle_input
+
|> String.split()
+
|> Enum.map(&Regex.scan(~r/^.*?(#{pattern}).*(#{pattern}).*?$/, &1))
+
|> dbg()
+
|> Enum.map(fn
+
[[_, a, b]] ->
+
to_num.(a) * 10 + to_num.(b)
+
+
[[_, a]] ->
+
a = to_num.(a)
+
a * 10 + a
+
end)
+
|> Enum.sum()
+
```
+
+
<!-- livebook:{"offset":6289,"stamp":{"token":"XCP.8wDt6KmmXvHba68hXcGnXNOf4ySnrVXFg3xBlBhffIp7QdMVOlpx87HS35zyFWnNl8D6ubMeKZ0nbHD6o1BhtUMF4AvpCD9FtMxlHIqrB6hrbn7N6ZkPZqriythIFxCvpA","version":2}} -->
+435
2023/day02.livemd
···
+
<!-- livebook:{"persist_outputs":true} -->
+
+
# Day 02
+
+
```elixir
+
Mix.install([:kino_aoc])
+
```
+
+
## Section
+
+
<!-- livebook:{"attrs":{"assign_to":"puzzle_input","day":"2","session_secret":"ADVENT_OF_CODE_SESSION","year":"2023"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
+
+
```elixir
+
{:ok, puzzle_input} =
+
KinoAOC.download_puzzle("2023", "2", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
{:ok,
+
"Game 1: 3 blue, 7 green, 10 red; 4 green, 4 red; 1 green, 7 blue, 5 red; 8 blue, 10 red; 7 blue, 19 red, 1 green\nGame 2: 6 red, 10 green; 11 green, 4 red; 16 green, 2 blue; 7 green, 5 blue, 4 red; 17 green, 1 red, 1 blue\nGame 3: 5 red, 9 blue, 1 green; 5 red; 11 red, 2 green, 8 blue; 2 green, 6 blue\nGame 4: 2 red, 5 green; 2 blue, 3 red, 3 green; 3 red, 2 blue; 8 green, 2 red\nGame 5: 12 red, 13 blue; 13 blue, 2 green, 9 red; 9 blue, 1 red; 2 green, 12 blue; 1 green, 1 red, 11 blue\nGame 6: 4 blue, 11 red; 4 red; 1 green, 7 red; 1 green, 1 blue; 8 blue, 10 red; 1 green, 2 blue, 8 red\nGame 7: 7 blue, 15 red, 1 green; 5 green, 17 red, 7 blue; 5 blue, 1 green; 11 blue, 2 green, 17 red; 14 green, 9 red, 2 blue; 6 blue, 19 red\nGame 8: 13 green; 5 green; 3 blue, 9 green, 1 red; 4 red, 11 green, 4 blue\nGame 9: 4 green, 1 red, 1 blue; 4 green, 7 blue, 7 red; 9 blue, 4 red; 2 blue, 8 red, 5 green; 6 blue, 2 green; 5 red, 5 green, 10 blue\nGame 10: 1 green, 5 blue, 3 red; 4 green, 9 red, 3 blue; 11 red, 2 green, 5 blue; 3 green, 1 blue, 2 red; 6 red, 2 blue\nGame 11: 2 red, 6 green, 12 blue; 2 red, 9 blue, 1 green; 12 green, 3 blue\nGame 12: 1 red, 1 blue, 12 green; 6 green, 2 red, 1 blue; 6 red, 6 green, 1 blue; 3 green, 6 red\nGame 13: 5 red, 19 green, 3 blue; 6 red, 7 blue, 11 green; 8 blue, 6 red; 3 blue, 4 green, 4 red; 8 red, 15 green, 5 blue; 5 blue, 2 red, 10 green\nGame 14: 5 blue, 9 green; 4 green, 6 blue; 14 green, 1 red, 4 blue; 3 blue, 3 green; 2 green; 5 blue, 7 green, 1 red\nGame 15: 5 red, 8 blue; 9 blue, 3 red; 5 red, 1 green, 16 blue; 1 blue, 3 red, 2 green; 5 red, 2 green, 10 blue\nGame 16: 6 blue, 9 green, 10 red; 8 blue, 9 red, 14 green; 7 green, 1 blue, 1 red; 8 red, 5 green, 8 blue; 10 red, 5 blue, 14 green; 7 blue, 11 red, 3 green\nGame 17: 12 blue, 12 red, 6 green; 14 green, 17 blue, 4 red; 11 blue, 1 red, 13 green\nGame 18: 7 blue, 2 green, 4 red; 1 blue, 2 green, 4 red; 2 red, 17 blue\nGame 19: 3 red, 9 green; 8 red, 2 blue, 2 green; 3 blue, 15 green, 11 red; 18 green, 3 red, 1 blue\nGame 20: 5 green, 5 red, 16 blue; 8 blue, 6 green, 4 red; 10 red, 11 blue; 5 red, 5 blue, 5 green\nGame 21: 1 red, 3 blue, 14 green; 6 red, 6 blue, 17 green; 12 green, 17 blue, 3 red; 15 green, 1 red, 19 blue; 3 red, 18 blue, 4 green\nGame 22: 15 blue; 11 blue, 2 red, 1 green; 1 green, 7 red; 1 red, 18 blue, 1 green; 16 blue; 3 red, 6 blue\nGame 23: 11 blue, 6 green, 4 red; 9 green, 11 red, 8 blue; 5 green, 5 red, 2 blue; 11 green, 4 blue, 11 red; 3 green, 9 blue, 2 red\nGame 24: 7 green, 2 red; 8 red, 1 blue, 15 green; 3 red, 6 green, 6 blue\nGame 25: 9 blue, 9 green; 3 green, 7 blue, 1 red; 6 green, 1 red, 1 blue; 6 green, 1 red, 1 blue\nGame 26: 1 green, 15 blue, 1 red; 1 red, 12 blue, 1 green; 16 blue; 5 red, 11 green, 14 blue; 6 green, 4 red, 14 blue\nGame 27: 14 red, 9 green; 11 red, 5 green, 6 blue; 1 red, 6 blue, 9 green\nGame 28: 6 green, 1 blue, 9 red; 1 green, 9 red; 7 red; 11 red, 1 blue, 2 green; 8 red, 10 green; 6 green, 1 blue, 5 red\nGame 29: 1 red, 19 blue, 3 green; 9 blue, 1 red; 8 green, 17 blue; 11 blue, 4 green\nGame 30: 7 blue; 5 blue, 1 red, 1 green; 3 blue, 1 red\nGame 31: 9 red, 2 green, 1 blue; 5 red, 1 green, 3 blue; 2 green, 7 red; 2 green, 12 red\nGame 32: 1 red, 1 blue, 17 green; 14 blue, 10 green, 6 red; 12 green, 11 blue, 3 red\nGame 33: 2 red, 1 green, 3 blue; 7 blue, 4 green; 1 red, 3 green, 5 blue\nGame 34: 9 blue, 1 green, 9 red; 12 blue, 2 green, 12 red; 3 blue, 12 red; 2 green, 14 blue, 11 red; 10 red, 12 blue\nGame 35: 6 blue, 2 red; 5 blue; 6 green, 9 blue, 3 red; 3 green, 1 red, 2 blue\nGame 36: 9 blue, 4 green, 6 red; 2 red, 4 green; 7 red, 3 green; 6 green, 2 blue; 3 red, 4 blue, 3 green; 3 green, 4 red, 16 blue\nGame 37: 2 green, 8 red, 4 blue; 3 red, 4 blue, 2 green; 5 blue, 3 green; 9 blue, 15 green; 5 red, 11 green, 7 blue\nGame 38: 12 red, 1 blue; 10 red, 3 green, 2 blue; 7 blue, 3 green, 8 red; 14 red, 2 green\nGame 39: 16 green, 2 red, 17 blue; 6 red, 4 green, 13 blue; 7 blue, 1 green, 4 red; 2 green, 3 blue; 12 green, 6 red, 17 blue; 5 red, 2 blue, 6 green\nGame 40: 3 green, 4 blue, 2 red; 2 green, 3 red; 6" <> ...}
+
```
+
+
```elixir
+
games =
+
puzzle_input
+
|> String.split("\n", trim: true)
+
|> Enum.map(fn "Game " <> game ->
+
{id, ": " <> rest} = Integer.parse(game)
+
+
picks =
+
for pick <- String.split(rest, "; ") do
+
pick
+
|> String.split(", ")
+
|> Map.new(fn balls ->
+
{num, " " <> color} = Integer.parse(balls)
+
{color, num}
+
end)
+
end
+
+
{id, picks}
+
end)
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
[
+
{1,
+
[
+
%{"blue" => 3, "green" => 7, "red" => 10},
+
%{"green" => 4, "red" => 4},
+
%{"blue" => 7, "green" => 1, "red" => 5},
+
%{"blue" => 8, "red" => 10},
+
%{"blue" => 7, "green" => 1, "red" => 19}
+
]},
+
{2,
+
[
+
%{"green" => 10, "red" => 6},
+
%{"green" => 11, "red" => 4},
+
%{"blue" => 2, "green" => 16},
+
%{"blue" => 5, "green" => 7, "red" => 4},
+
%{"blue" => 1, "green" => 17, "red" => 1}
+
]},
+
{3,
+
[
+
%{"blue" => 9, "green" => 1, "red" => 5},
+
%{"red" => 5},
+
%{"blue" => 8, "green" => 2, "red" => 11},
+
%{"blue" => 6, "green" => 2}
+
]},
+
{4,
+
[
+
%{"green" => 5, "red" => 2},
+
%{"blue" => 2, "green" => 3, "red" => 3},
+
%{"blue" => 2, "red" => 3},
+
%{"green" => 8, "red" => 2}
+
]},
+
{5,
+
[
+
%{"blue" => 13, "red" => 12},
+
%{"blue" => 13, "green" => 2, "red" => 9},
+
%{"blue" => 9, "red" => 1},
+
%{"blue" => 12, "green" => 2},
+
%{"blue" => 11, "green" => 1, "red" => 1}
+
]},
+
{6,
+
[
+
%{"blue" => 4, "red" => 11},
+
%{"red" => 4},
+
%{"green" => 1, "red" => 7},
+
%{"blue" => 1, "green" => 1},
+
%{"blue" => 8, "red" => 10},
+
%{"blue" => 2, "green" => 1, "red" => 8}
+
]},
+
{7,
+
[
+
%{"blue" => 7, "green" => 1, "red" => 15},
+
%{"blue" => 7, "green" => 5, "red" => 17},
+
%{"blue" => 5, "green" => 1},
+
%{"blue" => 11, "green" => 2, "red" => 17},
+
%{"blue" => 2, "green" => 14, "red" => 9},
+
%{"blue" => 6, "red" => 19}
+
]},
+
{8,
+
[
+
%{"green" => 13},
+
%{"green" => 5},
+
%{"blue" => 3, "green" => 9, "red" => 1},
+
%{"blue" => 4, "green" => 11, "red" => 4}
+
]},
+
{9,
+
[
+
%{"blue" => 1, "green" => 4, "red" => 1},
+
%{"blue" => 7, "green" => 4, "red" => 7},
+
%{"blue" => 9, "red" => 4},
+
%{"blue" => 2, "green" => 5, "red" => 8},
+
%{"blue" => 6, "green" => 2},
+
%{"blue" => 10, "green" => 5, "red" => 5}
+
]},
+
{10,
+
[
+
%{"blue" => 5, "green" => 1, "red" => 3},
+
%{"blue" => 3, "green" => 4, "red" => 9},
+
%{"blue" => 5, "green" => 2, "red" => 11},
+
%{"blue" => 1, "green" => 3, "red" => 2},
+
%{"blue" => 2, "red" => 6}
+
]},
+
{11,
+
[
+
%{"blue" => 12, "green" => 6, "red" => 2},
+
%{"blue" => 9, "green" => 1, "red" => 2},
+
%{"blue" => 3, "green" => 12}
+
]},
+
{12,
+
[
+
%{"blue" => 1, "green" => 12, "red" => 1},
+
%{"blue" => 1, "green" => 6, "red" => 2},
+
%{"blue" => 1, "green" => 6, "red" => 6},
+
%{"green" => 3, "red" => 6}
+
]},
+
{13,
+
[
+
%{"blue" => 3, "green" => 19, "red" => 5},
+
%{"blue" => 7, "green" => 11, "red" => 6},
+
%{"blue" => 8, "red" => 6},
+
%{"blue" => 3, "green" => 4, "red" => 4},
+
%{"blue" => 5, "green" => 15, "red" => 8},
+
%{"blue" => 5, "green" => 10, "red" => 2}
+
]},
+
{14,
+
[
+
%{"blue" => 5, "green" => 9},
+
%{"blue" => 6, "green" => 4},
+
%{"blue" => 4, "green" => 14, "red" => 1},
+
%{"blue" => 3, "green" => 3},
+
%{"green" => 2},
+
%{"blue" => 5, "green" => 7, "red" => 1}
+
]},
+
{15,
+
[
+
%{"blue" => 8, "red" => 5},
+
%{"blue" => 9, "red" => 3},
+
%{"blue" => 16, "green" => 1, "red" => 5},
+
%{"blue" => 1, "green" => 2, "red" => 3},
+
%{"blue" => 10, "green" => 2, "red" => 5}
+
]},
+
{16,
+
[
+
%{"blue" => 6, "green" => 9, "red" => 10},
+
%{"blue" => 8, "green" => 14, "red" => 9},
+
%{"blue" => 1, "green" => 7, "red" => 1},
+
%{"blue" => 8, "green" => 5, "red" => 8},
+
%{"blue" => 5, "green" => 14, "red" => 10},
+
%{"blue" => 7, "green" => 3, "red" => 11}
+
]},
+
{17,
+
[
+
%{"blue" => 12, "green" => 6, "red" => 12},
+
%{"blue" => 17, "green" => 14, "red" => 4},
+
%{"blue" => 11, "green" => 13, "red" => 1}
+
]},
+
{18,
+
[
+
%{"blue" => 7, "green" => 2, "red" => 4},
+
%{"blue" => 1, "green" => 2, "red" => 4},
+
%{"blue" => 17, "red" => 2}
+
]},
+
{19,
+
[
+
%{"green" => 9, "red" => 3},
+
%{"blue" => 2, "green" => 2, "red" => 8},
+
%{"blue" => 3, "green" => 15, "red" => 11},
+
%{"blue" => 1, "green" => 18, "red" => 3}
+
]},
+
{20,
+
[
+
%{"blue" => 16, "green" => 5, "red" => 5},
+
%{"blue" => 8, "green" => 6, "red" => 4},
+
%{"blue" => 11, "red" => 10},
+
%{"blue" => 5, "green" => 5, "red" => 5}
+
]},
+
{21,
+
[
+
%{"blue" => 3, "green" => 14, "red" => 1},
+
%{"blue" => 6, "green" => 17, "red" => 6},
+
%{"blue" => 17, "green" => 12, "red" => 3},
+
%{"blue" => 19, "green" => 15, "red" => 1},
+
%{"blue" => 18, "green" => 4, "red" => 3}
+
]},
+
{22,
+
[
+
%{"blue" => 15},
+
%{"blue" => 11, "green" => 1, "red" => 2},
+
%{"green" => 1, "red" => 7},
+
%{"blue" => 18, "green" => 1, "red" => 1},
+
%{"blue" => 16},
+
%{"blue" => 6, "red" => 3}
+
]},
+
{23,
+
[
+
%{"blue" => 11, "green" => 6, "red" => 4},
+
%{"blue" => 8, "green" => 9, "red" => 11},
+
%{"blue" => 2, "green" => 5, "red" => 5},
+
%{"blue" => 4, "green" => 11, "red" => 11},
+
%{"blue" => 9, "green" => 3, "red" => 2}
+
]},
+
{24,
+
[
+
%{"green" => 7, "red" => 2},
+
%{"blue" => 1, "green" => 15, "red" => 8},
+
%{"blue" => 6, "green" => 6, "red" => 3}
+
]},
+
{25,
+
[
+
%{"blue" => 9, "green" => 9},
+
%{"blue" => 7, "green" => 3, "red" => 1},
+
%{"blue" => 1, "green" => 6, "red" => 1},
+
%{"blue" => 1, "green" => 6, "red" => 1}
+
]},
+
{26,
+
[
+
%{"blue" => 15, "green" => 1, "red" => 1},
+
%{"blue" => 12, "green" => 1, "red" => 1},
+
%{"blue" => 16},
+
%{"blue" => 14, "green" => 11, "red" => 5},
+
%{"blue" => 14, "green" => 6, "red" => 4}
+
]},
+
{27,
+
[
+
%{"green" => 9, "red" => 14},
+
%{"blue" => 6, "green" => 5, "red" => 11},
+
%{"blue" => 6, "green" => 9, "red" => 1}
+
]},
+
{28,
+
[
+
%{"blue" => 1, "green" => 6, "red" => 9},
+
%{"green" => 1, "red" => 9},
+
%{"red" => 7},
+
%{"blue" => 1, "green" => 2, "red" => 11},
+
%{"green" => 10, "red" => 8},
+
%{"blue" => 1, "green" => 6, "red" => 5}
+
]},
+
{29,
+
[
+
%{"blue" => 19, "green" => 3, "red" => 1},
+
%{"blue" => 9, "red" => 1},
+
%{"blue" => 17, "green" => 8},
+
%{"blue" => 11, "green" => 4}
+
]},
+
{30, [%{"blue" => 7}, %{"blue" => 5, "green" => 1, "red" => 1}, %{"blue" => 3, "red" => 1}]},
+
{31,
+
[
+
%{"blue" => 1, "green" => 2, "red" => 9},
+
%{"blue" => 3, "green" => 1, "red" => 5},
+
%{"green" => 2, "red" => 7},
+
%{"green" => 2, "red" => 12}
+
]},
+
{32,
+
[
+
%{"blue" => 1, "green" => 17, "red" => 1},
+
%{"blue" => 14, "green" => 10, "red" => 6},
+
%{"blue" => 11, "green" => 12, "red" => 3}
+
]},
+
{33,
+
[
+
%{"blue" => 3, "green" => 1, "red" => 2},
+
%{"blue" => 7, "green" => 4},
+
%{"blue" => 5, "green" => 3, "red" => 1}
+
]},
+
{34,
+
[
+
%{"blue" => 9, "green" => 1, "red" => 9},
+
%{"blue" => 12, "green" => 2, "red" => 12},
+
%{"blue" => 3, "red" => 12},
+
%{"blue" => 14, "green" => 2, "red" => 11},
+
%{"blue" => 12, "red" => 10}
+
]},
+
{35,
+
[
+
%{"blue" => 6, "red" => 2},
+
%{"blue" => 5},
+
%{"blue" => 9, "green" => 6, "red" => 3},
+
%{"blue" => 2, "green" => 3, "red" => 1}
+
]},
+
{36,
+
[
+
%{"blue" => 9, "green" => 4, "red" => 6},
+
%{"green" => 4, "red" => 2},
+
%{"green" => 3, "red" => 7},
+
%{"blue" => 2, "green" => 6},
+
%{"blue" => 4, "green" => 3, "red" => 3},
+
%{"blue" => 16, "green" => 3, "red" => 4}
+
]},
+
{37,
+
[
+
%{"blue" => 4, "green" => 2, "red" => 8},
+
%{"blue" => 4, "green" => 2, "red" => 3},
+
%{"blue" => 5, "green" => 3},
+
%{"blue" => 9, "green" => 15},
+
%{"blue" => 7, "green" => 11, "red" => 5}
+
]},
+
{38,
+
[
+
%{"blue" => 1, "red" => 12},
+
%{"blue" => 2, "green" => 3, "red" => 10},
+
%{"blue" => 7, "green" => 3, "red" => 8},
+
%{"green" => 2, "red" => 14}
+
]},
+
{39,
+
[
+
%{"blue" => 17, "green" => 16, "red" => 2},
+
%{"blue" => 13, "green" => 4, "red" => 6},
+
%{"blue" => 7, "green" => 1, "red" => 4},
+
%{"blue" => 3, "green" => 2},
+
%{"blue" => 17, "green" => 12, "red" => 6},
+
%{"blue" => 2, "green" => 6, "red" => 5}
+
]},
+
{40,
+
[
+
%{"blue" => 4, "green" => 3, "red" => 2},
+
%{"green" => 2, "red" => 3},
+
%{"blue" => 6, "green" => 6, "red" => 2},
+
%{"green" => 5},
+
%{"blue" => 3, "green" => 5, "red" => 1}
+
]},
+
{41,
+
[
+
%{"green" => 13, "red" => 11},
+
%{"blue" => 1, "green" => 3, "red" => 2},
+
%{"blue" => 1, "green" => 3, "red" => 9},
+
%{"green" => 11, "red" => 12},
+
%{"green" => 1, "red" => 9},
+
%{"green" => 9, ...}
+
]},
+
{42,
+
[
+
%{"blue" => 2, "green" => 4},
+
%{"blue" => 6, "green" => 10},
+
%{"blue" => 13, "green" => 6, "red" => 3},
+
%{"blue" => 11, "green" => 17},
+
%{"blue" => 8, ...}
+
]},
+
{43,
+
[
+
%{"blue" => 2, "green" => 10, "red" => 10},
+
%{"blue" => 3, "green" => 5, "red" => 3},
+
%{"blue" => 4, "green" => 10, ...},
+
%{"green" => 5},
+
%{...}
+
]},
+
{44,
+
[
+
%{"blue" => 1, "green" => 5, "red" => 4},
+
%{"blue" => 1, "green" => 3, ...},
+
%{"blue" => 1, ...},
+
%{...},
+
...
+
]},
+
{45, [%{"blue" => 7, "green" => 4, ...}, %{"blue" => 3, ...}, %{...}, ...]},
+
{46, [%{"blue" => 5, ...}, %{...}, ...]},
+
{47, [%{...}, ...]},
+
{48, [...]},
+
{49, ...},
+
{...},
+
...
+
]
+
```
+
+
## Part 1
+
+
```elixir
+
games
+
|> Enum.filter(fn {_, picks} ->
+
Enum.all?(picks, fn map ->
+
Map.get(map, "red", 0) <= 12 and Map.get(map, "green", 0) <= 13 and
+
Map.get(map, "blue", 0) <= 14
+
end)
+
end)
+
|> Enum.map(&elem(&1, 0))
+
|> Enum.sum()
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
2162
+
```
+
+
## Part 2
+
+
```elixir
+
games
+
|> Enum.map(fn {_, picks} ->
+
picks
+
|> Enum.reduce([0, 0, 0], fn hand, [r, g, b] ->
+
[
+
max(Map.get(hand, "red", 0), r),
+
max(Map.get(hand, "green", 0), g),
+
max(Map.get(hand, "blue", 0), b)
+
]
+
end)
+
|> Enum.product()
+
end)
+
|> Enum.sum()
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
72513
+
```
+
+
<!-- livebook:{"offset":15042,"stamp":{"token":"XCP.FeGN4d2e9dnN-0MEzQ7fkG8b8Y3D1FEiGVZmcvfp_IBmCEdpr8gG7HkIpV-Id27eJzCE5vj63AzjPXXsdEgWHwh-T5OO4n9ak1Zs__R9RD4uOYpy2NSEJkYkMGlwtPNvlg","version":2}} -->
+319
2023/day03.livemd
···
+
<!-- livebook:{"persist_outputs":true} -->
+
+
# Day 03
+
+
```elixir
+
Mix.install([
+
:kino_aoc
+
])
+
```
+
+
## Section
+
+
<!-- livebook:{"attrs":{"assign_to":"puzzle_input","day":"3","session_secret":"ADVENT_OF_CODE_SESSION","year":"2023"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
+
+
```elixir
+
{:ok, puzzle_input} =
+
KinoAOC.download_puzzle("2023", "3", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
{:ok,
+
".......12.......935............184.720...243........589.652..........435..........483.............6...........................904...........\n......*.....968*.....$............*........=..348...*..........986....*...................459....*........422................#......%482....\n....291............612....290..........903........699......218*.......376............890....*.838...81......*.....138.../194................\n..............156......$..*...891.&731....%..89...................523..........699....+...227......*.......225....=...........388....*......\n................*...189..591.*................*.......783.....107..-...54.287..$................533.../..............909........&.603.424...\n...229*952.....938............470.555.......746...28.....+...*.........................................279..826..788*.......................\n...................................*...............@.........867.-....102..845...542.779.....................*........182.166...511.........\n563.727.....282....237..171.......892...183.......................989....*..........*................$....709...8*974.=...%.....*.....873...\n....#..........+...*.......*..........................&......129+......491...................877....715.......................270.......#...\n.................53.....781...&295....@773.336......547................................45......*.............=800.....*359..................\n...342*468....&.....573....................*.................................%850............*..465................192.....*.......&115.....\n............988.......*...731.............789.673....*256..............677..................621...........#....716......910..297........22..\n204&....69............905...=.....641.472.......#.524............127....*..714.........*62..........622..324..&.................*...........\n..........*........................+....@.................812......*..955.....*.....257....../.................../..............545.........\n........668....91..&.........840......+..............566.....+...66.........660..............469.................525...765...........25.....\n...............$...666.979..*........952...122......%............................71......=39...../94.........................132......*.....\n......@.................../.460..#.......=.=..........146..625........214.........#.278................667..........386.......-....936......\n....643.......@..................974...464...........*.....*...........*.............%.....$...........=...=..%995...*......................\n........./...577...-....3.../186.................*.995.....678.&.......882...559...........374.......&...554.........428.......725....*.....\n.......96........678....%.....................529..............374...........*......924........=277..606..................#...#......8.257..\n...609....................397.......475...................651.......856......697.&.....&..=...................486........888................\n............-................*..................756...399....*..42................866....287.....#......515...*......................137....\n.....285..947....#..........997......=.....665..*......*..420...*.....-..268*457.............=63..758.....+..623.............+../...........\n..............458.....422.......338...827...+..462....797.....26....523..........*.880*.............................&.....934..157..........\n.......149........409....$................................................868.378......144..149............356.....872..............871.533.\n....22...*..........$........7.......149....979......................826.&.....................@........-.....*275.....................*....\n........518.773*.........10..$..........*........805..812.972......................123......*............98.........=........./609.682......\n.................5........./............349........$.....*..................786....*.......160..903...40.............209...............*....\n.......*.....................................497...........#.............../.....153.795............./.........&806..........839....419.337.\n78...58" <> ...}
+
```
+
+
```elixir
+
IO.puts(puzzle_input)
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
.......12.......935............184.720...243........589.652..........435..........483.............6...........................904...........
+
......*.....968*.....$............*........=..348...*..........986....*...................459....*........422................#......%482....
+
....291............612....290..........903........699......218*.......376............890....*.838...81......*.....138.../194................
+
..............156......$..*...891.&731....%..89...................523..........699....+...227......*.......225....=...........388....*......
+
................*...189..591.*................*.......783.....107..-...54.287..$................533.../..............909........&.603.424...
+
...229*952.....938............470.555.......746...28.....+...*.........................................279..826..788*.......................
+
...................................*...............@.........867.-....102..845...542.779.....................*........182.166...511.........
+
563.727.....282....237..171.......892...183.......................989....*..........*................$....709...8*974.=...%.....*.....873...
+
....#..........+...*.......*..........................&......129+......491...................877....715.......................270.......#...
+
.................53.....781...&295....@773.336......547................................45......*.............=800.....*359..................
+
...342*468....&.....573....................*.................................%850............*..465................192.....*.......&115.....
+
............988.......*...731.............789.673....*256..............677..................621...........#....716......910..297........22..
+
204&....69............905...=.....641.472.......#.524............127....*..714.........*62..........622..324..&.................*...........
+
..........*........................+....@.................812......*..955.....*.....257....../.................../..............545.........
+
........668....91..&.........840......+..............566.....+...66.........660..............469.................525...765...........25.....
+
...............$...666.979..*........952...122......%............................71......=39...../94.........................132......*.....
+
......@.................../.460..#.......=.=..........146..625........214.........#.278................667..........386.......-....936......
+
....643.......@..................974...464...........*.....*...........*.............%.....$...........=...=..%995...*......................
+
........./...577...-....3.../186.................*.995.....678.&.......882...559...........374.......&...554.........428.......725....*.....
+
.......96........678....%.....................529..............374...........*......924........=277..606..................#...#......8.257..
+
...609....................397.......475...................651.......856......697.&.....&..=...................486........888................
+
............-................*..................756...399....*..42................866....287.....#......515...*......................137....
+
.....285..947....#..........997......=.....665..*......*..420...*.....-..268*457.............=63..758.....+..623.............+../...........
+
..............458.....422.......338...827...+..462....797.....26....523..........*.880*.............................&.....934..157..........
+
.......149........409....$................................................868.378......144..149............356.....872..............871.533.
+
....22...*..........$........7.......149....979......................826.&.....................@........-.....*275.....................*....
+
........518.773*.........10..$..........*........805..812.972......................123......*............98.........=........./609.682......
+
.................5........./............349........$.....*..................786....*.......160..903...40.............209...............*....
+
.......*.....................................497...........#.............../.....153.795............./.........&806..........839....419.337.
+
78...582............675................145.........405....77..361............952.......*..../741....................624..527*...............
+
...................../../....=.....+....&.............*51.....*..........733*.........728.........173....834.....76.........................
+
................878....276..792.....372....................385..179.............@610.............................%........146=..............
+
..........522.....*...........................-....30....-........*.@................110=..+.......197.....643.................762......%...
+
......%....*...173.............420..407......261.........687.806.12..104.....914..........685.233.&.......*.....549...=...........*......591
+
.....837..135.......313...579....%.=.....613................../..........729.........257#.....&.........430.399*.....157.........970........
+
...................*.....*.....*......@.....*............../....566........+.....................*906....................%..................
+
....459.78$.775.768..62...345.537......122.803.142*758...148...*....992................711....316.........#...............521.298*590..289..
+
....*.................#.........................................444............382.....*...@...............753.......927................/...
+
.....592..735......+.............634.......652.....853....690................./.......874.846.35.....884.........182.-......................
+
.419........*.839.157.......795...................*.......*...........928........................756....*64......*.....*19.....309..........
+
.........716...*.......591....*....358$.#378.............623...............687.........-816......*............292...110....&....*......643..
+
..134...........910......*.941.......................................547=....*....................490....938+..............422.482..........
+
...*..331....$..........80.................#346....180...........737.........76.......992@...91......................../....................
+
...16....$.140.464*831.....933.917....303............*......%.....*....336........339.......*.............@..939....583....*564.........864.
+
..............................*........=...+54.....449......209.912.....+.....615..%.....605............960..*..........219.................
+
.........@442.....730..................................413...........................26.....................944..336........188......./.....
+
...190............#...@...524.544....968*.............*........466...222...536...843.@..........=.....32...........$..........-.......410...
+
......*..80@..491....232..-......*.......16........402......27..*...*.....*...................480....*........&........894..................
+
.....218.........*.............=..819......................*........857...896...........677........689........638...45*.....993.............
+
................754...........434.........622.338...........607....................&......&.%213...........................-................
+
........+.894......................681.......*.........484.........963.498...*..538.............................................346.........
+
.....802.....*162....752...........................................*........520...........229.2.586..513..............25=.746........782*423
+
...............................@...307#.497....551..996..696....879...911................%......................277*........................
+
....*157.....137....#.........621.........*...#.....*...#............*............527......9........./..............844.....@224....304.....
+
.541............*.649.............412.....744......560..............404.....240.......986*.@.......346.....@..........................+.....
+
......268....764.................%.......................902....856.......*....*..........................242.....842.....#.................
+
........&...............514..38..........+..=...........@..............715.142..587.......307.................731...*...954....878*.........
+
............................*.....349....76.92....612.....376.......................257...$...................../.968..............765......
+
........960*414........713.501......&............%.......*......*941............................#........415...........937%.................
+
....967............409..*......605......................375..771........599*884.................880.........*...127..$.................$513.
+
.....*................*..171..*.....@.......507.895..................*.................636...........768...114....-..292.......-...223......
+
...807...977.......218.......753...47.......*......*..............507.90....../725.......*.........+...@.....................755......*.....
+
............*478.............................542....676...............................673........974.....@....*170....261..............134..
+
800...............532............................15............%...445..102.............../510.........625.279..........-.....*.............
+
.......................654.....850.405......................395.....-.......467....477...........973............../........191........398...
+
.925...793...423*.........@..........................................................=.659..........*.....817.....230...........653..-......
+
.......*.........52...........764$....273...................@........430....................................*...........669.....-.......71..
+
.435....804..177....990.838.........#..-...475...297..337..360.........*....914.............................833.............................
+
....*.......*.........*...*.......281......&......*..+.............328..746......=215.......359....295.....................#481......868....
+
..967........936.689%.785..515...............*64.827........................761.........+....&.......+..............................*....637
+
....../.+265..............................562...............235........585..*...........793........=...838.147....284.902..301*330..........
+
....579.........................21%..327................481..*...469%..*.....297.704..............797.....*...........*.................#...
+
......................638............*...................*....81.......780.........*...../...282....................907.882.781.......797...
+
..........671....608.................295.................302......953............171..919.......*........................*...*......#.......
+
............*....*....251.....191........#............*..........................................999.....451....+....286.415.581....274.....
+
..245$.....217...649.-....................898......950..................495*497.......53*............@...........398..-.....................
+
...........................942.......323...............+.....623.........................804.......875........................#.............
+
.....42..543.................*..320....*..918....314....145...........603......991$.921.......261......................762...187.....951*638
+
.....*..#........53........374........756...........*.........-.......................*........../..217*550..............*..................
+
....217..........*................................743......703....368...$861..4*966.415..703................................*959........*344
+
...........626...31...602.................700..........696........*.....................*......396..........591.......*124..................
+
..135........@................................699.139.....*.662....46........=797......144.....#...*289......*.....840............-...102.44
+
................909.......180.............100.*....#...574..*............52...................................451............764.517....*...
+
........701*..........127*............117../...787...........67.....903..........273....*900................................=..........112..
+
............430............423.67.......*..............*572...........@...199.........94..........686.....679.....................921*......
+
.542*119...............396....*.......938...........250......888..........*.....978...................25..../.........306.............780...
+
...............251........*.....................238......................340....+..............112....*........120...*....24................
+
.223.....549......-..98..60..775..28*105...........*.436..951.599.................309*682.......*..937...158.....*....697.*......764..$.....
+
.....788............#....................768.....266........*..%..............................779........*.......542.......148...*....529...
+
....*......310.............412.......23.+....289..........560............249+.204..606*................271...805.......394.......898........
+
....919.......&...867.......*........*......%.........592............166.........*.....460.........369..........*........*..................
+
.........920.......*.....233.....732..500.....950.....*.......514...........110..961..................*309.....450..#...521.................
+
.................753...............*............#...965..............................852...841....%........524.....981............653.......
+
...........858...........*..234..922........65..................991.........-839.800....*......869...836..$.............675..789...*....505.
+
..........*.............516...*..................774.....&.149.=.................*.......737.........*......402....%.......*....#..762......
+
........780.........4.........116.....................976..-...........%........791..................300.....%....338.471...................
+
...................*.................480*160..3..............*727.....363................................................................167
+
...........743.....721.......................*..........808...............942...........339.289.............$............416.....$..........
+
..955...................606*623.............718...503....*...................*245..........*........531.....686......250..../....275........
+
.............@....................110...............*...309..#....&......210..........386.................%...........*........+........391.
+
.....444.....743......519..691......*.......-824......+......759.617....*.......710..*.....814.........356.........464.......709............
+
......*..746......247.....*......596..999.............907.............296.-..../.......760.+.................$.890.......................669
+
...479.....*.........*.......561.....+..........*178......................977....266...*.....640..........607.....*.....%...........545.....
+
........395...=......361........*372.........655..........398...203..11................147..*......../.............196..499........*........
+
..561........646......................*898.......175.570.....$.....#...*..135..............633..314...871......898..........891...90.....780
+
.......*91........405..............627..............*....736.........760.....*........=..........*...........%....*..........*..............
+
....722...........*......................................*.................744.698.367..-........767..........236.692.......308.............
+
...............740........./............906......*593...977.......645............*......167.............................................*...
+
........+...............123...................281....................*...543......461........................175.....................381.319
+
.282...814......771*........920.......................@............473....*...............&....872...../401.....*......=......18............
+
....*.........%......993...*...........................256..223...........242....977.......293.-...............550.....435..................
+
....23.........960........307....$.....504.638*656...............&...................203.............33.$430..................731...........
+
................................885......*................398....763...........805.....=....338.......*......146*916..................513...
+
..20...............42....................828.............../...................*............$.........531............159*761......78........
+
......805-...-..........598...........#.............351........34.........682..516.534..............*........&..........................283.
+
..............664....../.......255..887.....258......%.........*.........*............*.....226..931.91......128............................
+
...557.938#.......75.....585..*...............*.194......#..686........786..........755.......&..........637..............988.......275.....
+
....*............%....35...*.141...........508.....*865.967..............................80*............./.....978....790*.....@...*........
+
.662..................*..............@939...........................204........484....34....99.............@.................350.54.........
+
............358....832..=......................%......307.95........*......654...*......&.........734.....491...50...924.385................
+
............*............340................483.........-.*.......118..794*.....431...........783..*..............-......*.........&594.#...
+
..........338........=.............$.................*....94....................................*...546.....$.......187..593.768........282.
+
...............796.380.183....+.564..94.144.........138..............394.392.....971.......#928.447........275..57...*.......&..............
+
...........233...*.......%...40........*........................945.....*.........-.................%.............=.438...........*......906
+
.....881.../...491...903..........918.....303......................*........578*...................807......597................681.539......
+
......*.................*.463.467*....246.......577.....198.....245.....967.....988.&.........759.......=...*.........-889..................
+
......462..978........664...%...........*.-731.../.....&....375.............#.......217........@........381.250...219......947..............
+
..........&..........................252.......%.............*..............258............427...137...............@........@....-175.......
+
....864...................461..................234.......69.222........*...........411....=............651...#..............................
+
....*......243...............*283...................777-..*..........92.761..581%.*.....................$.....258..867..876.................
+
.916......%.........629.................911*238...........680...239................672.............137@...469.........*.......737...@.......
+
..............764....*........894/..289...........944..........#...........@....%........../876..........*.........687.........*....436.....
+
......442.255.....442..903.............*.....*493..../......................338..346...................927..............764.....536.........
+
.........*.....*........*.....869*888.597.241..................11-....542#...........412*..................235..............................
+
.804.329......344....195...94.......................................*....................880......44.622.........342.18...............417...
+
....*.....=................+.........76..328.....803.....658.....254.............327..........340......*.............@......................
+
...........254........../...........*...*...........*234...%..........20.....238...*..........*.........380......&......78.246%...598.......
+
.96....990.........%..718...%....869.......596....*......................423.....433..93.....613....$.............905...=........*.....497..
+
...*....*........=.86.....499..............*...385.296...................*...........*...............523.$.....................529...$.*....
+
...780.685.....822....................560.35.............................529......780.....................453......................711..930.
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
:ok
+
```
+
+
```elixir
+
defmodule Day03 do
+
def parse_line("", {_, _, acc}), do: acc
+
def parse_line("." <> rest, {x, y, acc}), do: parse_line(rest, {x + 1, y, acc})
+
+
def parse_line(<<c>> <> _ = str, {x, y, items}) when c in ?0..?9 do
+
{num, rest} = Integer.parse(str)
+
len = floor(:math.log10(num) + 1)
+
ref = make_ref()
+
+
points =
+
for i <- 0..(len - 1) do
+
{{x + i, y}, {ref, num}}
+
end
+
+
parse_line(rest, {x + len, y, points ++ items})
+
end
+
+
def parse_line(<<c>> <> rest, {x, y, items}) do
+
parse_line(rest, {x + 1, y, [{{x, y}, <<c>>} | items]})
+
end
+
+
def around({x, y}) do
+
for dx <- -1..1, dy <- -1..1, do: {x + dx, y + dy}
+
end
+
end
+
+
grid =
+
puzzle_input
+
|> String.split()
+
|> Enum.with_index()
+
|> Enum.flat_map(fn {line, y} ->
+
Day03.parse_line(line, {0, y, []})
+
end)
+
+
{parts, ids} =
+
grid
+
|> Enum.split_with(fn {_, value} ->
+
is_binary(value)
+
end)
+
+
parts = Map.new(parts)
+
ids = Map.new(ids)
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
%{
+
{77, 129} => {#Reference<0.407999657.1149239297.248024>, 581},
+
{120, 47} => {#Reference<0.407999657.1149239297.247329>, 894},
+
{4, 5} => {#Reference<0.407999657.1149239297.246955>, 229},
+
{78, 98} => {#Reference<0.407999657.1149239297.247762>, 245},
+
{29, 25} => {#Reference<0.407999657.1149239297.247129>, 7},
+
{4, 81} => {#Reference<0.407999657.1149239297.247606>, 135},
+
{121, 77} => {#Reference<0.407999657.1149239297.247578>, 762},
+
{119, 60} => {#Reference<0.407999657.1149239297.247435>, 292},
+
{111, 108} => {#Reference<0.407999657.1149239297.247847>, 175},
+
{78, 75} => {#Reference<0.407999657.1149239297.247560>, 497},
+
{58, 84} => {#Reference<0.407999657.1149239297.247637>, 572},
+
{58, 33} => {#Reference<0.407999657.1149239297.247193>, 687},
+
{13, 55} => {#Reference<0.407999657.1149239297.247390>, 764},
+
{91, 38} => {#Reference<0.407999657.1149239297.247245>, 846},
+
{9, 58} => {#Reference<0.407999657.1149239297.247412>, 960},
+
{25, 87} => {#Reference<0.407999657.1149239297.247662>, 60},
+
{21, 97} => {#Reference<0.407999657.1149239297.247751>, 721},
+
{126, 48} => {#Reference<0.407999657.1149239297.247338>, 993},
+
{26, 82} => {#Reference<0.407999657.1149239297.247618>, 180},
+
{22, 36} => {#Reference<0.407999657.1149239297.247219>, 62},
+
{79, 81} => {#Reference<0.407999657.1149239297.247611>, 797},
+
{65, 55} => {#Reference<0.407999657.1149239297.247392>, 856},
+
{99, 39} => {#Reference<0.407999657.1149239297.247254>, 756},
+
{52, 42} => {#Reference<0.407999657.1149239297.247279>, 180},
+
{120, 77} => {#Reference<0.407999657.1149239297.247578>, 762},
+
{133, 57} => {#Reference<0.407999657.1149239297.247411>, 765},
+
{68, 81} => {#Reference<0.407999657.1149239297.247610>, 46},
+
{22, 103} => {#Reference<0.407999657.1149239297.247802>, 361},
+
{44, 93} => {#Reference<0.407999657.1149239297.247721>, 65},
+
{87, 32} => {#Reference<0.407999657.1149239297.247185>, 110},
+
{81, 37} => {#Reference<0.407999657.1149239297.247235>, 382},
+
{111, 25} => {#Reference<0.407999657.1149239297.247133>, 275},
+
{98, 0} => {#Reference<0.407999657.1149239297.246916>, 6},
+
{110, 80} => {#Reference<0.407999657.1149239297.247604>, 591},
+
{19, 138} => {#Reference<0.407999657.1149239297.248100>, 86},
+
{88, 62} => {#Reference<0.407999657.1149239297.247449>, 673},
+
{37, 15} => {#Reference<0.407999657.1149239297.247044>, 952},
+
{65, 44} => {#Reference<0.407999657.1149239297.247300>, 912},
+
{28, 20} => {#Reference<0.407999657.1149239297.247083>, 397},
+
{10, 32} => {#Reference<0.407999657.1149239297.247183>, 522},
+
{101, 87} => {#Reference<0.407999657.1149239297.247671>, 937},
+
{87, 2} => {#Reference<0.407999657.1149239297.246931>, 890},
+
{46, 108} => {#Reference<0.407999657.1149239297.247844>, 281},
+
{82, 139} => {#Reference<0.407999657.1149239297.248112>, 780},
+
{137, 104} => {#Reference<0.407999657.1149239297.247823>, 780},
+
{82, 100} => {#Reference<0.407999657.1149239297.247779>, 710},
+
{127, 130} => {#Reference<0.407999657.1149239297.248037>, 737},
+
{45, 130} => {#Reference<0.407999657.1149239297.248031>, 238},
+
{70, ...} => {#Reference<0.407999657.1149239297.247481>, ...},
+
{...} => {...},
+
...
+
}
+
```
+
+
```elixir
+
used_parts =
+
for {xy, _} <- parts,
+
dxy <- Day03.around(xy),
+
{:ok, val} <- [Map.fetch(ids, dxy)],
+
into: %{},
+
do: val
+
+
Enum.sum(Map.values(used_parts))
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
540025
+
```
+
+
```elixir
+
cogs =
+
for {xy, _} <- parts,
+
values =
+
Map.take(ids, Day03.around(xy)) |> Map.values() |> Enum.uniq() |> Enum.map(&elem(&1, 1)),
+
match?([_, _], values),
+
do: Enum.product(values)
+
+
Enum.sum(cogs)
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
84584891
+
```
+
+
<!-- livebook:{"offset":29200,"stamp":{"token":"XCP.Kmaa8IUlkTR7nCbLR-W5rhhxl9NNaLewVW_EJ2PVGiFN7hgDOMjnsiCJwz-6nQSTEtlNsQiyIggbhvyc3xqgrycYYXhrK8jwmysP9jZyz5gn10jjpYBM5XlE5G_2I9xKoA","version":2}} -->
+199
2023/day04.livemd
···
+
<!-- livebook:{"persist_outputs":true} -->
+
+
# Day 04
+
+
```elixir
+
Mix.install([:kino_aoc])
+
```
+
+
## Section
+
+
<!-- livebook:{"attrs":{"assign_to":"puzzle_input","day":"4","session_secret":"ADVENT_OF_CODE_SESSION","year":"2023"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
+
+
```elixir
+
{:ok, puzzle_input} =
+
KinoAOC.download_puzzle("2023", "4", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
{:ok,
+
"Card 1: 43 19 57 13 44 22 29 20 34 33 | 34 68 13 38 32 57 20 64 42 7 44 54 16 51 33 85 43 24 86 93 83 29 25 19 22\nCard 2: 41 56 28 16 47 58 86 8 82 23 | 90 4 63 41 24 8 51 65 39 86 16 53 47 62 74 58 56 82 28 76 37 98 89 67 23\nCard 3: 10 48 83 6 54 51 52 5 22 80 | 36 51 66 86 68 73 93 52 5 65 48 71 85 10 40 22 80 6 20 83 95 54 21 76 92\nCard 4: 17 4 8 74 97 13 52 27 99 95 | 55 31 73 47 95 46 96 69 27 52 45 62 53 12 21 5 74 13 8 50 77 54 91 32 43\nCard 5: 46 50 28 25 44 73 3 14 17 20 | 33 14 44 71 73 59 19 80 40 20 5 6 72 85 47 62 30 50 83 51 24 28 3 77 39\nCard 6: 65 19 45 54 72 39 64 15 3 60 | 91 62 10 73 1 77 25 9 92 7 81 48 19 50 52 32 69 75 24 93 30 60 72 59 53\nCard 7: 41 65 93 76 74 61 59 90 89 87 | 39 61 99 12 71 59 15 10 72 87 41 89 76 88 38 95 90 65 53 80 19 74 93 11 28\nCard 8: 93 64 11 24 13 29 1 51 30 69 | 95 52 7 61 4 44 30 31 64 65 17 34 11 88 71 50 53 73 86 48 60 43 33 51 29\nCard 9: 52 82 95 38 80 53 84 21 93 49 | 41 16 63 88 92 46 23 81 42 3 5 35 8 49 6 22 70 32 38 14 40 61 78 51 10\nCard 10: 41 29 95 65 52 22 51 18 88 44 | 88 92 47 56 71 19 58 52 15 96 25 41 75 29 65 55 43 9 64 81 73 32 5 18 30\nCard 11: 76 66 65 38 41 82 9 81 11 51 | 4 55 70 38 58 17 5 67 26 81 91 48 28 45 83 68 64 66 25 51 95 47 63 71 54\nCard 12: 96 62 75 58 44 72 73 74 9 14 | 20 37 54 97 70 72 18 68 79 3 45 44 15 11 73 59 64 77 61 95 34 16 55 49 2\nCard 13: 79 82 49 23 78 67 45 43 18 11 | 30 28 53 80 13 50 27 70 69 90 18 35 62 98 60 14 38 4 73 15 33 44 77 51 84\nCard 14: 72 65 58 67 11 90 77 21 22 12 | 17 76 4 40 15 22 92 67 43 55 90 79 65 31 71 73 58 12 21 46 20 87 63 77 9\nCard 15: 80 54 73 48 42 70 69 21 23 97 | 31 6 27 93 90 91 16 65 24 25 46 84 37 87 40 58 29 3 64 32 15 62 47 18 94\nCard 16: 15 72 5 85 34 50 49 22 65 64 | 72 92 38 37 79 84 67 93 36 88 50 8 44 19 85 73 76 41 2 45 21 86 6 49 16\nCard 17: 7 70 36 21 60 80 50 31 23 59 | 6 18 1 92 40 22 30 69 38 14 56 81 25 11 77 62 44 4 85 5 82 45 37 24 64\nCard 18: 63 61 70 64 94 76 25 15 26 89 | 22 78 89 65 23 3 29 50 34 72 32 43 8 62 21 15 20 94 68 53 12 84 99 39 57\nCard 19: 34 56 99 80 89 90 47 57 84 39 | 82 6 93 38 61 32 30 46 55 94 85 53 18 1 16 33 11 98 37 5 65 48 12 17 41\nCard 20: 90 72 6 31 62 86 1 29 34 70 | 64 84 86 29 90 3 89 50 6 54 92 85 98 32 63 24 83 43 99 59 77 12 56 38 69\nCard 21: 65 22 72 35 30 38 3 10 98 95 | 63 65 21 71 94 58 25 16 66 51 20 75 28 11 15 24 87 56 83 31 67 1 97 64 52\nCard 22: 95 70 39 21 87 97 98 96 30 6 | 72 26 52 65 62 10 60 49 46 36 25 55 11 42 1 31 3 73 48 29 63 51 66 17 34\nCard 23: 72 74 91 77 42 31 15 61 80 85 | 59 62 43 19 17 16 49 83 95 35 76 67 99 46 48 44 84 98 97 13 51 55 79 29 65\nCard 24: 3 74 76 13 52 81 40 84 73 98 | 23 71 42 2 83 5 18 75 57 41 38 46 60 66 49 62 36 51 12 86 25 22 82 79 1\nCard 25: 39 25 66 16 13 27 48 78 52 23 | 43 48 98 13 88 66 55 18 71 91 11 94 75 96 89 16 4 23 51 50 62 95 63 44 81\nCard 26: 66 30 18 57 40 36 60 95 99 15 | 60 22 73 21 69 84 95 66 51 57 49 12 30 79 99 70 46 61 92 37 36 40 18 31 39\nCard 27: 54 11 56 55 83 78 47 57 50 19 | 45 70 77 49 12 41 69 78 91 20 51 67 3 6 22 62 27 60 4 63 59 75 43 95 31\nCard 28: 71 72 99 35 76 23 8 44 46 53 | 25 97 99 77 37 23 51 22 65 62 60 46 4 47 92 84 9 61 24 82 52 58 39 32 88\nCard 29: 69 33 37 74 19 38 81 82 62 66 | 42 3 67 30 52 90 47 46 34 4 1 71 98 50 54 94 58 15 28 83 91 59 22 78 86\nCard 30: 25 5 15 20 84 23 86 74 50 22 | 20 85 71 46 21 92 61 15 22 73 51 1 84 86 49 25 57 33 44 82 45 5 23 50 74\nCard 31: 26 60 71 4 51 57 81 61 99 64 | 13 70 71 77 9 68 76 99 97 55 94 4 98 34 27 54 61 11 26 31 57 81 39 51 60\nCard 32: 61 16 7 90 49 39 24 34 35 17 | 90 75 34 25 39 26 59 67 24 35 62 19 17 54 31 16 71 76 7 64 8 60 61 13 82\nCard 33: 91 74 62 52 86 6 46 60 16 88 | 27 4 32 1 74 52 69 19 62 16 91 26 86 22 55 59 6 60 83 65 18 72 93 53 41\nCard 34: 79 47 49 71 56 89 21 14 29 58 | 80 2 93 71 37 3 33 70 9 18 20 97 85 6 96 73 35 52 74 63 55 99 41 46 44\nCard 35: 13 30 58 94 50 44 38 99 40 9 | 5 75 79 40 84 20 9 2 67 95 24 30 96 62 50 45 28 99 71 26 52 74 54 44 66\nC" <> ...}
+
```
+
+
```elixir
+
cards =
+
puzzle_input
+
|> String.split("\n", trim: true)
+
|> Enum.map(fn "Card" <> rest ->
+
{id, ": " <> rest} = rest |> String.trim() |> Integer.parse()
+
+
[wins, inputs] =
+
rest
+
|> String.split(" | ")
+
|> Enum.map(fn part ->
+
part
+
|> String.split()
+
|> Enum.map(&String.to_integer/1)
+
end)
+
+
{id, wins, inputs}
+
end)
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
[
+
{1, [43, 19, 57, 13, 44, 22, 29, 20, 34, 33],
+
[34, 68, 13, 38, 32, 57, 20, 64, 42, 7, 44, 54, 16, 51, 33, 85, 43, 24, 86, 93, 83, 29, 25, 19,
+
22]},
+
{2, [41, 56, 28, 16, 47, 58, 86, 8, 82, 23],
+
[90, 4, 63, 41, 24, 8, 51, 65, 39, 86, 16, 53, 47, 62, 74, 58, 56, 82, 28, 76, 37, 98, 89, 67,
+
23]},
+
{3, [10, 48, 83, 6, 54, 51, 52, 5, 22, 80],
+
[36, 51, 66, 86, 68, 73, 93, 52, 5, 65, 48, 71, 85, 10, 40, 22, 80, 6, 20, 83, 95, 54, 21, 76,
+
92]},
+
{4, [17, 4, 8, 74, 97, 13, 52, 27, 99, 95],
+
[55, 31, 73, 47, 95, 46, 96, 69, 27, 52, 45, 62, 53, 12, 21, 5, 74, 13, 8, 50, 77, 54, 91, 32,
+
43]},
+
{5, [46, 50, 28, 25, 44, 73, 3, 14, 17, 20],
+
[33, 14, 44, 71, 73, 59, 19, 80, 40, 20, 5, 6, 72, 85, 47, 62, 30, 50, 83, 51, 24, 28, 3, 77, 39]},
+
{6, [65, 19, 45, 54, 72, 39, 64, 15, 3, 60],
+
[91, 62, 10, 73, 1, 77, 25, 9, 92, 7, 81, 48, 19, 50, 52, 32, 69, 75, 24, 93, 30, 60, 72, 59, 53]},
+
{7, ~c")A]LJ=;ZYW",
+
[39, 61, 99, 12, 71, 59, 15, 10, 72, 87, 41, 89, 76, 88, 38, 95, 90, 65, 53, 80, 19, 74, 93, 11,
+
28]},
+
{8, [93, 64, 11, 24, 13, 29, 1, 51, 30, 69],
+
[95, 52, 7, 61, 4, 44, 30, 31, 64, 65, 17, 34, 11, 88, 71, 50, 53, 73, 86, 48, 60, 43, 33, 51,
+
29]},
+
{9, [52, 82, 95, 38, 80, 53, 84, 21, 93, 49],
+
[41, 16, 63, 88, 92, 46, 23, 81, 42, 3, 5, 35, 8, 49, 6, 22, 70, 32, 38, 14, 40, 61, 78, 51, 10]},
+
{10, [41, 29, 95, 65, 52, 22, 51, 18, 88, 44],
+
[88, 92, 47, 56, 71, 19, 58, 52, 15, 96, 25, 41, 75, 29, 65, 55, 43, 9, 64, 81, 73, 32, 5, 18,
+
30]},
+
{11, ~c"LBA&)R\tQ\v3",
+
[4, 55, 70, 38, 58, 17, 5, 67, 26, 81, 91, 48, 28, 45, 83, 68, 64, 66, 25, 51, 95, 47, 63, 71,
+
54]},
+
{12, [96, 62, 75, 58, 44, 72, 73, 74, 9, 14],
+
[20, 37, 54, 97, 70, 72, 18, 68, 79, 3, 45, 44, 15, 11, 73, 59, 64, 77, 61, 95, 34, 16, 55, 49,
+
2]},
+
{13, [79, 82, 49, 23, 78, 67, 45, 43, 18, 11],
+
[30, 28, 53, 80, 13, 50, 27, 70, 69, 90, 18, 35, 62, 98, 60, 14, 38, 4, 73, 15, 33, 44, 77, 51,
+
84]},
+
{14, [72, 65, 58, 67, 11, 90, 77, 21, 22, 12],
+
[17, 76, 4, 40, 15, 22, 92, 67, 43, 55, 90, 79, 65, 31, 71, 73, 58, 12, 21, 46, 20, 87, 63, 77,
+
9]},
+
{15, [80, 54, 73, 48, 42, 70, 69, 21, 23, 97],
+
[31, 6, 27, 93, 90, 91, 16, 65, 24, 25, 46, 84, 37, 87, 40, 58, 29, 3, 64, 32, 15, 62, 47, 18,
+
94]},
+
{16, [15, 72, 5, 85, 34, 50, 49, 22, 65, 64],
+
[72, 92, 38, 37, 79, 84, 67, 93, 36, 88, 50, 8, 44, 19, 85, 73, 76, 41, 2, 45, 21, 86, 6, 49, 16]},
+
{17, [7, 70, 36, 21, 60, 80, 50, 31, 23, 59],
+
[6, 18, 1, 92, 40, 22, 30, 69, 38, 14, 56, 81, 25, 11, 77, 62, 44, 4, 85, 5, 82, 45, 37, 24, 64]},
+
{18, [63, 61, 70, 64, 94, 76, 25, 15, 26, 89],
+
[22, 78, 89, 65, 23, 3, 29, 50, 34, 72, 32, 43, 8, 62, 21, 15, 20, 94, 68, 53, 12, 84, 99, 39,
+
57]},
+
{19, ~c"\"8cPYZ/9T'",
+
[82, 6, 93, 38, 61, 32, 30, 46, 55, 94, 85, 53, 18, 1, 16, 33, 11, 98, 37, 5, 65, 48, 12, 17, 41]},
+
{20, [90, 72, 6, 31, 62, 86, 1, 29, 34, 70],
+
[64, 84, 86, 29, 90, 3, 89, 50, 6, 54, 92, 85, 98, 32, 63, 24, 83, 43, 99, 59, 77, 12, 56, 38,
+
69]},
+
{21, [65, 22, 72, 35, 30, 38, 3, 10, 98, 95],
+
[63, 65, 21, 71, 94, 58, 25, 16, 66, 51, 20, 75, 28, 11, 15, 24, 87, 56, 83, 31, 67, 1, 97, 64,
+
52]},
+
{22, [95, 70, 39, 21, 87, 97, 98, 96, 30, 6],
+
[72, 26, 52, 65, 62, 10, 60, 49, 46, 36, 25, 55, 11, 42, 1, 31, 3, 73, 48, 29, 63, 51, 66, 17,
+
34]},
+
{23, [72, 74, 91, 77, 42, 31, 15, 61, 80, 85],
+
[59, 62, 43, 19, 17, 16, 49, 83, 95, 35, 76, 67, 99, 46, 48, 44, 84, 98, 97, 13, 51, 55, 79, 29,
+
...]},
+
{24, [3, 74, 76, 13, 52, 81, 40, 84, 73, 98],
+
[23, 71, 42, 2, 83, 5, 18, 75, 57, 41, 38, 46, 60, 66, 49, 62, 36, 51, 12, 86, 25, 22, 82, ...]},
+
{25, [39, 25, 66, 16, 13, 27, 48, 78, 52, 23],
+
[43, 48, 98, 13, 88, 66, 55, 18, 71, 91, 11, 94, 75, 96, 89, 16, 4, 23, 51, 50, 62, 95, ...]},
+
{26, [66, 30, 18, 57, 40, 36, 60, 95, 99, 15],
+
[60, 22, 73, 21, 69, 84, 95, 66, 51, 57, 49, 12, 30, 79, 99, 70, 46, 61, 92, 37, 36, ...]},
+
{27, [54, 11, 56, 55, 83, 78, 47, 57, 50, 19],
+
[45, 70, 77, 49, 12, 41, 69, 78, 91, 20, 51, 67, 3, 6, 22, 62, 27, 60, 4, 63, ...]},
+
{28, [71, 72, 99, 35, 76, 23, 8, 44, 46, 53],
+
[25, 97, 99, 77, 37, 23, 51, 22, 65, 62, 60, 46, 4, 47, 92, 84, 9, 61, 24, ...]},
+
{29, [69, 33, 37, 74, 19, 38, 81, 82, 62, 66],
+
[42, 3, 67, 30, 52, 90, 47, 46, 34, 4, 1, 71, 98, 50, 54, 94, 58, 15, ...]},
+
{30, [25, 5, 15, 20, 84, 23, 86, 74, 50, 22],
+
[20, 85, 71, 46, 21, 92, 61, 15, 22, 73, 51, 1, 84, 86, 49, 25, 57, ...]},
+
{31, [26, 60, 71, 4, 51, 57, 81, 61, 99, 64],
+
[13, 70, 71, 77, 9, 68, 76, 99, 97, 55, 94, 4, 98, 34, 27, 54, ...]},
+
{32, [61, 16, 7, 90, 49, 39, 24, 34, 35, 17],
+
[90, 75, 34, 25, 39, 26, 59, 67, 24, 35, 62, 19, 17, 54, 31, ...]},
+
{33, [91, 74, 62, 52, 86, 6, 46, 60, 16, 88],
+
[27, 4, 32, 1, 74, 52, 69, 19, 62, 16, 91, 26, 86, 22, ...]},
+
{34, [79, 47, 49, 71, 56, 89, 21, 14, 29, 58],
+
[80, 2, 93, 71, 37, 3, 33, 70, 9, 18, 20, 97, 85, ...]},
+
{35, [13, 30, 58, 94, 50, 44, 38, 99, 40, 9], [5, 75, 79, 40, 84, 20, 9, 2, 67, 95, 24, 30, ...]},
+
{36, [51, 30, 95, 27, 56, 7, 65, 94, 32, 86], [33, 90, 32, 80, 1, 79, 97, 66, 23, 29, 45, ...]},
+
{37, [14, 13, 1, 4, 86, 17, 9, 41, 68, 91], [1, 17, 85, 42, 82, 2, 91, 9, 94, 8, ...]},
+
{38, [63, 34, 17, 95, 15, 21, 1, 29, 39, 28], [81, 73, 45, 15, 65, 54, 74, 76, 12, ...]},
+
{39, ~c"\nB7,U:P$.-", [45, 37, 60, 8, 86, 31, 76, 90, ...]},
+
{40, [31, 12, 91, 62, 79, 34, 7, 81, ...], [49, 90, 73, 12, 57, 54, 83, ...]},
+
{41, [45, 60, 94, 64, 30, 32, 90, ...], [85, 65, 13, 79, 4, 36, ...]},
+
{42, [26, 16, 82, 83, 74, 68, ...], [21, 59, 65, 72, 29, ...]},
+
{43, [33, 83, 48, 64, 26, ...], [78, 22, 1, 43, ...]},
+
{44, ~c"ZD&a5<:2'b", [88, 31, 11, ...]},
+
{45, [79, 31, 56, ...], [90, 53, ...]},
+
{46, ~c".4$XY?'L&(", [82, ...]},
+
{47, ~c"\f_C\b%SR4\t3", [...]},
+
{48, [...], ...},
+
{49, ...},
+
{...},
+
...
+
]
+
```
+
+
## Part 1
+
+
```elixir
+
cards
+
|> Enum.map(fn {_, wins, inputs} ->
+
matches = length(wins) - length(wins -- inputs)
+
+
if matches > 0, do: 2 ** (matches - 1), else: 0
+
end)
+
|> dbg()
+
|> Enum.sum()
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
19855
+
```
+
+
## Part 2
+
+
```elixir
+
cards
+
|> Enum.reduce(%{}, fn {id, wins, inputs}, acc ->
+
matches = length(wins) - length(wins -- inputs)
+
+
{current, acc} =
+
Map.get_and_update(acc, id, fn v ->
+
v = (v || 0) + 1
+
{v, v}
+
end)
+
+
Enum.reduce(1..matches//1, acc, &Map.update(&2, id + &1, current, fn a -> a + current end))
+
end)
+
|> Map.values()
+
|> Enum.sum()
+
|> dbg()
+
```
+
+
<!-- livebook:{"output":true} -->
+
+
```
+
10378710
+
```
+
+
<!-- livebook:{"offset":11578,"stamp":{"token":"XCP.lXGe3Iu191OYuBQqrLXtyX10eAJRxaC7kWxJhXV-XwPuZXy80YHtfPI-uAobs5Ncg0KyodauGARY5zWPhVt6a96P5flHG1j0LHMDzRblFBObyqrIKaYaIlaYVVUXUtasrA","version":2}} -->