79 lines
1.8 KiB
Elixir
79 lines
1.8 KiB
Elixir
import AOC
|
|
|
|
aoc 2015, 16 do
|
|
@moduledoc """
|
|
children: 3
|
|
cats: 7
|
|
samoyeds: 2
|
|
pomeranians: 3
|
|
akitas: 0
|
|
vizslas: 0
|
|
goldfish: 5
|
|
trees: 3
|
|
cars: 2
|
|
perfumes: 1
|
|
"""
|
|
|
|
def known_properties() do
|
|
"""
|
|
children: 3
|
|
cats: 7
|
|
samoyeds: 2
|
|
pomeranians: 3
|
|
akitas: 0
|
|
vizslas: 0
|
|
goldfish: 5
|
|
trees: 3
|
|
cars: 2
|
|
perfumes: 1
|
|
"""
|
|
|> String.split("\n", trim: true)
|
|
|> Enum.map(&String.split(&1, ": "))
|
|
|> Enum.map(fn [l, v] -> {l, String.to_integer(v)} end)
|
|
end
|
|
|
|
def get_value(sue, label) do
|
|
[value] = Regex.run(~r/#{label}: (\d+)/, sue, capture: :all_but_first)
|
|
value |> String.to_integer()
|
|
end
|
|
|
|
def p1 do
|
|
input_stream()
|
|
|> Stream.filter(fn sue ->
|
|
known_properties()
|
|
|> Enum.filter(fn {label, _} -> String.contains?(sue, label) end)
|
|
|> Enum.all?(fn {label, value} ->
|
|
if String.contains?(sue, label) do
|
|
String.contains?(sue, "#{label}: #{value}")
|
|
else
|
|
true
|
|
end
|
|
end)
|
|
end)
|
|
|> Stream.take(1)
|
|
|> Enum.to_list()
|
|
|> hd()
|
|
end
|
|
|
|
def p2 do
|
|
input_stream()
|
|
|> Stream.filter(fn sue ->
|
|
known_properties()
|
|
|> Enum.filter(fn {label, _} -> String.contains?(sue, label) end)
|
|
|> Enum.all?(fn
|
|
{label, value} when label in ~w[cats trees] ->
|
|
IO.inspect(label, label: "label")
|
|
IO.inspect(value, label: "value")
|
|
IO.inspect(get_value(sue, label), label: "get_value(sue, label)")
|
|
value < get_value(sue, label)
|
|
|
|
{label, value} when label in ~w[goldfish pomeranians] ->
|
|
value > get_value(sue, label)
|
|
|
|
{label, value} ->
|
|
String.contains?(sue, "#{label}: #{value}")
|
|
end)
|
|
end)
|
|
|> Enum.to_list()
|
|
end
|
|
end
|