Bueno, como las estructuras de datos que tenemos no son muy complejas por eso dije lo de la matriz, es lo más complejo que hay, a parte de meterse con bases de datos, que por funcionar funcionaría pero igual es peor
Pero con matrices no es tan descabellado, se me ocurre indizarlas con el código ASCII del carácter del case.
Problema: no equivocarse al colocar las cosas en el vector.
Ventaja: ¡muy compacto!, y también rápido al acceder, pues es acceso directo al elemento, seguramente será más rápido que el case, especialmente para los últimos valores.
Una primera aproximación, lo que sería el vector directo, luego lo compactaré...
El primer case sería:
Código: Seleccionar todo
Local $PrimerPase[123] = _
["","","","","","","","","","","","","","","","","","","","","","","","", _
"","","","","","","","","","","","","","","","","","","","","","","","", _
"51","50","53","52","55","54","57","56","59", _ ;cifras, ASCII 48 a 57
"","","","","","","","","","","","","","","","","","","","", _
"","","","","","","","","","","","","","","","","","","","", _
"00","03","02","05","04","07","06","09","08","0b","0a","0d","0c","0f","0e", _
"11","10","13","12","15","14","17","16","19","18","1b"]
$resultado = $PrimerPase[Asc($trozopass)]
Notas:
Llegamos hasta "z"', de ASCII 122, de ahí el tamaño del vector
Empezamos en "0", de ASCII 48, de ahí el relleno al principio del vector
Creo que esto ya mejora el CASE, de miles de líneas nada. Pero es que aún se puede compactar más. Por un lado podemos quitar el relleno del principio y tener en cuenta que el vector empieza con un offset de 48 (ASCII del primer elemento). Por otro lado podemos pasar las las letras a mayúsculas (si nunca se van a mezclar mayúsculas y minúsculas, pero si la entrada es hexadecimal no va a pasar). Ahí también compactamos porque en vez de acabar en ASCII(z)=122 se acaba en ASCII(Z)=90.
Este caso quedaría:
Código: Seleccionar todo
Local $PrimerPase[43] = _
["51","50","53","52","55","54","57","56","59","","","","","","","","", _
"00","03","02","05","04","07","06","09","08","0b","0a","0d","0c","0f","0e", _
"11","10","13","12","15","14","17","16","19","18","1b"]
$resultado = $PrimerPase[Asc(StringUpper($trozopass))-48]
Como veis es ultracompacto, y de media quizás más rápido que el CASE, a pesar del cálculo del índice. Ese cálculo se podría poner en una función, para más comodidad.
Código: Seleccionar todo
Func _Indice($car)
return Asc(StringUpper($car))-48
EndFunc
Y hacer la llamada así:
$resultado2 = $PrimerPase[_Indice($trozopass)]
Esta función sería compartida por todos los vectores, pues tienen el mismo formato, sólo hay que cambiar los códigos.
Hale espero que sirva de ayuda.
Ciaoooo