70 lines
1.5 KiB
Elixir
70 lines
1.5 KiB
Elixir
|
input = IO.gets("input?")
|
||
|
|> String.trim
|
||
|
|> String.split(" ")
|
||
|
|
||
|
defmodule Solver do
|
||
|
|
||
|
# convert from bool to 1/0
|
||
|
def to_num(boolean) do
|
||
|
if boolean do
|
||
|
1
|
||
|
else
|
||
|
0
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def process(input) do
|
||
|
ids_properties = Enum.map(input, fn box_id ->
|
||
|
|
||
|
# convert string to list
|
||
|
box_id_chars = box_id |> String.split("") |> Enum.filter(fn char ->
|
||
|
char != ""
|
||
|
end)
|
||
|
|
||
|
# get the letter repeats for each char in it
|
||
|
counts = Enum.map(box_id_chars, fn id_letter ->
|
||
|
|
||
|
count = Enum.count(box_id_chars, fn character ->
|
||
|
character == id_letter
|
||
|
end)
|
||
|
|
||
|
count
|
||
|
end)
|
||
|
|
||
|
IO.puts "counts: #{inspect counts}"
|
||
|
|
||
|
# check if it has letters repeated twice or three times
|
||
|
r = {
|
||
|
Enum.count(counts, fn count -> count == 2 end) > 1,
|
||
|
Enum.count(counts, fn count -> count == 3 end) > 1
|
||
|
}
|
||
|
|
||
|
IO.puts "result: #{inspect r}"
|
||
|
|
||
|
r
|
||
|
end)
|
||
|
|
||
|
# count all box ids that have twice/three-repeated
|
||
|
{total_twice, total_three} = Enum.reduce(ids_properties, {0, 0}, fn property, acc ->
|
||
|
{old_twice, old_three} = acc
|
||
|
{is_twice, is_three} = property
|
||
|
|
||
|
change_tw = to_num(is_twice)
|
||
|
change_th = to_num(is_three)
|
||
|
|
||
|
{
|
||
|
old_twice + change_tw,
|
||
|
old_three + change_th
|
||
|
}
|
||
|
end)
|
||
|
|
||
|
# Solution
|
||
|
total_twice * total_three
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
IO.puts "input: #{input}"
|
||
|
result = Solver.process(input)
|
||
|
IO.puts "ACTUAL RESULT: #{result}"
|