import AOC

aoc 2015, 5 do
  @deny_list ~w(ab cd pq xy)

  def p1 do
    input_stream()
    |> Stream.filter(&is_string_nice_p1?/1)
    |> Enum.count()
  end

  defp is_string_nice_p1?(str) do
    contains_at_least_three_vowels = String.match?(str, ~r/(?:[aeiou].*){3}/)
    contains_double_letter = String.match?(str, ~r/(\w)\1/)
    does_not_contain_denylist = not Enum.any?(@deny_list, &String.contains?(str, &1))

    contains_at_least_three_vowels and contains_double_letter and does_not_contain_denylist
  end

  def p2 do
    input_stream()
    |> Stream.filter(&is_string_nice_p2?/1)
    |> Enum.count()
  end

  defp is_string_nice_p2?(str) do
    String.match?(str, ~r/(\w)(\w).*\1\2/) and String.match?(str, ~r/(\w)\w\1/)
  end
end