this repo has no description

Start year 2024

hauleth.dev f395887e ef17f468

verified
+1055
+102
2023/day01.livemd
··· 1 + <!-- livebook:{"persist_outputs":true} --> 2 + 3 + # Day 01 4 + 5 + ```elixir 6 + Mix.install([ 7 + {:kino_aoc, ">= 0.0.0"} 8 + ]) 9 + ``` 10 + 11 + ## Section 12 + 13 + <!-- 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"} --> 14 + 15 + ```elixir 16 + {:ok, puzzle_input} = 17 + KinoAOC.download_puzzle("2023", "1", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 18 + ``` 19 + 20 + <!-- livebook:{"output":true} --> 21 + 22 + ``` 23 + {:ok, 24 + "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" <> ...} 25 + ``` 26 + 27 + ## Part 1 28 + 29 + ```elixir 30 + puzzle_input 31 + |> String.split() 32 + |> Enum.map(fn line -> 33 + for <<c <- line>>, c in ?0..?9, do: c - ?0 34 + end) 35 + |> Enum.map(fn nums -> List.first(nums) * 10 + List.last(nums) end) 36 + |> Enum.sum() 37 + ``` 38 + 39 + <!-- livebook:{"output":true} --> 40 + 41 + ``` 42 + 52974 43 + ``` 44 + 45 + ## Part 2 46 + 47 + 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. 48 + 49 + ```elixir 50 + defmodule Part2 do 51 + def parse(""), do: [] 52 + def parse(<<c>> <> rest) when c in ?1..?9, do: [c - ?0 | parse(rest)] 53 + 54 + words = ~w[one two three four five six seven eight nine] 55 + 56 + for {word, idx} <- Enum.with_index(words, 1) do 57 + def parse(unquote(word) <> _ = str) do 58 + <<_>> <> rest = str 59 + [unquote(idx) | parse(rest)] 60 + end 61 + end 62 + 63 + def parse(<<_>> <> rest), do: parse(rest) 64 + end 65 + 66 + puzzle_input 67 + |> String.split() 68 + |> Enum.map(&Part2.parse/1) 69 + |> Enum.map(fn nums -> List.first(nums) * 10 + List.last(nums) end) 70 + |> Enum.sum() 71 + ``` 72 + 73 + <!-- livebook:{"output":true} --> 74 + 75 + ``` 76 + 53340 77 + ``` 78 + 79 + ```elixir 80 + words = ~w[one two three four five six seven eight nine] 81 + pattern = Enum.concat(1..9, words) |> Enum.join("|") 82 + 83 + to_num = fn n -> 84 + if v = Enum.find_index(words, &(&1 == n)), do: v + 1, else: String.to_integer(n) 85 + end 86 + 87 + puzzle_input 88 + |> String.split() 89 + |> Enum.map(&Regex.scan(~r/^.*?(#{pattern}).*(#{pattern}).*?$/, &1)) 90 + |> dbg() 91 + |> Enum.map(fn 92 + [[_, a, b]] -> 93 + to_num.(a) * 10 + to_num.(b) 94 + 95 + [[_, a]] -> 96 + a = to_num.(a) 97 + a * 10 + a 98 + end) 99 + |> Enum.sum() 100 + ``` 101 + 102 + <!-- livebook:{"offset":6289,"stamp":{"token":"XCP.8wDt6KmmXvHba68hXcGnXNOf4ySnrVXFg3xBlBhffIp7QdMVOlpx87HS35zyFWnNl8D6ubMeKZ0nbHD6o1BhtUMF4AvpCD9FtMxlHIqrB6hrbn7N6ZkPZqriythIFxCvpA","version":2}} -->
+435
2023/day02.livemd
··· 1 + <!-- livebook:{"persist_outputs":true} --> 2 + 3 + # Day 02 4 + 5 + ```elixir 6 + Mix.install([:kino_aoc]) 7 + ``` 8 + 9 + ## Section 10 + 11 + <!-- 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"} --> 12 + 13 + ```elixir 14 + {:ok, puzzle_input} = 15 + KinoAOC.download_puzzle("2023", "2", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 16 + ``` 17 + 18 + <!-- livebook:{"output":true} --> 19 + 20 + ``` 21 + {:ok, 22 + "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" <> ...} 23 + ``` 24 + 25 + ```elixir 26 + games = 27 + puzzle_input 28 + |> String.split("\n", trim: true) 29 + |> Enum.map(fn "Game " <> game -> 30 + {id, ": " <> rest} = Integer.parse(game) 31 + 32 + picks = 33 + for pick <- String.split(rest, "; ") do 34 + pick 35 + |> String.split(", ") 36 + |> Map.new(fn balls -> 37 + {num, " " <> color} = Integer.parse(balls) 38 + {color, num} 39 + end) 40 + end 41 + 42 + {id, picks} 43 + end) 44 + ``` 45 + 46 + <!-- livebook:{"output":true} --> 47 + 48 + ``` 49 + [ 50 + {1, 51 + [ 52 + %{"blue" => 3, "green" => 7, "red" => 10}, 53 + %{"green" => 4, "red" => 4}, 54 + %{"blue" => 7, "green" => 1, "red" => 5}, 55 + %{"blue" => 8, "red" => 10}, 56 + %{"blue" => 7, "green" => 1, "red" => 19} 57 + ]}, 58 + {2, 59 + [ 60 + %{"green" => 10, "red" => 6}, 61 + %{"green" => 11, "red" => 4}, 62 + %{"blue" => 2, "green" => 16}, 63 + %{"blue" => 5, "green" => 7, "red" => 4}, 64 + %{"blue" => 1, "green" => 17, "red" => 1} 65 + ]}, 66 + {3, 67 + [ 68 + %{"blue" => 9, "green" => 1, "red" => 5}, 69 + %{"red" => 5}, 70 + %{"blue" => 8, "green" => 2, "red" => 11}, 71 + %{"blue" => 6, "green" => 2} 72 + ]}, 73 + {4, 74 + [ 75 + %{"green" => 5, "red" => 2}, 76 + %{"blue" => 2, "green" => 3, "red" => 3}, 77 + %{"blue" => 2, "red" => 3}, 78 + %{"green" => 8, "red" => 2} 79 + ]}, 80 + {5, 81 + [ 82 + %{"blue" => 13, "red" => 12}, 83 + %{"blue" => 13, "green" => 2, "red" => 9}, 84 + %{"blue" => 9, "red" => 1}, 85 + %{"blue" => 12, "green" => 2}, 86 + %{"blue" => 11, "green" => 1, "red" => 1} 87 + ]}, 88 + {6, 89 + [ 90 + %{"blue" => 4, "red" => 11}, 91 + %{"red" => 4}, 92 + %{"green" => 1, "red" => 7}, 93 + %{"blue" => 1, "green" => 1}, 94 + %{"blue" => 8, "red" => 10}, 95 + %{"blue" => 2, "green" => 1, "red" => 8} 96 + ]}, 97 + {7, 98 + [ 99 + %{"blue" => 7, "green" => 1, "red" => 15}, 100 + %{"blue" => 7, "green" => 5, "red" => 17}, 101 + %{"blue" => 5, "green" => 1}, 102 + %{"blue" => 11, "green" => 2, "red" => 17}, 103 + %{"blue" => 2, "green" => 14, "red" => 9}, 104 + %{"blue" => 6, "red" => 19} 105 + ]}, 106 + {8, 107 + [ 108 + %{"green" => 13}, 109 + %{"green" => 5}, 110 + %{"blue" => 3, "green" => 9, "red" => 1}, 111 + %{"blue" => 4, "green" => 11, "red" => 4} 112 + ]}, 113 + {9, 114 + [ 115 + %{"blue" => 1, "green" => 4, "red" => 1}, 116 + %{"blue" => 7, "green" => 4, "red" => 7}, 117 + %{"blue" => 9, "red" => 4}, 118 + %{"blue" => 2, "green" => 5, "red" => 8}, 119 + %{"blue" => 6, "green" => 2}, 120 + %{"blue" => 10, "green" => 5, "red" => 5} 121 + ]}, 122 + {10, 123 + [ 124 + %{"blue" => 5, "green" => 1, "red" => 3}, 125 + %{"blue" => 3, "green" => 4, "red" => 9}, 126 + %{"blue" => 5, "green" => 2, "red" => 11}, 127 + %{"blue" => 1, "green" => 3, "red" => 2}, 128 + %{"blue" => 2, "red" => 6} 129 + ]}, 130 + {11, 131 + [ 132 + %{"blue" => 12, "green" => 6, "red" => 2}, 133 + %{"blue" => 9, "green" => 1, "red" => 2}, 134 + %{"blue" => 3, "green" => 12} 135 + ]}, 136 + {12, 137 + [ 138 + %{"blue" => 1, "green" => 12, "red" => 1}, 139 + %{"blue" => 1, "green" => 6, "red" => 2}, 140 + %{"blue" => 1, "green" => 6, "red" => 6}, 141 + %{"green" => 3, "red" => 6} 142 + ]}, 143 + {13, 144 + [ 145 + %{"blue" => 3, "green" => 19, "red" => 5}, 146 + %{"blue" => 7, "green" => 11, "red" => 6}, 147 + %{"blue" => 8, "red" => 6}, 148 + %{"blue" => 3, "green" => 4, "red" => 4}, 149 + %{"blue" => 5, "green" => 15, "red" => 8}, 150 + %{"blue" => 5, "green" => 10, "red" => 2} 151 + ]}, 152 + {14, 153 + [ 154 + %{"blue" => 5, "green" => 9}, 155 + %{"blue" => 6, "green" => 4}, 156 + %{"blue" => 4, "green" => 14, "red" => 1}, 157 + %{"blue" => 3, "green" => 3}, 158 + %{"green" => 2}, 159 + %{"blue" => 5, "green" => 7, "red" => 1} 160 + ]}, 161 + {15, 162 + [ 163 + %{"blue" => 8, "red" => 5}, 164 + %{"blue" => 9, "red" => 3}, 165 + %{"blue" => 16, "green" => 1, "red" => 5}, 166 + %{"blue" => 1, "green" => 2, "red" => 3}, 167 + %{"blue" => 10, "green" => 2, "red" => 5} 168 + ]}, 169 + {16, 170 + [ 171 + %{"blue" => 6, "green" => 9, "red" => 10}, 172 + %{"blue" => 8, "green" => 14, "red" => 9}, 173 + %{"blue" => 1, "green" => 7, "red" => 1}, 174 + %{"blue" => 8, "green" => 5, "red" => 8}, 175 + %{"blue" => 5, "green" => 14, "red" => 10}, 176 + %{"blue" => 7, "green" => 3, "red" => 11} 177 + ]}, 178 + {17, 179 + [ 180 + %{"blue" => 12, "green" => 6, "red" => 12}, 181 + %{"blue" => 17, "green" => 14, "red" => 4}, 182 + %{"blue" => 11, "green" => 13, "red" => 1} 183 + ]}, 184 + {18, 185 + [ 186 + %{"blue" => 7, "green" => 2, "red" => 4}, 187 + %{"blue" => 1, "green" => 2, "red" => 4}, 188 + %{"blue" => 17, "red" => 2} 189 + ]}, 190 + {19, 191 + [ 192 + %{"green" => 9, "red" => 3}, 193 + %{"blue" => 2, "green" => 2, "red" => 8}, 194 + %{"blue" => 3, "green" => 15, "red" => 11}, 195 + %{"blue" => 1, "green" => 18, "red" => 3} 196 + ]}, 197 + {20, 198 + [ 199 + %{"blue" => 16, "green" => 5, "red" => 5}, 200 + %{"blue" => 8, "green" => 6, "red" => 4}, 201 + %{"blue" => 11, "red" => 10}, 202 + %{"blue" => 5, "green" => 5, "red" => 5} 203 + ]}, 204 + {21, 205 + [ 206 + %{"blue" => 3, "green" => 14, "red" => 1}, 207 + %{"blue" => 6, "green" => 17, "red" => 6}, 208 + %{"blue" => 17, "green" => 12, "red" => 3}, 209 + %{"blue" => 19, "green" => 15, "red" => 1}, 210 + %{"blue" => 18, "green" => 4, "red" => 3} 211 + ]}, 212 + {22, 213 + [ 214 + %{"blue" => 15}, 215 + %{"blue" => 11, "green" => 1, "red" => 2}, 216 + %{"green" => 1, "red" => 7}, 217 + %{"blue" => 18, "green" => 1, "red" => 1}, 218 + %{"blue" => 16}, 219 + %{"blue" => 6, "red" => 3} 220 + ]}, 221 + {23, 222 + [ 223 + %{"blue" => 11, "green" => 6, "red" => 4}, 224 + %{"blue" => 8, "green" => 9, "red" => 11}, 225 + %{"blue" => 2, "green" => 5, "red" => 5}, 226 + %{"blue" => 4, "green" => 11, "red" => 11}, 227 + %{"blue" => 9, "green" => 3, "red" => 2} 228 + ]}, 229 + {24, 230 + [ 231 + %{"green" => 7, "red" => 2}, 232 + %{"blue" => 1, "green" => 15, "red" => 8}, 233 + %{"blue" => 6, "green" => 6, "red" => 3} 234 + ]}, 235 + {25, 236 + [ 237 + %{"blue" => 9, "green" => 9}, 238 + %{"blue" => 7, "green" => 3, "red" => 1}, 239 + %{"blue" => 1, "green" => 6, "red" => 1}, 240 + %{"blue" => 1, "green" => 6, "red" => 1} 241 + ]}, 242 + {26, 243 + [ 244 + %{"blue" => 15, "green" => 1, "red" => 1}, 245 + %{"blue" => 12, "green" => 1, "red" => 1}, 246 + %{"blue" => 16}, 247 + %{"blue" => 14, "green" => 11, "red" => 5}, 248 + %{"blue" => 14, "green" => 6, "red" => 4} 249 + ]}, 250 + {27, 251 + [ 252 + %{"green" => 9, "red" => 14}, 253 + %{"blue" => 6, "green" => 5, "red" => 11}, 254 + %{"blue" => 6, "green" => 9, "red" => 1} 255 + ]}, 256 + {28, 257 + [ 258 + %{"blue" => 1, "green" => 6, "red" => 9}, 259 + %{"green" => 1, "red" => 9}, 260 + %{"red" => 7}, 261 + %{"blue" => 1, "green" => 2, "red" => 11}, 262 + %{"green" => 10, "red" => 8}, 263 + %{"blue" => 1, "green" => 6, "red" => 5} 264 + ]}, 265 + {29, 266 + [ 267 + %{"blue" => 19, "green" => 3, "red" => 1}, 268 + %{"blue" => 9, "red" => 1}, 269 + %{"blue" => 17, "green" => 8}, 270 + %{"blue" => 11, "green" => 4} 271 + ]}, 272 + {30, [%{"blue" => 7}, %{"blue" => 5, "green" => 1, "red" => 1}, %{"blue" => 3, "red" => 1}]}, 273 + {31, 274 + [ 275 + %{"blue" => 1, "green" => 2, "red" => 9}, 276 + %{"blue" => 3, "green" => 1, "red" => 5}, 277 + %{"green" => 2, "red" => 7}, 278 + %{"green" => 2, "red" => 12} 279 + ]}, 280 + {32, 281 + [ 282 + %{"blue" => 1, "green" => 17, "red" => 1}, 283 + %{"blue" => 14, "green" => 10, "red" => 6}, 284 + %{"blue" => 11, "green" => 12, "red" => 3} 285 + ]}, 286 + {33, 287 + [ 288 + %{"blue" => 3, "green" => 1, "red" => 2}, 289 + %{"blue" => 7, "green" => 4}, 290 + %{"blue" => 5, "green" => 3, "red" => 1} 291 + ]}, 292 + {34, 293 + [ 294 + %{"blue" => 9, "green" => 1, "red" => 9}, 295 + %{"blue" => 12, "green" => 2, "red" => 12}, 296 + %{"blue" => 3, "red" => 12}, 297 + %{"blue" => 14, "green" => 2, "red" => 11}, 298 + %{"blue" => 12, "red" => 10} 299 + ]}, 300 + {35, 301 + [ 302 + %{"blue" => 6, "red" => 2}, 303 + %{"blue" => 5}, 304 + %{"blue" => 9, "green" => 6, "red" => 3}, 305 + %{"blue" => 2, "green" => 3, "red" => 1} 306 + ]}, 307 + {36, 308 + [ 309 + %{"blue" => 9, "green" => 4, "red" => 6}, 310 + %{"green" => 4, "red" => 2}, 311 + %{"green" => 3, "red" => 7}, 312 + %{"blue" => 2, "green" => 6}, 313 + %{"blue" => 4, "green" => 3, "red" => 3}, 314 + %{"blue" => 16, "green" => 3, "red" => 4} 315 + ]}, 316 + {37, 317 + [ 318 + %{"blue" => 4, "green" => 2, "red" => 8}, 319 + %{"blue" => 4, "green" => 2, "red" => 3}, 320 + %{"blue" => 5, "green" => 3}, 321 + %{"blue" => 9, "green" => 15}, 322 + %{"blue" => 7, "green" => 11, "red" => 5} 323 + ]}, 324 + {38, 325 + [ 326 + %{"blue" => 1, "red" => 12}, 327 + %{"blue" => 2, "green" => 3, "red" => 10}, 328 + %{"blue" => 7, "green" => 3, "red" => 8}, 329 + %{"green" => 2, "red" => 14} 330 + ]}, 331 + {39, 332 + [ 333 + %{"blue" => 17, "green" => 16, "red" => 2}, 334 + %{"blue" => 13, "green" => 4, "red" => 6}, 335 + %{"blue" => 7, "green" => 1, "red" => 4}, 336 + %{"blue" => 3, "green" => 2}, 337 + %{"blue" => 17, "green" => 12, "red" => 6}, 338 + %{"blue" => 2, "green" => 6, "red" => 5} 339 + ]}, 340 + {40, 341 + [ 342 + %{"blue" => 4, "green" => 3, "red" => 2}, 343 + %{"green" => 2, "red" => 3}, 344 + %{"blue" => 6, "green" => 6, "red" => 2}, 345 + %{"green" => 5}, 346 + %{"blue" => 3, "green" => 5, "red" => 1} 347 + ]}, 348 + {41, 349 + [ 350 + %{"green" => 13, "red" => 11}, 351 + %{"blue" => 1, "green" => 3, "red" => 2}, 352 + %{"blue" => 1, "green" => 3, "red" => 9}, 353 + %{"green" => 11, "red" => 12}, 354 + %{"green" => 1, "red" => 9}, 355 + %{"green" => 9, ...} 356 + ]}, 357 + {42, 358 + [ 359 + %{"blue" => 2, "green" => 4}, 360 + %{"blue" => 6, "green" => 10}, 361 + %{"blue" => 13, "green" => 6, "red" => 3}, 362 + %{"blue" => 11, "green" => 17}, 363 + %{"blue" => 8, ...} 364 + ]}, 365 + {43, 366 + [ 367 + %{"blue" => 2, "green" => 10, "red" => 10}, 368 + %{"blue" => 3, "green" => 5, "red" => 3}, 369 + %{"blue" => 4, "green" => 10, ...}, 370 + %{"green" => 5}, 371 + %{...} 372 + ]}, 373 + {44, 374 + [ 375 + %{"blue" => 1, "green" => 5, "red" => 4}, 376 + %{"blue" => 1, "green" => 3, ...}, 377 + %{"blue" => 1, ...}, 378 + %{...}, 379 + ... 380 + ]}, 381 + {45, [%{"blue" => 7, "green" => 4, ...}, %{"blue" => 3, ...}, %{...}, ...]}, 382 + {46, [%{"blue" => 5, ...}, %{...}, ...]}, 383 + {47, [%{...}, ...]}, 384 + {48, [...]}, 385 + {49, ...}, 386 + {...}, 387 + ... 388 + ] 389 + ``` 390 + 391 + ## Part 1 392 + 393 + ```elixir 394 + games 395 + |> Enum.filter(fn {_, picks} -> 396 + Enum.all?(picks, fn map -> 397 + Map.get(map, "red", 0) <= 12 and Map.get(map, "green", 0) <= 13 and 398 + Map.get(map, "blue", 0) <= 14 399 + end) 400 + end) 401 + |> Enum.map(&elem(&1, 0)) 402 + |> Enum.sum() 403 + ``` 404 + 405 + <!-- livebook:{"output":true} --> 406 + 407 + ``` 408 + 2162 409 + ``` 410 + 411 + ## Part 2 412 + 413 + ```elixir 414 + games 415 + |> Enum.map(fn {_, picks} -> 416 + picks 417 + |> Enum.reduce([0, 0, 0], fn hand, [r, g, b] -> 418 + [ 419 + max(Map.get(hand, "red", 0), r), 420 + max(Map.get(hand, "green", 0), g), 421 + max(Map.get(hand, "blue", 0), b) 422 + ] 423 + end) 424 + |> Enum.product() 425 + end) 426 + |> Enum.sum() 427 + ``` 428 + 429 + <!-- livebook:{"output":true} --> 430 + 431 + ``` 432 + 72513 433 + ``` 434 + 435 + <!-- livebook:{"offset":15042,"stamp":{"token":"XCP.FeGN4d2e9dnN-0MEzQ7fkG8b8Y3D1FEiGVZmcvfp_IBmCEdpr8gG7HkIpV-Id27eJzCE5vj63AzjPXXsdEgWHwh-T5OO4n9ak1Zs__R9RD4uOYpy2NSEJkYkMGlwtPNvlg","version":2}} -->
+319
2023/day03.livemd
··· 1 + <!-- livebook:{"persist_outputs":true} --> 2 + 3 + # Day 03 4 + 5 + ```elixir 6 + Mix.install([ 7 + :kino_aoc 8 + ]) 9 + ``` 10 + 11 + ## Section 12 + 13 + <!-- 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"} --> 14 + 15 + ```elixir 16 + {:ok, puzzle_input} = 17 + KinoAOC.download_puzzle("2023", "3", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 18 + ``` 19 + 20 + <!-- livebook:{"output":true} --> 21 + 22 + ``` 23 + {:ok, 24 + ".......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" <> ...} 25 + ``` 26 + 27 + ```elixir 28 + IO.puts(puzzle_input) 29 + ``` 30 + 31 + <!-- livebook:{"output":true} --> 32 + 33 + ``` 34 + .......12.......935............184.720...243........589.652..........435..........483.............6...........................904........... 35 + ......*.....968*.....$............*........=..348...*..........986....*...................459....*........422................#......%482.... 36 + ....291............612....290..........903........699......218*.......376............890....*.838...81......*.....138.../194................ 37 + ..............156......$..*...891.&731....%..89...................523..........699....+...227......*.......225....=...........388....*...... 38 + ................*...189..591.*................*.......783.....107..-...54.287..$................533.../..............909........&.603.424... 39 + ...229*952.....938............470.555.......746...28.....+...*.........................................279..826..788*....................... 40 + ...................................*...............@.........867.-....102..845...542.779.....................*........182.166...511......... 41 + 563.727.....282....237..171.......892...183.......................989....*..........*................$....709...8*974.=...%.....*.....873... 42 + ....#..........+...*.......*..........................&......129+......491...................877....715.......................270.......#... 43 + .................53.....781...&295....@773.336......547................................45......*.............=800.....*359.................. 44 + ...342*468....&.....573....................*.................................%850............*..465................192.....*.......&115..... 45 + ............988.......*...731.............789.673....*256..............677..................621...........#....716......910..297........22.. 46 + 204&....69............905...=.....641.472.......#.524............127....*..714.........*62..........622..324..&.................*........... 47 + ..........*........................+....@.................812......*..955.....*.....257....../.................../..............545......... 48 + ........668....91..&.........840......+..............566.....+...66.........660..............469.................525...765...........25..... 49 + ...............$...666.979..*........952...122......%............................71......=39...../94.........................132......*..... 50 + ......@.................../.460..#.......=.=..........146..625........214.........#.278................667..........386.......-....936...... 51 + ....643.......@..................974...464...........*.....*...........*.............%.....$...........=...=..%995...*...................... 52 + ........./...577...-....3.../186.................*.995.....678.&.......882...559...........374.......&...554.........428.......725....*..... 53 + .......96........678....%.....................529..............374...........*......924........=277..606..................#...#......8.257.. 54 + ...609....................397.......475...................651.......856......697.&.....&..=...................486........888................ 55 + ............-................*..................756...399....*..42................866....287.....#......515...*......................137.... 56 + .....285..947....#..........997......=.....665..*......*..420...*.....-..268*457.............=63..758.....+..623.............+../........... 57 + ..............458.....422.......338...827...+..462....797.....26....523..........*.880*.............................&.....934..157.......... 58 + .......149........409....$................................................868.378......144..149............356.....872..............871.533. 59 + ....22...*..........$........7.......149....979......................826.&.....................@........-.....*275.....................*.... 60 + ........518.773*.........10..$..........*........805..812.972......................123......*............98.........=........./609.682...... 61 + .................5........./............349........$.....*..................786....*.......160..903...40.............209...............*.... 62 + .......*.....................................497...........#.............../.....153.795............./.........&806..........839....419.337. 63 + 78...582............675................145.........405....77..361............952.......*..../741....................624..527*............... 64 + ...................../../....=.....+....&.............*51.....*..........733*.........728.........173....834.....76......................... 65 + ................878....276..792.....372....................385..179.............@610.............................%........146=.............. 66 + ..........522.....*...........................-....30....-........*.@................110=..+.......197.....643.................762......%... 67 + ......%....*...173.............420..407......261.........687.806.12..104.....914..........685.233.&.......*.....549...=...........*......591 68 + .....837..135.......313...579....%.=.....613................../..........729.........257#.....&.........430.399*.....157.........970........ 69 + ...................*.....*.....*......@.....*............../....566........+.....................*906....................%.................. 70 + ....459.78$.775.768..62...345.537......122.803.142*758...148...*....992................711....316.........#...............521.298*590..289.. 71 + ....*.................#.........................................444............382.....*...@...............753.......927................/... 72 + .....592..735......+.............634.......652.....853....690................./.......874.846.35.....884.........182.-...................... 73 + .419........*.839.157.......795...................*.......*...........928........................756....*64......*.....*19.....309.......... 74 + .........716...*.......591....*....358$.#378.............623...............687.........-816......*............292...110....&....*......643.. 75 + ..134...........910......*.941.......................................547=....*....................490....938+..............422.482.......... 76 + ...*..331....$..........80.................#346....180...........737.........76.......992@...91......................../.................... 77 + ...16....$.140.464*831.....933.917....303............*......%.....*....336........339.......*.............@..939....583....*564.........864. 78 + ..............................*........=...+54.....449......209.912.....+.....615..%.....605............960..*..........219................. 79 + .........@442.....730..................................413...........................26.....................944..336........188......./..... 80 + ...190............#...@...524.544....968*.............*........466...222...536...843.@..........=.....32...........$..........-.......410... 81 + ......*..80@..491....232..-......*.......16........402......27..*...*.....*...................480....*........&........894.................. 82 + .....218.........*.............=..819......................*........857...896...........677........689........638...45*.....993............. 83 + ................754...........434.........622.338...........607....................&......&.%213...........................-................ 84 + ........+.894......................681.......*.........484.........963.498...*..538.............................................346......... 85 + .....802.....*162....752...........................................*........520...........229.2.586..513..............25=.746........782*423 86 + ...............................@...307#.497....551..996..696....879...911................%......................277*........................ 87 + ....*157.....137....#.........621.........*...#.....*...#............*............527......9........./..............844.....@224....304..... 88 + .541............*.649.............412.....744......560..............404.....240.......986*.@.......346.....@..........................+..... 89 + ......268....764.................%.......................902....856.......*....*..........................242.....842.....#................. 90 + ........&...............514..38..........+..=...........@..............715.142..587.......307.................731...*...954....878*......... 91 + ............................*.....349....76.92....612.....376.......................257...$...................../.968..............765...... 92 + ........960*414........713.501......&............%.......*......*941............................#........415...........937%................. 93 + ....967............409..*......605......................375..771........599*884.................880.........*...127..$.................$513. 94 + .....*................*..171..*.....@.......507.895..................*.................636...........768...114....-..292.......-...223...... 95 + ...807...977.......218.......753...47.......*......*..............507.90....../725.......*.........+...@.....................755......*..... 96 + ............*478.............................542....676...............................673........974.....@....*170....261..............134.. 97 + 800...............532............................15............%...445..102.............../510.........625.279..........-.....*............. 98 + .......................654.....850.405......................395.....-.......467....477...........973............../........191........398... 99 + .925...793...423*.........@..........................................................=.659..........*.....817.....230...........653..-...... 100 + .......*.........52...........764$....273...................@........430....................................*...........669.....-.......71.. 101 + .435....804..177....990.838.........#..-...475...297..337..360.........*....914.............................833............................. 102 + ....*.......*.........*...*.......281......&......*..+.............328..746......=215.......359....295.....................#481......868.... 103 + ..967........936.689%.785..515...............*64.827........................761.........+....&.......+..............................*....637 104 + ....../.+265..............................562...............235........585..*...........793........=...838.147....284.902..301*330.......... 105 + ....579.........................21%..327................481..*...469%..*.....297.704..............797.....*...........*.................#... 106 + ......................638............*...................*....81.......780.........*...../...282....................907.882.781.......797... 107 + ..........671....608.................295.................302......953............171..919.......*........................*...*......#....... 108 + ............*....*....251.....191........#............*..........................................999.....451....+....286.415.581....274..... 109 + ..245$.....217...649.-....................898......950..................495*497.......53*............@...........398..-..................... 110 + ...........................942.......323...............+.....623.........................804.......875........................#............. 111 + .....42..543.................*..320....*..918....314....145...........603......991$.921.......261......................762...187.....951*638 112 + .....*..#........53........374........756...........*.........-.......................*........../..217*550..............*.................. 113 + ....217..........*................................743......703....368...$861..4*966.415..703................................*959........*344 114 + ...........626...31...602.................700..........696........*.....................*......396..........591.......*124.................. 115 + ..135........@................................699.139.....*.662....46........=797......144.....#...*289......*.....840............-...102.44 116 + ................909.......180.............100.*....#...574..*............52...................................451............764.517....*... 117 + ........701*..........127*............117../...787...........67.....903..........273....*900................................=..........112.. 118 + ............430............423.67.......*..............*572...........@...199.........94..........686.....679.....................921*...... 119 + .542*119...............396....*.......938...........250......888..........*.....978...................25..../.........306.............780... 120 + ...............251........*.....................238......................340....+..............112....*........120...*....24................ 121 + .223.....549......-..98..60..775..28*105...........*.436..951.599.................309*682.......*..937...158.....*....697.*......764..$..... 122 + .....788............#....................768.....266........*..%..............................779........*.......542.......148...*....529... 123 + ....*......310.............412.......23.+....289..........560............249+.204..606*................271...805.......394.......898........ 124 + ....919.......&...867.......*........*......%.........592............166.........*.....460.........369..........*........*.................. 125 + .........920.......*.....233.....732..500.....950.....*.......514...........110..961..................*309.....450..#...521................. 126 + .................753...............*............#...965..............................852...841....%........524.....981............653....... 127 + ...........858...........*..234..922........65..................991.........-839.800....*......869...836..$.............675..789...*....505. 128 + ..........*.............516...*..................774.....&.149.=.................*.......737.........*......402....%.......*....#..762...... 129 + ........780.........4.........116.....................976..-...........%........791..................300.....%....338.471................... 130 + ...................*.................480*160..3..............*727.....363................................................................167 131 + ...........743.....721.......................*..........808...............942...........339.289.............$............416.....$.......... 132 + ..955...................606*623.............718...503....*...................*245..........*........531.....686......250..../....275........ 133 + .............@....................110...............*...309..#....&......210..........386.................%...........*........+........391. 134 + .....444.....743......519..691......*.......-824......+......759.617....*.......710..*.....814.........356.........464.......709............ 135 + ......*..746......247.....*......596..999.............907.............296.-..../.......760.+.................$.890.......................669 136 + ...479.....*.........*.......561.....+..........*178......................977....266...*.....640..........607.....*.....%...........545..... 137 + ........395...=......361........*372.........655..........398...203..11................147..*......../.............196..499........*........ 138 + ..561........646......................*898.......175.570.....$.....#...*..135..............633..314...871......898..........891...90.....780 139 + .......*91........405..............627..............*....736.........760.....*........=..........*...........%....*..........*.............. 140 + ....722...........*......................................*.................744.698.367..-........767..........236.692.......308............. 141 + ...............740........./............906......*593...977.......645............*......167.............................................*... 142 + ........+...............123...................281....................*...543......461........................175.....................381.319 143 + .282...814......771*........920.......................@............473....*...............&....872...../401.....*......=......18............ 144 + ....*.........%......993...*...........................256..223...........242....977.......293.-...............550.....435.................. 145 + ....23.........960........307....$.....504.638*656...............&...................203.............33.$430..................731........... 146 + ................................885......*................398....763...........805.....=....338.......*......146*916..................513... 147 + ..20...............42....................828.............../...................*............$.........531............159*761......78........ 148 + ......805-...-..........598...........#.............351........34.........682..516.534..............*........&..........................283. 149 + ..............664....../.......255..887.....258......%.........*.........*............*.....226..931.91......128............................ 150 + ...557.938#.......75.....585..*...............*.194......#..686........786..........755.......&..........637..............988.......275..... 151 + ....*............%....35...*.141...........508.....*865.967..............................80*............./.....978....790*.....@...*........ 152 + .662..................*..............@939...........................204........484....34....99.............@.................350.54......... 153 + ............358....832..=......................%......307.95........*......654...*......&.........734.....491...50...924.385................ 154 + ............*............340................483.........-.*.......118..794*.....431...........783..*..............-......*.........&594.#... 155 + ..........338........=.............$.................*....94....................................*...546.....$.......187..593.768........282. 156 + ...............796.380.183....+.564..94.144.........138..............394.392.....971.......#928.447........275..57...*.......&.............. 157 + ...........233...*.......%...40........*........................945.....*.........-.................%.............=.438...........*......906 158 + .....881.../...491...903..........918.....303......................*........578*...................807......597................681.539...... 159 + ......*.................*.463.467*....246.......577.....198.....245.....967.....988.&.........759.......=...*.........-889.................. 160 + ......462..978........664...%...........*.-731.../.....&....375.............#.......217........@........381.250...219......947.............. 161 + ..........&..........................252.......%.............*..............258............427...137...............@........@....-175....... 162 + ....864...................461..................234.......69.222........*...........411....=............651...#.............................. 163 + ....*......243...............*283...................777-..*..........92.761..581%.*.....................$.....258..867..876................. 164 + .916......%.........629.................911*238...........680...239................672.............137@...469.........*.......737...@....... 165 + ..............764....*........894/..289...........944..........#...........@....%........../876..........*.........687.........*....436..... 166 + ......442.255.....442..903.............*.....*493..../......................338..346...................927..............764.....536......... 167 + .........*.....*........*.....869*888.597.241..................11-....542#...........412*..................235.............................. 168 + .804.329......344....195...94.......................................*....................880......44.622.........342.18...............417... 169 + ....*.....=................+.........76..328.....803.....658.....254.............327..........340......*.............@...................... 170 + ...........254........../...........*...*...........*234...%..........20.....238...*..........*.........380......&......78.246%...598....... 171 + .96....990.........%..718...%....869.......596....*......................423.....433..93.....613....$.............905...=........*.....497.. 172 + ...*....*........=.86.....499..............*...385.296...................*...........*...............523.$.....................529...$.*.... 173 + ...780.685.....822....................560.35.............................529......780.....................453......................711..930. 174 + ``` 175 + 176 + <!-- livebook:{"output":true} --> 177 + 178 + ``` 179 + :ok 180 + ``` 181 + 182 + ```elixir 183 + defmodule Day03 do 184 + def parse_line("", {_, _, acc}), do: acc 185 + def parse_line("." <> rest, {x, y, acc}), do: parse_line(rest, {x + 1, y, acc}) 186 + 187 + def parse_line(<<c>> <> _ = str, {x, y, items}) when c in ?0..?9 do 188 + {num, rest} = Integer.parse(str) 189 + len = floor(:math.log10(num) + 1) 190 + ref = make_ref() 191 + 192 + points = 193 + for i <- 0..(len - 1) do 194 + {{x + i, y}, {ref, num}} 195 + end 196 + 197 + parse_line(rest, {x + len, y, points ++ items}) 198 + end 199 + 200 + def parse_line(<<c>> <> rest, {x, y, items}) do 201 + parse_line(rest, {x + 1, y, [{{x, y}, <<c>>} | items]}) 202 + end 203 + 204 + def around({x, y}) do 205 + for dx <- -1..1, dy <- -1..1, do: {x + dx, y + dy} 206 + end 207 + end 208 + 209 + grid = 210 + puzzle_input 211 + |> String.split() 212 + |> Enum.with_index() 213 + |> Enum.flat_map(fn {line, y} -> 214 + Day03.parse_line(line, {0, y, []}) 215 + end) 216 + 217 + {parts, ids} = 218 + grid 219 + |> Enum.split_with(fn {_, value} -> 220 + is_binary(value) 221 + end) 222 + 223 + parts = Map.new(parts) 224 + ids = Map.new(ids) 225 + ``` 226 + 227 + <!-- livebook:{"output":true} --> 228 + 229 + ``` 230 + %{ 231 + {77, 129} => {#Reference<0.407999657.1149239297.248024>, 581}, 232 + {120, 47} => {#Reference<0.407999657.1149239297.247329>, 894}, 233 + {4, 5} => {#Reference<0.407999657.1149239297.246955>, 229}, 234 + {78, 98} => {#Reference<0.407999657.1149239297.247762>, 245}, 235 + {29, 25} => {#Reference<0.407999657.1149239297.247129>, 7}, 236 + {4, 81} => {#Reference<0.407999657.1149239297.247606>, 135}, 237 + {121, 77} => {#Reference<0.407999657.1149239297.247578>, 762}, 238 + {119, 60} => {#Reference<0.407999657.1149239297.247435>, 292}, 239 + {111, 108} => {#Reference<0.407999657.1149239297.247847>, 175}, 240 + {78, 75} => {#Reference<0.407999657.1149239297.247560>, 497}, 241 + {58, 84} => {#Reference<0.407999657.1149239297.247637>, 572}, 242 + {58, 33} => {#Reference<0.407999657.1149239297.247193>, 687}, 243 + {13, 55} => {#Reference<0.407999657.1149239297.247390>, 764}, 244 + {91, 38} => {#Reference<0.407999657.1149239297.247245>, 846}, 245 + {9, 58} => {#Reference<0.407999657.1149239297.247412>, 960}, 246 + {25, 87} => {#Reference<0.407999657.1149239297.247662>, 60}, 247 + {21, 97} => {#Reference<0.407999657.1149239297.247751>, 721}, 248 + {126, 48} => {#Reference<0.407999657.1149239297.247338>, 993}, 249 + {26, 82} => {#Reference<0.407999657.1149239297.247618>, 180}, 250 + {22, 36} => {#Reference<0.407999657.1149239297.247219>, 62}, 251 + {79, 81} => {#Reference<0.407999657.1149239297.247611>, 797}, 252 + {65, 55} => {#Reference<0.407999657.1149239297.247392>, 856}, 253 + {99, 39} => {#Reference<0.407999657.1149239297.247254>, 756}, 254 + {52, 42} => {#Reference<0.407999657.1149239297.247279>, 180}, 255 + {120, 77} => {#Reference<0.407999657.1149239297.247578>, 762}, 256 + {133, 57} => {#Reference<0.407999657.1149239297.247411>, 765}, 257 + {68, 81} => {#Reference<0.407999657.1149239297.247610>, 46}, 258 + {22, 103} => {#Reference<0.407999657.1149239297.247802>, 361}, 259 + {44, 93} => {#Reference<0.407999657.1149239297.247721>, 65}, 260 + {87, 32} => {#Reference<0.407999657.1149239297.247185>, 110}, 261 + {81, 37} => {#Reference<0.407999657.1149239297.247235>, 382}, 262 + {111, 25} => {#Reference<0.407999657.1149239297.247133>, 275}, 263 + {98, 0} => {#Reference<0.407999657.1149239297.246916>, 6}, 264 + {110, 80} => {#Reference<0.407999657.1149239297.247604>, 591}, 265 + {19, 138} => {#Reference<0.407999657.1149239297.248100>, 86}, 266 + {88, 62} => {#Reference<0.407999657.1149239297.247449>, 673}, 267 + {37, 15} => {#Reference<0.407999657.1149239297.247044>, 952}, 268 + {65, 44} => {#Reference<0.407999657.1149239297.247300>, 912}, 269 + {28, 20} => {#Reference<0.407999657.1149239297.247083>, 397}, 270 + {10, 32} => {#Reference<0.407999657.1149239297.247183>, 522}, 271 + {101, 87} => {#Reference<0.407999657.1149239297.247671>, 937}, 272 + {87, 2} => {#Reference<0.407999657.1149239297.246931>, 890}, 273 + {46, 108} => {#Reference<0.407999657.1149239297.247844>, 281}, 274 + {82, 139} => {#Reference<0.407999657.1149239297.248112>, 780}, 275 + {137, 104} => {#Reference<0.407999657.1149239297.247823>, 780}, 276 + {82, 100} => {#Reference<0.407999657.1149239297.247779>, 710}, 277 + {127, 130} => {#Reference<0.407999657.1149239297.248037>, 737}, 278 + {45, 130} => {#Reference<0.407999657.1149239297.248031>, 238}, 279 + {70, ...} => {#Reference<0.407999657.1149239297.247481>, ...}, 280 + {...} => {...}, 281 + ... 282 + } 283 + ``` 284 + 285 + ```elixir 286 + used_parts = 287 + for {xy, _} <- parts, 288 + dxy <- Day03.around(xy), 289 + {:ok, val} <- [Map.fetch(ids, dxy)], 290 + into: %{}, 291 + do: val 292 + 293 + Enum.sum(Map.values(used_parts)) 294 + ``` 295 + 296 + <!-- livebook:{"output":true} --> 297 + 298 + ``` 299 + 540025 300 + ``` 301 + 302 + ```elixir 303 + cogs = 304 + for {xy, _} <- parts, 305 + values = 306 + Map.take(ids, Day03.around(xy)) |> Map.values() |> Enum.uniq() |> Enum.map(&elem(&1, 1)), 307 + match?([_, _], values), 308 + do: Enum.product(values) 309 + 310 + Enum.sum(cogs) 311 + ``` 312 + 313 + <!-- livebook:{"output":true} --> 314 + 315 + ``` 316 + 84584891 317 + ``` 318 + 319 + <!-- livebook:{"offset":29200,"stamp":{"token":"XCP.Kmaa8IUlkTR7nCbLR-W5rhhxl9NNaLewVW_EJ2PVGiFN7hgDOMjnsiCJwz-6nQSTEtlNsQiyIggbhvyc3xqgrycYYXhrK8jwmysP9jZyz5gn10jjpYBM5XlE5G_2I9xKoA","version":2}} -->
+199
2023/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":{"assign_to":"puzzle_input","day":"4","session_secret":"ADVENT_OF_CODE_SESSION","year":"2023"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} --> 12 + 13 + ```elixir 14 + {:ok, puzzle_input} = 15 + KinoAOC.download_puzzle("2023", "4", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 16 + ``` 17 + 18 + <!-- livebook:{"output":true} --> 19 + 20 + ``` 21 + {:ok, 22 + "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" <> ...} 23 + ``` 24 + 25 + ```elixir 26 + cards = 27 + puzzle_input 28 + |> String.split("\n", trim: true) 29 + |> Enum.map(fn "Card" <> rest -> 30 + {id, ": " <> rest} = rest |> String.trim() |> Integer.parse() 31 + 32 + [wins, inputs] = 33 + rest 34 + |> String.split(" | ") 35 + |> Enum.map(fn part -> 36 + part 37 + |> String.split() 38 + |> Enum.map(&String.to_integer/1) 39 + end) 40 + 41 + {id, wins, inputs} 42 + end) 43 + ``` 44 + 45 + <!-- livebook:{"output":true} --> 46 + 47 + ``` 48 + [ 49 + {1, [43, 19, 57, 13, 44, 22, 29, 20, 34, 33], 50 + [34, 68, 13, 38, 32, 57, 20, 64, 42, 7, 44, 54, 16, 51, 33, 85, 43, 24, 86, 93, 83, 29, 25, 19, 51 + 22]}, 52 + {2, [41, 56, 28, 16, 47, 58, 86, 8, 82, 23], 53 + [90, 4, 63, 41, 24, 8, 51, 65, 39, 86, 16, 53, 47, 62, 74, 58, 56, 82, 28, 76, 37, 98, 89, 67, 54 + 23]}, 55 + {3, [10, 48, 83, 6, 54, 51, 52, 5, 22, 80], 56 + [36, 51, 66, 86, 68, 73, 93, 52, 5, 65, 48, 71, 85, 10, 40, 22, 80, 6, 20, 83, 95, 54, 21, 76, 57 + 92]}, 58 + {4, [17, 4, 8, 74, 97, 13, 52, 27, 99, 95], 59 + [55, 31, 73, 47, 95, 46, 96, 69, 27, 52, 45, 62, 53, 12, 21, 5, 74, 13, 8, 50, 77, 54, 91, 32, 60 + 43]}, 61 + {5, [46, 50, 28, 25, 44, 73, 3, 14, 17, 20], 62 + [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]}, 63 + {6, [65, 19, 45, 54, 72, 39, 64, 15, 3, 60], 64 + [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]}, 65 + {7, ~c")A]LJ=;ZYW", 66 + [39, 61, 99, 12, 71, 59, 15, 10, 72, 87, 41, 89, 76, 88, 38, 95, 90, 65, 53, 80, 19, 74, 93, 11, 67 + 28]}, 68 + {8, [93, 64, 11, 24, 13, 29, 1, 51, 30, 69], 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, 70 + 29]}, 71 + {9, [52, 82, 95, 38, 80, 53, 84, 21, 93, 49], 72 + [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]}, 73 + {10, [41, 29, 95, 65, 52, 22, 51, 18, 88, 44], 74 + [88, 92, 47, 56, 71, 19, 58, 52, 15, 96, 25, 41, 75, 29, 65, 55, 43, 9, 64, 81, 73, 32, 5, 18, 75 + 30]}, 76 + {11, ~c"LBA&)R\tQ\v3", 77 + [4, 55, 70, 38, 58, 17, 5, 67, 26, 81, 91, 48, 28, 45, 83, 68, 64, 66, 25, 51, 95, 47, 63, 71, 78 + 54]}, 79 + {12, [96, 62, 75, 58, 44, 72, 73, 74, 9, 14], 80 + [20, 37, 54, 97, 70, 72, 18, 68, 79, 3, 45, 44, 15, 11, 73, 59, 64, 77, 61, 95, 34, 16, 55, 49, 81 + 2]}, 82 + {13, [79, 82, 49, 23, 78, 67, 45, 43, 18, 11], 83 + [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 + 84]}, 85 + {14, [72, 65, 58, 67, 11, 90, 77, 21, 22, 12], 86 + [17, 76, 4, 40, 15, 22, 92, 67, 43, 55, 90, 79, 65, 31, 71, 73, 58, 12, 21, 46, 20, 87, 63, 77, 87 + 9]}, 88 + {15, [80, 54, 73, 48, 42, 70, 69, 21, 23, 97], 89 + [31, 6, 27, 93, 90, 91, 16, 65, 24, 25, 46, 84, 37, 87, 40, 58, 29, 3, 64, 32, 15, 62, 47, 18, 90 + 94]}, 91 + {16, [15, 72, 5, 85, 34, 50, 49, 22, 65, 64], 92 + [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]}, 93 + {17, [7, 70, 36, 21, 60, 80, 50, 31, 23, 59], 94 + [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]}, 95 + {18, [63, 61, 70, 64, 94, 76, 25, 15, 26, 89], 96 + [22, 78, 89, 65, 23, 3, 29, 50, 34, 72, 32, 43, 8, 62, 21, 15, 20, 94, 68, 53, 12, 84, 99, 39, 97 + 57]}, 98 + {19, ~c"\"8cPYZ/9T'", 99 + [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]}, 100 + {20, [90, 72, 6, 31, 62, 86, 1, 29, 34, 70], 101 + [64, 84, 86, 29, 90, 3, 89, 50, 6, 54, 92, 85, 98, 32, 63, 24, 83, 43, 99, 59, 77, 12, 56, 38, 102 + 69]}, 103 + {21, [65, 22, 72, 35, 30, 38, 3, 10, 98, 95], 104 + [63, 65, 21, 71, 94, 58, 25, 16, 66, 51, 20, 75, 28, 11, 15, 24, 87, 56, 83, 31, 67, 1, 97, 64, 105 + 52]}, 106 + {22, [95, 70, 39, 21, 87, 97, 98, 96, 30, 6], 107 + [72, 26, 52, 65, 62, 10, 60, 49, 46, 36, 25, 55, 11, 42, 1, 31, 3, 73, 48, 29, 63, 51, 66, 17, 108 + 34]}, 109 + {23, [72, 74, 91, 77, 42, 31, 15, 61, 80, 85], 110 + [59, 62, 43, 19, 17, 16, 49, 83, 95, 35, 76, 67, 99, 46, 48, 44, 84, 98, 97, 13, 51, 55, 79, 29, 111 + ...]}, 112 + {24, [3, 74, 76, 13, 52, 81, 40, 84, 73, 98], 113 + [23, 71, 42, 2, 83, 5, 18, 75, 57, 41, 38, 46, 60, 66, 49, 62, 36, 51, 12, 86, 25, 22, 82, ...]}, 114 + {25, [39, 25, 66, 16, 13, 27, 48, 78, 52, 23], 115 + [43, 48, 98, 13, 88, 66, 55, 18, 71, 91, 11, 94, 75, 96, 89, 16, 4, 23, 51, 50, 62, 95, ...]}, 116 + {26, [66, 30, 18, 57, 40, 36, 60, 95, 99, 15], 117 + [60, 22, 73, 21, 69, 84, 95, 66, 51, 57, 49, 12, 30, 79, 99, 70, 46, 61, 92, 37, 36, ...]}, 118 + {27, [54, 11, 56, 55, 83, 78, 47, 57, 50, 19], 119 + [45, 70, 77, 49, 12, 41, 69, 78, 91, 20, 51, 67, 3, 6, 22, 62, 27, 60, 4, 63, ...]}, 120 + {28, [71, 72, 99, 35, 76, 23, 8, 44, 46, 53], 121 + [25, 97, 99, 77, 37, 23, 51, 22, 65, 62, 60, 46, 4, 47, 92, 84, 9, 61, 24, ...]}, 122 + {29, [69, 33, 37, 74, 19, 38, 81, 82, 62, 66], 123 + [42, 3, 67, 30, 52, 90, 47, 46, 34, 4, 1, 71, 98, 50, 54, 94, 58, 15, ...]}, 124 + {30, [25, 5, 15, 20, 84, 23, 86, 74, 50, 22], 125 + [20, 85, 71, 46, 21, 92, 61, 15, 22, 73, 51, 1, 84, 86, 49, 25, 57, ...]}, 126 + {31, [26, 60, 71, 4, 51, 57, 81, 61, 99, 64], 127 + [13, 70, 71, 77, 9, 68, 76, 99, 97, 55, 94, 4, 98, 34, 27, 54, ...]}, 128 + {32, [61, 16, 7, 90, 49, 39, 24, 34, 35, 17], 129 + [90, 75, 34, 25, 39, 26, 59, 67, 24, 35, 62, 19, 17, 54, 31, ...]}, 130 + {33, [91, 74, 62, 52, 86, 6, 46, 60, 16, 88], 131 + [27, 4, 32, 1, 74, 52, 69, 19, 62, 16, 91, 26, 86, 22, ...]}, 132 + {34, [79, 47, 49, 71, 56, 89, 21, 14, 29, 58], 133 + [80, 2, 93, 71, 37, 3, 33, 70, 9, 18, 20, 97, 85, ...]}, 134 + {35, [13, 30, 58, 94, 50, 44, 38, 99, 40, 9], [5, 75, 79, 40, 84, 20, 9, 2, 67, 95, 24, 30, ...]}, 135 + {36, [51, 30, 95, 27, 56, 7, 65, 94, 32, 86], [33, 90, 32, 80, 1, 79, 97, 66, 23, 29, 45, ...]}, 136 + {37, [14, 13, 1, 4, 86, 17, 9, 41, 68, 91], [1, 17, 85, 42, 82, 2, 91, 9, 94, 8, ...]}, 137 + {38, [63, 34, 17, 95, 15, 21, 1, 29, 39, 28], [81, 73, 45, 15, 65, 54, 74, 76, 12, ...]}, 138 + {39, ~c"\nB7,U:P$.-", [45, 37, 60, 8, 86, 31, 76, 90, ...]}, 139 + {40, [31, 12, 91, 62, 79, 34, 7, 81, ...], [49, 90, 73, 12, 57, 54, 83, ...]}, 140 + {41, [45, 60, 94, 64, 30, 32, 90, ...], [85, 65, 13, 79, 4, 36, ...]}, 141 + {42, [26, 16, 82, 83, 74, 68, ...], [21, 59, 65, 72, 29, ...]}, 142 + {43, [33, 83, 48, 64, 26, ...], [78, 22, 1, 43, ...]}, 143 + {44, ~c"ZD&a5<:2'b", [88, 31, 11, ...]}, 144 + {45, [79, 31, 56, ...], [90, 53, ...]}, 145 + {46, ~c".4$XY?'L&(", [82, ...]}, 146 + {47, ~c"\f_C\b%SR4\t3", [...]}, 147 + {48, [...], ...}, 148 + {49, ...}, 149 + {...}, 150 + ... 151 + ] 152 + ``` 153 + 154 + ## Part 1 155 + 156 + ```elixir 157 + cards 158 + |> Enum.map(fn {_, wins, inputs} -> 159 + matches = length(wins) - length(wins -- inputs) 160 + 161 + if matches > 0, do: 2 ** (matches - 1), else: 0 162 + end) 163 + |> dbg() 164 + |> Enum.sum() 165 + ``` 166 + 167 + <!-- livebook:{"output":true} --> 168 + 169 + ``` 170 + 19855 171 + ``` 172 + 173 + ## Part 2 174 + 175 + ```elixir 176 + cards 177 + |> Enum.reduce(%{}, fn {id, wins, inputs}, acc -> 178 + matches = length(wins) - length(wins -- inputs) 179 + 180 + {current, acc} = 181 + Map.get_and_update(acc, id, fn v -> 182 + v = (v || 0) + 1 183 + {v, v} 184 + end) 185 + 186 + Enum.reduce(1..matches//1, acc, &Map.update(&2, id + &1, current, fn a -> a + current end)) 187 + end) 188 + |> Map.values() 189 + |> Enum.sum() 190 + |> dbg() 191 + ``` 192 + 193 + <!-- livebook:{"output":true} --> 194 + 195 + ``` 196 + 10378710 197 + ``` 198 + 199 + <!-- livebook:{"offset":11578,"stamp":{"token":"XCP.lXGe3Iu191OYuBQqrLXtyX10eAJRxaC7kWxJhXV-XwPuZXy80YHtfPI-uAobs5Ncg0KyodauGARY5zWPhVt6a96P5flHG1j0LHMDzRblFBObyqrIKaYaIlaYVVUXUtasrA","version":2}} -->