import AOC

aoc 2015, 8 do
  def decoded_difference(str, diff \\ 0)
  def decoded_difference("", diff), do: diff
  def decoded_difference(~S[\"] <> rest, diff), do: decoded_difference(rest, diff + 1)
  def decoded_difference(~S[\\] <> rest, diff), do: decoded_difference(rest, diff + 1)
  def decoded_difference(~S["] <> rest, diff), do: decoded_difference(rest, diff + 1)

  def decoded_difference(<<(~S[\x]), _::binary-size(2), rest::binary>>, diff),
    do: decoded_difference(rest, diff + 3)

  def decoded_difference(<<_::binary-size(1), rest::binary>>, diff),
    do: decoded_difference(rest, diff)

  def encoded_difference(str, diff \\ 0)
  def encoded_difference("", diff), do: diff + 2
  def encoded_difference(~S["] <> rest, diff), do: encoded_difference(rest, diff + 1)
  def encoded_difference(~s[\\] <> rest, diff), do: encoded_difference(rest, diff + 1)

  def encoded_difference(<<_::binary-size(1), rest::binary>>, diff),
    do: encoded_difference(rest, diff)

  def p1 do
    input_stream()
    |> Stream.map(&decoded_difference/1)
    |> Enum.sum()
  end

  def p2 do
    input_stream()
    |> Stream.map(&encoded_difference/1)
    |> Enum.sum()
  end
end