Cristalab

Usar el operador módulo (%) para acortar código

Por: Zah + 15.11.2006

Estaba ayer aburrido en clase de inglés cuando un ejercicio llamó mi atención:

Pensé que es una de esas cosas que se hacen para llenar los libros y las horas de clase, y además se podía resolver con muy pocas líneas de código.
El pseudocódigo sería algo así:

Código :


Define un array con los nombres.
Con cada elemento del array:
   trace: "Who did"+elemento+ "invite"?"+elementoSiguiente
   trace: "Who invited"  +elemento+"?" +elementoAnterior

Ahora el problema está en cómo hacemos lo de elementoSiguiente y elementoAnterior. Porque si resulta que si nos encontramos en el primer o el último elemento y queremos restarle o sumarle uno, repectivamente, el valor del array para ese índice será undefined. Podemos montar una estructura con if's para que detecte si pedimos un elemento de los extremos y, si se da el caso nos devuelva el primero o el último. Pero hay una manera más rápida y corta.

El operador módulo (este % ) devuelve el resto de una división que se realizaría entre sus dos términos. Así por ejemplo:

Código :


trace(2 % 5);//2
trace(7 % 6);//1
trace(8 % 8);//0

Una forma de decir qué es el resto, que nos vendrá bien para entenderlo es: Si trato de agrupar n elementos en grupos de a ¿Cuántos de los n quedarían sin formar un grupo de a elementos. En el array, estos elementos serán el índice que buscamos.
Nos interesará conocer la longitud del array (Array.length), para saber por quién tenemos que dividir. Es decir, si queremos que sea un array circular (después del último elemento viene el primero) de tres elementos, y queremos saber a qué índice corresponde dar 22 saltos de un elemento al siguiente, usaríamos array[22 % array.length]. Hay que tener en cuenta que si tenemos números negativos en el dividendo, la cosa no funciona y habría que sumarle el divisor tantas veces como haría falta para que fuera mayor que 0.
Con todo esto, mi ejercicio de inglés se resolvería así:

Código :

var names:Array = ["Jack", "Carla", "Paul", "Maria"];
var ln = names.length;
for (var i:Number = 0; i<ln; i++) {
   trace("Who did "+names[i]+" invite? "+names[(i+1)%ln]+".");
   trace("Who invited "+names[i]+"? "+names[(i-1+ln)%ln]+".");//Aquí sumo ln para evitar los números negativos.
}


Otro ejemplo sería la rotación que tendríamos que darle a una aguja de un reloj para que marque la hora actual (suponiendo que en la rotación 0º está miando hacia arriba). La función Date.getHours() devuelve un número del 1 al 24, sin embargo los relojes están divididos en 12 horas:

Código :

var now:Date = new Date();
   flechaHoras._rotation = (now.getHours()%12)*30;//30=(360/12)


Espero que les haya servido miau

Etiquetas actionscript hack

Comentarios | Enviar un comentario

zah :

Estaba ayer aburrido en clase de inglés cuando un ejercicio llamó mi atención:

Lo que hace el aburrimiento... con el código escrito a lápiz en el libro.. Riendo
Por: Zguillez
Es por eso que la gramática se pasó a usar con algoritmos resultado: Correctores
Por: Pinocho_blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.