See if something like this would work. I haven't tested it, it might have a typo. I'm sure this could be shortened with some macros in the loops. The array would have elements with characters duplicated "AABC", etc, but those could be removed.
Code: Select all
FUNCTION Permutat(cOrigStr)
local i,j, cChar ;
,cStr2, cStr3, cStr4, cStr5, cStr6, cStr7 ;
,aStr1:={}, aStr2:={}, aStr3:={}, aStr4:={}, aStr5:={}, aStr6:={}, aStr7:={}
IF EMPTY(cOrigStr)
RETURN ""
ENDIF
cOrigStr := ALLTRIM(cOrigStr)
// create a permutation array 1 character wide
FOR i:=1 TO LEN(cOrigStr)
cChar := SUBSTR(cOrigStr,i,1)
AADD(aStr1,cChar)
NEXT
// create a permutation array 2 characters wide
FOR i:=1 TO LEN(cOrigStr)
cChar := SUBSTR(cOrigStr,i,1)
FOR j:=1 TO LEN(aStr1)
cStr2 := cChar + SUBSTR(aStr1[j],1)
AADD(aStr2,cStr2)
NEXT
FOR j:=1 TO LEN(aStr1)
cStr2 := SUBSTR(aStr1[j],1,1) + cChar
AADD(aStr2,cStr2)
NEXT
NEXT
// create a permutation array 3 characters wide
FOR i:=1 TO LEN(cOrigStr)
cChar := SUBSTR(cOrigStr,2,1)
FOR j:=1 TO LEN(aStr2)
cStr3 := cChar + SUBSTR(aStr2[j],1)
AADD(aStr3,cStr3)
NEXT
FOR j:=1 TO LEN(aStr2)
cStr3 := SUBSTR(aStr2[j],1,1) + cChar + SUBSTR(aStr2[j],2)
AADD(aStr3,cStr3)
NEXT
FOR j:=1 TO LEN(aStr2)
cStr3 := SUBSTR(aStr2[j],1,2) = cChar
AADD(aStr3,cStr3)
NEXT
NEXT
// create a permutation array 4 characters wide
FOR i:=1 TO LEN(cOrigStr)
cChar := SUBSTR(cOrigStr,3,1)
FOR j:=1 TO LEN(aStr3)
cStr4 := cChar + SUBSTR(aStr3[j],1)
AADD(aStr4,cStr4)
NEXT
FOR j:=1 TO LEN(aStr3)
cStr4 := SUBSTR(aStr3[j],1,1) + cChar + SUBSTR(aStr3[j],2)
AADD(aStr4,cStr4)
NEXT
FOR j:=1 TO LEN(aStr3)
cStr4 := SUBSTR(aStr3[j],1,2) + cChar + SUBSTR(aStr3[j],3)
AADD(aStr4,cStr4)
NEXT
FOR j:=1 TO LEN(aStr3)
cStr4 := SUBSTR(aStr3[j],1,3) + cChar
AADD(aStr4,cStr4)
NEXT
NEXT
// create a permutation array 5 characters wide
FOR i:=1 TO LEN(cOrigStr)
cChar := SUBSTR(cOrigStr,4,1)
FOR j:=1 TO LEN(aStr4)
cStr5 := cChar + SUBSTR(aStr4[j],1)
AADD(aStr5,cStr5)
NEXT
FOR j:=1 TO LEN(aStr4)
cStr5 := SUBSTR(aStr4[j],1,1) + cChar + SUBSTR(aStr4[j],2)
AADD(aStr5,cStr5)
NEXT
FOR j:=1 TO LEN(aStr4)
cStr5 := SUBSTR(aStr4[j],1,2) + cChar + SUBSTR(aStr4[j],3)
AADD(aStr5,cStr5)
NEXT
FOR j:=1 TO LEN(aStr4)
cStr5 := SUBSTR(aStr4[j],1,3) + cChar + SUBSTR(aStr4[j],4)
AADD(aStr5,cStr5)
NEXT
FOR j:=1 TO LEN(aStr4)
cStr5 := SUBSTR(aStr4[j],1,4) + cChar
AADD(aStr5,cStr5)
NEXT
NEXT
// create a permutation array 6 characters wide
FOR i:=1 TO LEN(cOrigStr)
cChar := SUBSTR(cOrigStr,5,1)
FOR j:=1 TO LEN(aStr5)
cStr6 := cChar + SUBSTR(aStr5[j],1)
AADD(aStr6,cStr6)
NEXT
FOR j:=1 TO LEN(aStr5)
cStr6 := SUBSTR(aStr5[j],1,1) + cChar + SUBSTR(aStr5[j],2)
AADD(aStr6,cStr6)
NEXT
FOR j:=1 TO LEN(aStr5)
cStr6 := SUBSTR(aStr5[j],1,2) + cChar + SUBSTR(aStr5[j],3)
AADD(aStr6,cStr6)
NEXT
FOR j:=1 TO LEN(aStr5)
cStr6 := SUBSTR(aStr5[j],1,3) + cChar + SUBSTR(aStr5[j],4)
AADD(aStr6,cStr6)
NEXT
FOR j:=1 TO LEN(aStr5)
cStr6 := SUBSTR(aStr5[j],1,4) + cChar + SUBSTR(aStr5[j],5)
AADD(aStr6,cStr6)
NEXT
FOR j:=1 TO LEN(aStr5)
cStr6 := SUBSTR(aStr5[j],1,5) + cChar
AADD(aStr6,cStr6)
NEXT
NEXT
// create a permutation array 7 characters wide
FOR i:=1 TO LEN(cOrigStr)
cChar := SUBSTR(cOrigStr,6,1)
FOR j:=1 TO LEN(aStr6)
cStr7 := cChar + SUBSTR(aStr6[j],1)
AADD(aStr7,cStr7)
NEXT
FOR j:=1 TO LEN(aStr6)
cStr7 := SUBSTR(aStr6[j],1,1) + cChar + SUBSTR(aStr6[j],2)
AADD(aStr7,cStr7)
NEXT
FOR j:=1 TO LEN(aStr6)
cStr7 := SUBSTR(aStr6[j],1,2) + cChar + SUBSTR(aStr6[j],3)
AADD(aStr7,cStr7)
NEXT
FOR j:=1 TO LEN(aStr6)
cStr7 := SUBSTR(aStr6[j],1,3) + cChar + SUBSTR(aStr6[j],4)
AADD(aStr7,cStr7)
NEXT
FOR j:=1 TO LEN(aStr6)
cStr7 := SUBSTR(aStr6[j],1,4) + cChar + SUBSTR(aStr6[j],5)
AADD(aStr7,cStr7)
NEXT
FOR j:=1 TO LEN(aStr6)
cStr7 := SUBSTR(aStr6[j],1,5) + cChar + SUBSTR(aStr6[j],6)
AADD(aStr7,cStr7)
NEXT
FOR j:=1 TO LEN(aStr6)
cStr7 := SUBSTR(aStr6[j],1,6) + cChar
AADD(aStr7,cStr7)
NEXT
NEXT
// merge all arrays
FOR i:=1 TO LEN(aStr1)
AADD(aStr7,aStr1[i])
NEXT
FOR i:=1 TO LEN(aStr2)
AADD(aStr7,aStr2[i])
NEXT
FOR i:=1 TO LEN(aStr3)
AADD(aStr7,aStr3[i])
NEXT
FOR i:=1 TO LEN(aStr4)
AADD(aStr7,aStr4[i])
NEXT
FOR i:=1 TO LEN(aStr5)
AADD(aStr7,aStr5[i])
NEXT
FOR i:=1 TO LEN(aStr6)
AADD(aStr7,aStr6[i])
NEXT
// remove elements with duplicated letters from aStr7
RETURN aStr7