diff --git a/lib/day2/day2.ex b/lib/day2/day2.ex new file mode 100644 index 0000000..e38fd4b --- /dev/null +++ b/lib/day2/day2.ex @@ -0,0 +1,76 @@ +defmodule Day2 do + def count_characters(id) do + id + |> String.graphemes() + |> Enum.reduce(%{}, fn c, acc -> + Map.update(acc, c, 1, &(&1 + 1)) + end) + end + + def checksum(list) do + characters = Enum.map(list, &count_characters/1) + two = Enum.count(characters, any_char_count(2)) + three = Enum.count(characters, any_char_count(3)) + two * three + end + + defp any_char_count(n) do + fn map -> + map + |> Enum.to_list() + |> Enum.any?(fn {_c, count} -> count == n end) + end + end + + def diff(a, b) do + a = String.graphemes(a) + b = String.graphemes(b) + Enum.zip(a, b) + |> Enum.reduce({0, ""}, fn {a, b}, {diff_count, common} -> + cond do + a == b -> + {diff_count, common <> a} + true -> + {diff_count + 1, common} + end + end) + end + + def match(id, list) do + Enum.reduce_while(list, nil, fn other_id, _acc -> + case diff(id, other_id) do + {1, common} -> {:halt, common} + _ -> {:cont, nil} + end + end) + end + + def correct_boxes(list) do + list + |> Enum.reduce_while(nil, fn id, _acc -> + case match(id, list) do + nil -> {:cont, nil} + common -> {:halt, common} + end + end) + end + + def except(list, except) do + Enum.reject(list, fn el -> el == except end) + end + + defp parse_input() do + File.read!("lib/day2/input.txt") + |> String.split("\n") + end + + def part1() do + parse_input() + |> checksum() + end + + def part2() do + parse_input() + |> correct_boxes() + end +end \ No newline at end of file diff --git a/lib/day2/input.txt b/lib/day2/input.txt new file mode 100644 index 0000000..b8c7ae6 --- /dev/null +++ b/lib/day2/input.txt @@ -0,0 +1,250 @@ +bpacnmelhhzpygfsjoxtvkwuor +biacnmelnizqygfsjoctvkwudr +bpaccmllhizyygfsjoxtvkwudr +rpacnmelhizqsufsjoxtvkwudr +bfacnmelhizqygfsjoxtvwwudp +bpacnmelhizqynfsjodtvkyudr +bpafnmelhizqpgfsjjxtvkwudr +bpackmelhizcygfsjoxtvkwudo +bmacnmilhizqygfsjoltvkwudr +bpafnmelhizuygfsjoxtvkwsdr +boacnmylhizqygfsjoxtvxwudr +bpbcjmelhizqygfsjoxtgkwudr +bpacnmglhizqygfsjixtlkwudr +bpacnmclhizqygfsjoxtvkwtqr +bpacnmelhczqygtsjoptvkwudr +bpacnmelhizqywfsaoxtvkbudr +apacnmelhizqygcsjoxtvkwhdr +bpacnmelrizqygfsbpxtvkwudr +tpkcnmelpizqygfsjoxtvkwudr +bpacnmelhizqlgfsjobtmkwudr +npacnmelhizqygffjoxtvkwudf +bpacnmeehqzqygqsjoxtvkwudr +bpecnmelhizqigfsjvxtvkwudr +bpacnmelhizqysfsjoxtvkdfdr +bpacnfelhkzqygfsjoxtvkwfdr +bpacnbelvizqygfsjoxthkwudr +bpacnoelhizqygfejoxtvkwudn +bpacnmelhizqygfzpkxtvkwudr +bpahnmelhizqyufsjoxmvkwudr +bpacnmelhizqygfsnoxtvkwmmr +bpacnmelhizqygfsjoatvkludf +bpacnmylhizqygfsjlxtvksudr +bpacnmekhpzqygysjoxtvkwudr +bpacnselhizqogfswoxtvkwudr +bpacnmelhizqprfsjoxwvkwudr +bpatnmelhinqygfsjoctvkwudr +bpacnqelhqzqygfsxoxtvkwudr +bpabnmelhiyqygfsjoxtykwudr +bpacnivlhizqygfsjoxtviwudr +bpkcnmylhizqygfsjoxtvkwcdr +bpafnmflhizqygtsjoxtvkwudr +bpachmelhizqygfsjixtvkwudg +bpacymelhizqygfsjoxtykwuar +bpacnkelhizqdgfsjoxtskwudr +bpacnmezhizqggbsjoxtvkwudr +bpacnmqlhizqygrsjoxzvkwudr +bpaczmelhizqyhfsjoxfvkwudr +bdacnmelhyzqygusjoxtvkwudr +bpacbmelhizqywfsjostvkwudr +bpacnmelhihzygfstoxtvkwudr +bpactmelhizqygfsjcxtvkwydr +bkacnmethizqytfsjoxtvkwudr +bpacnmalhizqydfskoxtvkwudr +spacnmelbizqygfsjoxdvkwudr +lpalnmelhizoygfsjoxtvkwudr +bpacjmeghizqygfsjoxtviwudr +bpacnmeqhizxygfsjoxgvkwudr +bpacnmelhizqygosjoxtvkkuhr +bpacnmelhiznbxfsjoxtvkwudr +bgacnmelhizqygfsjbxivkwudr +bpacnmelhizqygfjjowtvswudr +bpacnmelhizqygfsjovtgkmudr +bpacnmelcmzqygfspoxtvkwudr +bpvcnmelhizqyvfcjoxtvkwudr +bpacnmeahizqjgfsjoxtvkwukr +bpacnoelwizqygfsjoxtvkaudr +xpacnmelhizqygfsjoxdvkwedr +mpacnmelqizqygfsjoxtvkwudx +bppcnmelhizqygfsjfxtvkhudr +bpacnmclhizqyhfsjaxtvkwudr +opacsmelhizqygfsjmxtvkwudr +bpafnmelhizqjgfsjoxtvkrudr +bpdcnmilhizqygfsjoxtvkludr +bpainmelhizqygfsjtntvkwudr +bradnmelhizqygfsjextvkwudr +bpacnmelhizqygfmsoxtvkwudg +bpacneelhizqygvrjoxtvkwudr +bpacnpelhizqygfsjoxyvkwudf +bpacnmelhizqygfsqoqtvkwodr +bpacnmelhizjyghsjoxcvkwudr +bpacnmelmibqygfsjoxtvnwudr +jpacnmelaizqygfwjoxtvkwudr +zpachmelhizqygfsjsxtvkwudr +bpacnmelfizqykfsjomtvkwudr +bpacnmllwizqygfsjoxtvkwusr +bpaynmelhizqygfsjoxtvowcdr +jpacnmqlhizqygfsjoxtvknudr +bpacxmelhizqyffsjoxtvkwugr +apawnmelhizqygfsjtxtvkwudr +mpacnmelhitqigfsjoxtvkwudr +bpacnmelhhzqygfsjoxtvkyzdr +gpacnmelhizqynfsjoxtvkwudm +bnacnkelhizqygfsjoxtpkwudr +bpacnmelfizqygfsumxtvkwudr +bpacnmelhisqygfsjohtvowudr +bpacnmelhimqygxsjoxtvkwudn +bpscnmeliizqygfsjoxtvkwunr +qpacnmelhizqycfsjoxtvkwndr +bpacnmelhijqygfsjohtvkyudr +bpacnmelhizqykfsjkxtvknudr +bpacnqilhizqygfsjoxtvkoudr +bpacnmelhizqzgmsjoxtvkwurr +bpdcnmelhizqygfsjoutukwudr +bpecnmeghizqygfsjoxgvkwudr +bpicnmelhizqygfrjoxtvlwudr +bpacnmelhizfygfsroxtvkwodr +buacnmelhizqygjsjoxtvkvudr +bpacnmelhixqykfsjoxtvrwudr +bpacnmelhizqygvejcxtvkwudr +bpacnmjlhizqylfsjoxtvkwuor +qpacnmelhizqygfsjoxfdkwudr +bpfcnmemhizqygfsjoxtvknudr +bpacnmelhizqoffsjqxtvkwudr +hpacnielhiqqygfsjoxtvkwudr +gpacnmelhizqygfsewxtvkwudr +bpacnmellizqylxsjoxtvkwudr +bpacnmenhizqymfsjoxtvkmudr +bpacnfelhizqygcsjoltvkwudr +bpacnmelhqqqygfsjoxtvkuudr +bplgnmelhiqqygfsjoxtvkwudr +bpacnzelhizqygfgjoxtvnwudr +bpacnmelhizqygfsjoktvknunr +bpacnmdlhioqygfnjoxtvkwudr +epacnmelwizqyjfsjoxtvkwudr +bpacxmelhazfygfsjoxtvkwudr +bpacnmejhezqygfsjoxtskwudr +bpacnqelhihqyzfsjoxtvkwudr +bpacnbelhizqyrfsjoxtvkmudr +bpacnmelhizqygfsjoxtylwzdr +bpacnmelwizqygfsjodtvkhudr +bpacnnelhizqygfsjoxtwkwadr +bpacimelhizqygfsnoxtvkwuor +bpacnmelhizqyaasjoxtlkwudr +bpacnmelhizqyeffjoxtvkwuds +bpacnmenhizqygxscoxtvkwudr +bpacnmelhidqygfsjowtskwudr +bpacnmeliizqygfsjoxhvkwucr +bpacimelhizqygfsjoxtvktuwr +bpainmelhhzqygfsjzxtvkwudr +bpacamelhizqygfsjogtvkwbdr +bpccnmelgizqygfsjoxtykwudr +bpacnmelhizwegfsjoxtvkwadr +bpackmelhbzqygqsjoxtvkwudr +bpacymeihizqyffsjoxtvkwudr +bpacnielhczqygfsjoxtvkwudk +bpacnmejhizqygffjoxjvkwudr +ppacnmelhizqygfsjoxtigwudr +bpjcnmolhizqygfsjoxtvkwndr +bpacnmelcizqygrsjoxtakwudr +cpawnmelhizqygfsjoxmvkwudr +bwacnmelhizqygesjoxtakwudr +bpacnmelhizqygfsjexsvkwddr +bpaunmelhiuqygfsjoxtvkwtdr +bpacnmellimqygfsjextvkwudr +bpacnmerhizqygfsaoxvvkwudr +bpacnmglhizqygfsjixtukwudr +ppacnmelhizqygfsjoxtvkdudp +bpacnmedhizqygukjoxtvkwudr +bpccnmelhizqngfsjoxtvkwadr +bgacnmeldizqygfscoxtvkwudr +bpacngelhizsygfsjoxtvkwkdr +bpacnpelhizqygfsjoxctkwudr +bpacnmylhizqygfcjoxtvkwmdr +npacnmelhizqygfsjoxtwkwuds +bpaxnmelhizqydfsjoxyvkwudr +bpacnhelhizjygfsjoxtvkmudr +bpacnkelhczqygfnjoxtvkwudr +bfacnmelhizrygfsjoxtvkwodr +bpycnmelhizqygfofoxtvkwudr +qpacpselhizqygfsjoxtvkwudr +bpvcnmelhezqygfsjoxttkwudr +bpacnmwlhizqygfijoxtmkwudr +bsacnmelhikqygfsjoxttkwudr +bpccnxelhizqyafsjoxtvkwudr +bpacnmelhizqygfswhxtvewudr +vpacnmzlhizqygfsvoxtvkwudr +bpacnmelhihqygfsjoxtvkqurr +bpacnmelhixqygazjoxtvkwudr +bpavnmelhizqygfsjozpvkwudr +bpacnmclhizuygfsjoxmvkwudr +bpacnmelhizryufsjoxtkkwudr +bpacnmelhtzqygfsjobtvkwufr +bpacnmelhizqmlfsjoxtvkwudq +bpaaneelhizqygfsjlxtvkwudr +bpacnmelhxzqygfsjoxthkwuhr +bpacnmeshizqygfcjoxtvkwude +bpacnzqlhizqygfsxoxtvkwudr +bgaanmelhizqycfsjoxtvkwudr +bpacnmexhizqygfsroxtvkwudn +bpmmnmelhizqygfajoxtvkwudr +bpacnmelhizqylfsjoxtckwhdr +bpicnmelhizqyrfsjoxtvkwudi +zpacnmelhizvycfsjoxtvkwudr +bpamnmkllizqygfsjoxtvkwudr +bpacnmelhrzqyrfsjoxgvkwudr +bpadnmelhczqygfsjoxtlkwudr +bpacrmelhizqygrsjoxtvkiudr +lpacnmelhizqygfsjoxtgkwxdr +fpacnmalhiuqygfsjoxtvkwudr +bpacnmelhizqygfsjixtvfwcdr +bpccnmelhxzqygfkjoxtvkwudr +bpacnmepaizqygfsjoctvkwudr +tpacnmelhivqygfsxoxtvkwudr +kpacnfelhitqygfsjoxtvkwudr +baacnzelhizqygfsjoxtvkwudx +bcycnmeghizqygfsjoxtvkwudr +wpacotelhizqygfsjoxtvkwudr +bpacnmsshizqygrsjoxtvkwudr +blacnmelhizqygfsjoxtykwvdr +bkacnmelhizqygfsjoxuvkludr +bpacnmelhizaugfsjoxtvhwudr +fpavnmelhizqygfsgoxtvkwudr +bpachmelnizqygfsjextvkwudr +bpacnmelhizqpgfsjoxtvkwldu +bpacnmelhizqygfsloftvywudr +bpacntelhvzqygfejoxtvkwudr +bpacnmeldizqygfsjmxtvkdudr +byacnmelhizqygfsjsxtvkwudh +bpacnmellizqygssxoxtvkwudr +bpacnmelhizqygfsjootvknuir +bpacnmelhitqjgfsjoxivkwudr +bpacnmelhazaygfsjoxtvfwudr +bpacnzenhizqygfsjzxtvkwudr +bpacnmelhizqypfsdoxtvkwuar +bpannmelhizqygnsjoxtvkwndr +bracnmeldizsygfsjoxtvkwudr +bpacnmelhizwygfsjugtvkwudr +bpatnmelhizqygfsjoytvkwulr +upacnmelhizqygfsjurtvkwudr +bpaenmezhizqygfsjostvkwudr +bpacnmelhizpygfsjodhvkwudr +bpacnmelhizqygfsjogtvkguwr +bpacnmelhisqygfsjoxtpkuudr +bxacnmelhizqygfsjdxtvkfudr +bpacnmelhizqygfsjohqvkwudu +bzacnmtlhizqygfsjoxsvkwudr +bpacnmplhixrygfsjoxtvkwudr +bpacnmelhizqhgfsjomtvkwudg +bpacnmezhizqygfsjxxtykwudr +bpacnmwlhizqygfujoxtzkwudr +tpacnmelhizqygfsjoxkvpwudr +bpawsmenhizqygfsjoxtvkwudr +bpacnmelhizqtgfsjoxttkwuqr +bpkcbmelhizqygfsjoxtvkwucr +bpacfmekhizqygfsjoxtvkwuds +bpacnmethizqynfajoxtvkwudr +bpocnmclhizqygfsjoxtvkwukr +zpacnmwlhizqygfsjoxzvkwudr +bpacpoelhqzqygfsjoxtvkwudr +bpacnlelhizqyzfsjoxtvkwukr \ No newline at end of file diff --git a/test/day2_test.exs b/test/day2_test.exs new file mode 100644 index 0000000..7698ed7 --- /dev/null +++ b/test/day2_test.exs @@ -0,0 +1,29 @@ +defmodule Day2Test do + use ExUnit.Case + doctest Day2 + + test "count characters" do + assert Day2.count_characters("abcdef") == %{"a" => 1, "b" => 1, "c" => 1, "d" => 1, "e" => 1, "f" => 1} + assert Day2.count_characters("bababc") == %{"a" => 2, "b" => 3, "c" => 1} + assert Day2.count_characters("abbcde") == %{"a" => 1, "b" => 2, "c" => 1, "d" => 1, "e" => 1} + end + + test "checksum list" do + list = ["abcdef", "bababc", "abbcde", "abcccd", "aabcdd", "abcdee", "ababab"] + assert Day2.checksum(list) == 12 + end + + test "diff" do + assert Day2.diff("fghij", "fguij") == {1, "fgij"} + end + + test "match" do + list = ["abcde", "fghij", "klmno", "pqrst", "fguij", "axcye", "wvxyz"] + assert Day2.match("fghij", list) == "fgij" + end + + test "correct boxes" do + list = ["abcde", "fghij", "klmno", "pqrst", "fguij", "axcye", "wvxyz"] + assert Day2.correct_boxes(list) == "fgij" + end +end \ No newline at end of file