1
1
Fork 0
aoc2018/day5.exs

60 lines
1.7 KiB
Elixir

defmodule DayFive do
def part_one(input) do
shortened = fully_react_new(input)
# IO.puts shortened
String.length(shortened) - 1
end
def fully_react(input) do
replacer =
~r/Aa|Bb|Cc|Dd|Ee|Ff|Gg|Hh|Ii|Jj|Kk|Ll|Mm|Nn|Oo|Pp|Qq|Rr|Ss|Tt|Uu|Ww|Vv|Xx|Yy|Zz|aA|bB|cC|dD|eE|fF|gG|hH|iI|jJ|kK|lL|mM|nN|oO|pP|qQ|rR|sS|tT|uU|wW|vV|xX|yY|zZ/
replace_forever(input, replacer, "")
end
def replace_forever(string, pattern, replacement) do
if Regex.match?(pattern, string) do
replace_forever(Regex.replace(pattern, string, replacement), pattern, replacement)
else
string
end
end
def react([<<char1>>, <<char2>> | tail]) when char1 == char2 - 32 or char2 == char1 - 32,
do: react(tail)
def react([char | tail]), do: [char | react(tail)]
def react(""), do: []
def react([]), do: []
def fully_react_new(input) do
# IO.puts "mark"
Enum.join(fully_react_new(String.codepoints(input), []))
end
def fully_react_new(input, acc) when input == acc, do: acc
def fully_react_new(input, _acc) do
# IO.puts("#{length _acc} #{length input}")
fully_react_new(react(input), input)
end
def part_two(input) do
chars = Enum.map(?a..?z, &<<&1>>)
[{_char, poly} | _] =
Enum.map(chars, fn char -> {char, String.replace(input, char, "")} end)
|> Enum.map(fn {char, poly} -> {char, String.replace(poly, String.upcase(char), "")} end)
|> Enum.map(fn {char, poly} -> {char, fully_react_new(poly)} end)
|> Enum.sort_by(fn {_char, poly} -> String.length(poly) end)
# IO.puts poly
String.length(poly) - 1
end
end
{:ok, content} = File.read("input5.txt")
IO.puts("Part 1: #{DayFive.part_one(content)}")
IO.puts("Part 2: #{DayFive.part_two(content)}")