From 00acacb173592301561eb39c4343e9a7bc544194 Mon Sep 17 00:00:00 2001 From: Caleb Webber Date: Fri, 7 Mar 2025 00:00:28 -0500 Subject: [PATCH] add problem 25 solution --- lib/euler/algebra.ex | 21 +++++++++++++++++++++ solutions/25/solution.exs | 9 +++++++++ 2 files changed, 30 insertions(+) create mode 100644 solutions/25/solution.exs diff --git a/lib/euler/algebra.ex b/lib/euler/algebra.ex index cbe4aba..f66ab3f 100644 --- a/lib/euler/algebra.ex +++ b/lib/euler/algebra.ex @@ -23,6 +23,27 @@ defmodule Euler.Algebra do Returns the sum of the digits of `n`. """ def digit_sum(n), do: digit_sum(n, 0) + + def fib(0), do: 1 + def fib(1), do: 1 + def fib(n) do + cache = Process.get(:fib, %{}) + case Map.get(cache, n, nil) do + nil -> + value = fib(n - 1) + fib(n - 2) + cache = Process.get(:fib, %{}) |> Map.put_new(n, value) + Process.put(:fib, cache) + value + m -> m + end + end + + def num_digits(0, acc), do: acc + def num_digits(n, acc), do: num_digits(div(n,10),acc+1) + def num_digits(0), do: 1 + def num_digits(n) do + num_digits(n, 0) + end end diff --git a/solutions/25/solution.exs b/solutions/25/solution.exs new file mode 100644 index 0000000..647f62b --- /dev/null +++ b/solutions/25/solution.exs @@ -0,0 +1,9 @@ +import Euler.Algebra, only: [fib: 1, num_digits: 1] + +Stream.iterate(1, &(&1 + 1)) +|> Stream.map(&{&1, fib(&1)}) +|> Stream.filter(&num_digits(elem(&1, 1)) >= 1000) +|> Enum.take(1) +|> Enum.map(&elem(&1, 0) + 1) +|> Enum.at(0) +|> IO.puts()