Si sólo tienes que hacer permutaciones con 4 elementos, lo mejor es ni siquiera clacularlo, puesto que su factorial es 24, estas las puedes guardar directamente ya en una matriz, así no tienes que calcularlo cada vez que supuestamente pasares por una rutina dada, simplemente bastaría con leerlo de la función que toma las asignaciones:
sería algo como:
rutina donde se usan las combinaciones
dim combina(0 to 23)
.....
.....
combina=asignaCombinas 'llamar a la asignación de combinaciones
....
fin rutina
funcion asignaCombinas() as string()
asignaCombinas(0)="ABCD"
asignaCombinas(1)="ABDC"
asignaCombinas(2)="ACBD"
...
...
...
asignaCombinas(22)="DCAB"
asignaCombinas(23)="DCBA"
fin funcion
Claro que si usas muy a menudo esto entonces es mejor hacer la variable combina pública, e invocar sólo una vez a la función asignaCombinas, es decir en el evento load del programa, así te quedaría disponible el resto del programa.
Es una solución rápida y eficaz para un problema concreto (4 elementos con 24 permutaciones), así que si es así de concreto, va adecuado.
p.d.: releyendo tu pregunta... dices que los guarismos a usar son los que entren por un inputbox, en ese caso tienes que llamar a otra función después de la de asignación que consisite en un bucle de sustitución.
en ese caso debes sustituir cada "J" por cada "A" que aparezca en los elementos de combina()... fíjate de no cometer el error, de si coinciden un guarismo que se entra con otro que está en uso (excepto que sea el último guarismo), ya que si haces así, como ocurriría con la entrada(1) ("C"), entonces todas las "B" existentes serían "C", pero como también existen "C" entonces el siguiente cambio daría erróneo.
Esto se evita con un guarismo intermedio, es decir antes de intercambiar, debes comprobar que los guarismos de entrada noo son idénticos a los que ya hay, si los hay entonces aquel que ya exista (excepto si es el último, debes cambiarlo temporalmente por otro que no exista, por ejemplo por "~" ú otros poco frecuentes, después de terminar, ya no habra "C" 'ces' con lo que cambiarías "~" por "C".... si sólo hay una coincidencia, podrías hacer ese cambio el último, así no precisarías hacer un cambio intermedio....
Espero que me entiendas...
Es decir si el usuario introdjo: entrada(0)="J", entrada(1)="C", entrada(2)="K", entrada(3)="Y"
funcion remplazaCombinas
dim suelto(0 to 3)
dim temp(0 to 3)
dim usar(0 to 3)
temp(0)="#" : temp(1)="€" : temp(2)="@" : temp(3)="~" 'matriz supuesta para reemplazar temporalmente a la matriz entrada.
suelto=deshaceCombina(combina(0))
existen=compruebaCoincidencias(entrada,suelto)
if existen=true entonces '
usar=temp ' usamos la matriz temp
no existen 'entonces usamos la matriz entrada
usar=entrada
fin existe
for i=0 to 3
cambiarPor=usar(i)
for k=1 to 23
suelto=deshaceCombina(combina(K))
combina(k)=intercambia(suelto, cambiarPor)
fin k
fin i
if existen=true then 'si existen ya que se mudaron por algunos que 'supuestamente no existen, ahora los cambiamos por los que introdujo el usuario....
for i=0 to 3
cambiarPor=entrada(i)
for k=1 to 23
suelto=deshaceCombina(combina(K))
combina(k)=intercambia(suelto, cambiarPor)
fin k
fin i
end if
fin funcion
' intercambia los valores y los reune en una cadena que devuelve
funcio intercambia(destino(),origen) as string
for i=0 to 3
if origen=destino(i) luego
destino(i)=origen(i)
end if
intercambia=intercambia & destino(i)
fin i
fin funcion
' comprueba si un guarismo entrado ya existe en la cadena a sustituir
funcion compruebaCoincidencias(a() as string,b() as string) as boolean
dim repes as byte
for i=0 to 3
for k=0 to 3
if a(i)=b(k) then
repes=respes +1
end if
fin k
fin i
compruebaCoincidencias=(repes>0)
fin funcion
' entrando un string en la forma "ABCD" devuelve una matriz
' enla forma c(0)="A", c(1)="B", c(2)="C", c(3)="D"
funcion deshaceCombina(cadena as string) as string()
deshaceCombina(0)=mid(cadena,1,1)
deshaceCombina(1)=mid(cadena,2,1)
deshaceCombina(2)=mid(cadena,3,1)
deshaceCombina(3)=mid(cadena,4,1)
fin funcion
Fíjate que no te he resuelto el caso de que sólo haya una equivalencia entre los guarismos usados, he asumido que todos están repes, y he asumido que dichos caracteres no los va a usar el usuario, en realidad eso es algo que tendrás que poner tú, yo te he puesto esos valores, para que no sea todo muy en el aire...con poco esfuerzo puedes mejorarlo, ya que yo lo he escrito de corrido...procurando que me entiendas sin liarte demasiado.