summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandre Jesus <adbjesus@gmail.com>2024-12-11 22:49:34 +0000
committerAlexandre Jesus <adbjesus@gmail.com>2024-12-11 22:49:34 +0000
commit60a8ca5849b0d4cb50d77b34a3b8ab2259ccf7a9 (patch)
treea4ad764f8bdb9c2c639bd475d961a93da8d5677f
parentdc1cd90aa65dfa391decf7346f3515207633ad29 (diff)
downloadaoc2024-60a8ca5849b0d4cb50d77b34a3b8ab2259ccf7a9.tar.gz
aoc2024-60a8ca5849b0d4cb50d77b34a3b8ab2259ccf7a9.zip
Day 11
-rw-r--r--src/day11.exs64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/day11.exs b/src/day11.exs
new file mode 100644
index 0000000..b5d31ba
--- /dev/null
+++ b/src/day11.exs
@@ -0,0 +1,64 @@
+defmodule Day11 do
+ def part1(data) do
+ parse_and_solve(data, 25)
+ end
+
+ def part2(data) do
+ parse_and_solve(data, 75)
+ end
+
+ defp parse_and_solve(data, count) do
+ data
+ |> String.split([" ", "\n"], trim: true)
+ |> Enum.map(&String.to_integer/1)
+ |> solve(count)
+ |> elem(0)
+ end
+
+ defp solve(nums, rem, cache \\ %{})
+
+ defp solve(nums, 0, cache), do: {Enum.count(nums), cache}
+
+ defp solve([h], rem, cache) do
+ key = {h, rem}
+ case Map.fetch(cache, key) do
+ {_, res} ->
+ {res, cache}
+ :error ->
+ nxt =
+ if h == 0 do
+ [1]
+ else
+ digits = Integer.digits(h)
+ c = Enum.count(digits)
+ if rem(c, 2) == 0 do
+ {a, b} = Enum.split(digits, div(c, 2))
+ a = Integer.undigits(a)
+ b = Integer.undigits(b)
+ [a, b]
+ else
+ [h*2024]
+ end
+ end
+ {res, cache} = solve(nxt, rem-1, cache)
+ cache = Map.put(cache, key, res)
+ {res, cache}
+ end
+ end
+
+ defp solve([h | t], rem, cache) do
+ {c1, cache} = solve([h], rem, cache)
+ {c2, cache} = solve(t, rem, cache)
+ {c1 + c2, cache}
+ end
+end
+
+data = IO.read(:stdio, :eof)
+
+{time1 , ans1} = :timer.tc(fn -> Day11.part1(data) end)
+IO.puts("Time : #{time1 / 1000000}")
+IO.puts("Answer: #{ans1}")
+
+{time2 , ans2} = :timer.tc(fn -> Day11.part2(data) end)
+IO.puts("Time : #{time2 / 1000000}")
+IO.puts("Answer: #{ans2}")