advent-of-code/2015-elixir/lib/solutions/day_05.ex

74 lines
1.6 KiB
Elixir
Raw Normal View History

2021-11-01 16:40:46 +01:00
defmodule Aoc.Solution.Day05 do
@name "Day 5: Doesn't He Have Intern-Elves For This?"
@behaviour Solution
@impl Solution
def get_name, do: @name
@impl Solution
def parse!(raw) do
raw
|> String.split()
end
@impl Solution
def solve_first_part(strings) do
strings
|> Enum.map(fn s -> nice?(s) end)
|> Enum.map(fn b ->
if b, do: 1, else: 0
end)
|> Enum.sum()
end
@impl Solution
def solve_second_part(strings) do
strings
|> Enum.map(fn s -> still_nice?(s) end)
|> Enum.map(fn b ->
if b, do: 1, else: 0
end)
|> Enum.sum()
end
defp nice?(subject) do
Enum.all?([
does_not_contain_the_strings(subject),
contains_at_least_three_vowels(subject),
contains_at_least_one_letter_pair(subject)
])
end
defp still_nice?(subject) do
Enum.all?([
contains_a_letter_pair_without_overlapping(subject),
contains_one_letter_pair_which_repeats_with_exactly_one_letter_between_them(subject)
])
end
defp contains_at_least_three_vowels(subject) do
r = ~r/[aeiou].*[aeiou].*[aeiou].*/
String.match?(subject, r)
end
defp contains_at_least_one_letter_pair(subject) do
r = ~r/(\w)\1/
String.match?(subject, r)
end
defp does_not_contain_the_strings(subject) do
r = ~r/ab|cd|pq|xy/
not String.match?(subject, r)
end
defp contains_a_letter_pair_without_overlapping(subject) do
r = ~r/(\w{2}).*\1/
String.match?(subject, r)
end
defp contains_one_letter_pair_which_repeats_with_exactly_one_letter_between_them(subject) do
r = ~r/(\w)\w\1/
String.match?(subject, r)
end
end