jabuci

jabuci

I’m new to Elixir (started yesterday) and as a first little program, I wanted to solve the Münchausen numbers problem.

“A Münchausen number is a number equal to the sum of its digits raised to each digit’s power. For instance, 3435 is a Münchausen number because 3^3+4^4+3^3+5^5 = 3435. The largest Münchausen number is less than 440 million.”

The problem is that my program eats up all my RAM (16 GB) and the OS kills the process. And I don’t understand what goes on with the garbage collector.

Here is my solution:

#!/usr/bin/env elixir

defmodule Munchausen do
  @cache [0] ++ for n <- 1..9, do: n ** n

  def get_cache(), do: @cache

  def explode(n), do: explode(n, [])

  # int, acc -> list[int]
  def explode(n, acc) when n == 0, do: acc

  def explode(n, acc) do
    digit = rem(n, 10)
    explode(div(n, 10), [digit | acc])
  end

  # int -> bool
  def is_munchausen(n) do
    digits = explode(n)
    li = for x <- digits, do: Enum.at(@cache, x)
    n == Enum.sum(li)
  end
end

defmodule Main do
  # @max 10_000
  @max 440_000_000

  def main() do
    # Munchausen.get_cache() |> IO.inspect
    for n <- 0..@max do
      # :erlang.garbage_collect()
      if rem(n, 1_000_000) == 0 do
        IO.puts("# #{n}")
      end
      if Munchausen.is_munchausen(n) do
        IO.puts(n)
      end
    end
  end
end

Main.main()

I know that it’s not optimal and slow. I’ll work on it.

Now the question is: why does it consume all my memory and how to prevent that? Thanks.

Showing Posts 1 to 4

al2o3cr

al2o3cr

A for loop like this will return a list containing the results of every evaluation of the do block:

for n <- 0..10 do
  IO.puts(n)
end

Running this in iex produces:

iex(1)> for n <- 0..10 do
...(1)>   IO.puts(n)
...(1)> end
0
1
2
3
4
5
6
7
8
9
10
[:ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok]

Your Main.main function is building up a 440 million element list of :ok and nil, which it then discards when it exits.

jabuci

jabuci OP

Thanks. Right, the same thing happens in Python too:

$ python3
Python 3.10.4 (main, Mar 23 2022, 23:05:40) [GCC 11.2.0] on linux
>>> a = list(range(0, 440_000_000))
[1]    216403 killed     python3

So what’s the solution? How to iterate over the numbers from 0 until 440 million?

Update: I found the answer to my question:

Enum.each(0..@max, fn n ->
  if rem(n, 1_000_000) == 0 do
    IO.puts("# #{n}")
  end
  if Munchausen.is_munchausen(n) do
    IO.puts(n)
  end
end)
kokolegorille

kokolegorille

You might use stream to process the list lazily…

tj0

tj0

Also, check out Memoize — memoize v1.4.5 , it makes the caching step trivial. For fibonnaci example:

defmodule Fib do
  use Memoize
  defmemo fibs(0), do: 0
  defmemo fibs(1), do: 1
  defmemo fibs(n), do: fibs(n - 1) + fibs(n - 2)
end
— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews