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