Ver Mensaje Individual
  #32 (permalink)  
Antiguo 24/10/2012, 17:50
Avatar de Dradi7
Dradi7
 
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 16 años, 6 meses
Puntos: 220
Respuesta: desafios javascript 2012

Cita:
Iniciado por caricatos Ver Mensaje
Hola:

Se me ocurren algunas cosas más, aunque tal vez algo sofisticado... de todos modos, ahí va:

Un reloj analógico en svg y/o canvas (yo me apuntaría en svg). Ya tenía uno con html/javascript: Reloj Analógico.
También con svg/canvas un calendario "navegable" (también podría ser con html/javascript).
Y algo que se me ocurrió últimamente es un chequeador de sitemaps (o tal vez feeds)... al ser un xml, bien podría usarse Ajax. No solo chequear que enlacen correctamente, sino controlar también imágenes y otras alternativas válidas (aunque partícularmente solo llegué a interesarme en las imágenes)

Y sobre el !100, otro reto podría ser operaciones básicas de números grandes; por ejemplo de unos cincuenta (50) dígitos.

Saludos
Buenas

Siguiendo con los desafíos acá va el mio que va con respecto a operaciones básicas de números grandes, aun esta en desarrollo pero les muestro la primera versión de como va el cual consta de la suma de números grandes y que también cuenta con decimales

Código:
var lib = function(){

	// VARIABLES
	this.n1 = '';
	this.n2 = '';
	
	// FUNCION PARA VOLTEAR CADENAS
	var reves = function(value){
		return value.split('').reverse().join('');
	};
	
	// FUNCION PARA REPLICAR UNA LETRA UNA CIERTA CANTIDAD DE VECES
	var replicate = function(value,n){
		var result = '';
		for(var i=0;i<n;i++)
			result+=value;
		return result;
	}
	
	// FUNCION PARA LIMPIAR ESPACIO EN BLANCO EN CADENAS
	var trim = function(value){
		return value.replace(/^\s+/,'').replace(/\s+$/,'');
	};

	// FUNCION SUMAR
	this.sumar = function(tipo){
		
		// SE VALIDA QUE EL DATO INGRESADO SEA DE TIPO NUMERICO
		if(isNaN(this.n1)){
			return 'El numero uno es incorrecto';
		}else if(isNaN(this.n2)){
			return 'El numero dos est incorrecto';
		}
		
		// SE LIMPIA LAS CADENAS PORQUE ISNAN VALIDA QUE ES NUMERO UNA CADENA DE ESTA MANERA EJM.: " 457  "
		// LA VARIABLE T ES PARA OBTENER CUAL ES EL "NUMERO MAYOR"
		var n1 = trim(this.n1),
			n2 = trim(this.n2),
			t = n1.length-1;
	
		// VALIDAMOS SI UN NUMERO ES DECIMAL PARA REALIZAR LA SUMA CON DECIMALES
		if(n1.indexOf('.')!=-1 || n2.indexOf('.')!=-1){
			
			// SIN UN NUMERO NO CUENTA CON DECIMALES LO AGREGAMOS
			n1 += n1.indexOf('.')==-1 ? '.' : '';
			n2 += n2.indexOf('.')==-1 ? '.' : '';
			
			// OBTENEMOS EL PUNTO EN DONDE SE ENCUENTA EL DECIMAL
			var pos1 = n1.indexOf('.'),
				pos2 = n2.indexOf('.');
			
			// PREGUNTAMOS CUAL ES EL NUMERO MAYOR (ESTO SOLO VALIDA POR LONGITUD)
			if(pos2>pos1){

				// VARIABLE PARA CAMBIAR DE POSICION
				var x = 0;
				
				// CAMBIAMOS EL ORDEN PARA QUE N1 SEA EL "NUMERO MAYOR"
				x = n1;n1 = n2;n2 = x;
				
				// CAMBIAMOS EL ORDEN DE DONDE SE ENCUENTRA EL PUNTO
				x = pos1;pos1 = pos2;pos2 = x;
				
				// OBTENEMOS LA NUEVA LONGITUD
				t = n1.length-1;
			}
			
			//OBTENEMOS LA CANTIDAD DE DECIMALES
			var dec1 = n1.length - pos1,
				dec2 = n2.length - pos2;
			
			// REPLICAMOS LA CANTIDAD DE 0 QUE FALTA A LOS DECIMALES DE LOS NUMEROS PARA QUE SEAN IGUALES
			n1 += dec2 <= dec1 ? '' : replicate('0',dec2 - dec1);
			n2 += dec1 <= dec2 ? '' : replicate('0',dec1 - dec2);

		}else{
		
			// EN CASO QUE LOS NUMEROS NO TENGAN DECIMALES, SE VALIDA CUAL ES EL "NUMERO MAYOR"
			if(n2.length>n1.length){
			
				// CAMBIAMOS EL ORDEN PARA QUE N1 SEA EL "NUMERO MAYOR"
				var x = n1;
				t = n2.length - 1;
				n1 = n2;
				n2 = x;
				
			}
		}
		
		// CONVERTIMOS LA CADENA EN ARRAY PARA PODER REALIZAR LA SUMA
		n1 = n1.split('');
		n2 = n2.split('');
		
		/**
		* @param j EL ACUMULADOR PARA EL "NUMERO MENOR"
		* @param resto EL NUMERO ENTERO QUE RESULTA DE LA DIVISION CONTRA 10
		* @param result OBTIENE EL RESULTADO FINAL
		*/
		var j = 1,
			resto = 0,
			result = '';
	
		// HACEMOS UN RECORRIDO AL "NUMERO MAYOR"
		for(var i = t; i>=0; i--){
		
			// SE VALIDA QUE EL DIGITO NO SEA PUNTO
			if(n1[i]!='.'){
			
				/**
				* @param dig1 OBTIENE EL DIGITO DEL "NUMERO MAYOR"
				* @param dig2 OBTIENE EL DIGITO DEL "NUMERO MENOR"
				* @param suma OBTIENE LA SUMA DE LOS DIGITOS
				*/
				var dig1 = parseInt(n1[i]),
					dig2 = parseInt(n2[n2.length-j]),
					suma = dig1 + (isNaN(dig2) ? 0 : dig2) + resto;
				
				resto = parseInt(suma/10);	
				result += (suma < 10 ? suma : (i == 0 ? reves(suma.toString()) : suma % 10)).toString();
				
			}else{
			
				result += '.';
				
			}
			
			j++;
			
		}
		
		return reves(result);
		
	};
};
Aquí algunos ejemplos del resultado que se obtiene


Numeros enteros
Código:
l = new lib();
l.n1 = "9878787857454545445478457845784587457457457457487457474874578498";
l.n2 = "317878784545454545245636877985489657556669856698565699856699889";
l.sumar();
// RESULTADO
10196666641999999990724094723770077115014127314186023174731278387
Numeros decimales
Código:
l = new lib();
l.n1 = "1274878787.45748792401011101247757541045";
l.n2 = "12454578787812121.54545787872001212121";
l.sumar();
// RESULTADO
"87333365833560913.55556889119758753166"
Voy a estar mejorando y a subir las versiones correspondientes, si en caso se puede mejorar o reducir el código sera de gran ayuda

Saludos
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones