Question: How to generate words form a NL-letter alphabet?


It want to generate all the words from a NL-letter alphabet and whose lengths are at most LW.

I could not find any function in the combinat package do to that (at least without combining some of them, I'm using Maple 2015 right now); maybe the Iterator package has some features do to that?

For the moment I use this procedure (which generates a few words of length LW+1 I have to suppress)

G := proc(d)
 local n, wo:
  global W:
  while max(length~(W)) < d do
    wo := copy(W):
    for n from 1 to nops(L) do
      W := {W[], cat~(wo, L[n])[]};
    end do:
  end do:
end proc:

# Words of length not larger than LW which are made of at most NL letters

NL := 3:
L  := StringTools:-Char~([$65..65+NL-1]);
W  := L:
LW := 3:

w3 := W;
                        ["A", "B", "C"]

{"A", "AA", "AAA", "AAB", "AAC", "AB", "ABA", "ABB", "ABC", "AC", 

  "ACA", "ACB", "ACC", "B", "BA", "BAA", "BAB", "BAC", "BB", 

  "BBA", "BBB", "BBC", "BC", "BCA", "BCB", "BCC", "C", "CA", 

  "CAA", "CAB", "CAC", "CB", "CBA", "CBB", "CBC", "CC", "CCA", 

  "CCB", "CCC"}

W  := L:
CodeTools:-Usage( G(12) ):

memory used=0.62GiB, alloc change=422.58MiB, cpu time=13.70s, real time=8.37s, gc time=8.08s

Do you have any idea to improve it from memory used and cpu time points of view)?

Thanks in advance

Please Wait...