That’s indeed a really good solution. But I got interested by the possibility of improving its performance and here are the results:
defmodule LettersAndNumbers do
def list(from \\ 0, count) do
from
|> stream()
|> Enum.take(count)
end
def stream(from \\ 0)
def stream(from) when is_bitstring(from) or is_list(from) do
from
|> letters_to_number()
|> stream()
end
def stream(from) do
from
|> Stream.iterate(&(&1 + 1))
|> Stream.map(&number_to_letters/1)
end
def number_to_letters(number) do
[rem(number, 26) + 65]
|> to_string()
|> String.duplicate(div(number, 26) + 1)
end
def letters_to_number(letters) when is_bitstring(letters) do
letters
|> String.to_charlist()
|> letters_to_number()
end
def letters_to_number([char | _] = letters) do
((length(letters) - 1) * 26) + (char - 65)
end
end
PS.: I also did some changes to the API, but basically, instead of cycling through the alphabet and navigating it with an index, I mathematically transform numbers into letters by adding 65 to them and duplicating them div(number, 26) + 1 times like you did.






















