Comunidad de diseño web y desarrollo en internet online

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

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 ^^

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate