sweetness!
Also, for comprehensions offer binary generators
iex(15)> alphabet = "abcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz"
iex(16)> for <<x <- alphabet>>, do: <<"a", x>>
["aa", "ab", "ac", "ad", "ae", "af", "ag", "ah", "ai", "aj", "ak", "al", "am",
"an", "ao", "ap", "aq", "ar", "as", "at", "au", "av", "aw", "ax", "ay", "az"]
for example here <<Enum.random(?A..?Z)>>
it works, but on my other example when I try to use <<>> it doesnt fix it
You should take these posts as hints what to look into, but maybe not start with binary generators just yet.
well yea hard coding the alphabet isnt a problem but imagine having a list of like 500 letters or something, hmm
Excel encodes the columns in the general pattern of what you need.
In Elixlsx you can find the utility function encode_col
that implements the general case (see here):
def encode_col(0), do: ""
def encode_col(num) when num <= 26, do: <<num + 64>>
def encode_col(num, suffix \\ "")
def encode_col(num, suffix) when num <= 26, do: <<num + 64>> <> suffix
def encode_col(num, suffix) do
mod = div(num, 26)
rem = rem(num, 26)
if rem == 0 do
encode_col(mod - 1, "Z" <> suffix)
else
encode_col(mod, <<rem + 64>> <> suffix)
end
end
Your alphabet would start at encode_col(27)
Edit: you would need to lowercase the string (or adapt the code)
TIL…
"a#{letter}"
!= "a#{[&1]}"
In this case the &1
is equivalent to letter
, so that is not the meaningful difference. The difference is wrapping the letter
in a list such that the compiler sees it as a charlist. Interpolating a charlist is different than interpolating an integer (which is what letter
actually is when you pull it from a charlist).