add day 2 solutions
This commit is contained in:
parent
b033d3eca7
commit
bc3c9a0e46
2 changed files with 146 additions and 0 deletions
69
day2/day2_1.ex
Normal file
69
day2/day2_1.ex
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
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}"
|
77
day2/day2_2.ex
Normal file
77
day2/day2_2.ex
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
input = IO.gets("input?")
|
||||||
|
|> String.trim
|
||||||
|
|> String.split(" ")
|
||||||
|
|
||||||
|
defmodule Solver do
|
||||||
|
|
||||||
|
def to_list(string) do
|
||||||
|
case string do
|
||||||
|
"" -> []
|
||||||
|
_ ->
|
||||||
|
string
|
||||||
|
|> String.split("")
|
||||||
|
|> Enum.filter(fn char ->
|
||||||
|
char != ""
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# get the common string between the box ids
|
||||||
|
def get_common(box_id, box_id_2) do
|
||||||
|
|
||||||
|
# convert to list
|
||||||
|
box_id_l = to_list(box_id)
|
||||||
|
box_id_2_l = to_list(box_id_2)
|
||||||
|
|
||||||
|
# zip them
|
||||||
|
list_chars = Enum.zip(box_id_l, box_id_2_l)
|
||||||
|
|
||||||
|
# if theyre equal, we add to the accumulator
|
||||||
|
common_str = Enum.reduce(list_chars, "", fn tup, acc ->
|
||||||
|
{c1, c2} = tup
|
||||||
|
|
||||||
|
if c1 == c2 do
|
||||||
|
acc <> c1
|
||||||
|
else
|
||||||
|
acc
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
# for common_str to be valid it has to be
|
||||||
|
# L(common_str) = L(box_id) - 1
|
||||||
|
# since correct box ids have just *ONE*
|
||||||
|
# character difference between them
|
||||||
|
if String.length(common_str) == (String.length(box_id) - 1) do
|
||||||
|
{:ok, common_str}
|
||||||
|
else
|
||||||
|
:not_found
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def solve(input) do
|
||||||
|
# find all the common strings
|
||||||
|
# and filter shit
|
||||||
|
commons = Enum.map(input, fn box_id ->
|
||||||
|
Enum.map(input, fn box_id_2 ->
|
||||||
|
common = get_common(box_id, box_id_2)
|
||||||
|
|
||||||
|
case common do
|
||||||
|
:not_found -> nil
|
||||||
|
{:ok, str} -> str
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|> Enum.filter(fn combo ->
|
||||||
|
combo != nil
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|> Enum.filter(fn combo ->
|
||||||
|
combo != []
|
||||||
|
end)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
res = Solver.solve(input)
|
||||||
|
IO.puts "result: #{inspect res}"
|
Loading…
Reference in a new issue