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()