Foros del Web » Programando para Internet » Javascript »

Propuesta para desafíos javascript 2014

Estas en el tema de Propuesta para desafíos javascript 2014 en el foro de Javascript en Foros del Web. Hola, Una solución al primer reto, lineal, en el peor de los casos tendría que ser más eficiente que cualquier ordenamiento puesto que no ordena ...

  #61 (permalink)  
Antiguo 22/12/2013, 11:22
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 11 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Propuesta para desafíos javascript 2014

Hola,

Una solución al primer reto, lineal, en el peor de los casos tendría que ser más eficiente que cualquier ordenamiento puesto que no ordena todo el Array. No intercambia ningún valor de posición, solamente asigna los indices correspondientes.

Código Javascript:
Ver original
  1. function tercero(a) {
  2.     var m1 = 0;
  3.     var m2 = 1;
  4.     var m3 = 2;
  5.     for (var i = 2; i < a.length; i++) {
  6.         if (a[i] === a[m1] || a[i] === a[m2] || a[i] === a[m3]) {
  7.             continue;
  8.         }
  9.         if (a[i] < a[m1] || a[i] < a[m2] || a[i] < a[m3]) {
  10.             if (a[m3] > a[m2] && a[m3] > a[m1]) {
  11.                 m3 = i;
  12.             } else {
  13.                 if (a[m2] > a[m1]) {
  14.                     m2 = i;
  15.                 } else {
  16.                     m1 = i;
  17.                 }
  18.             }
  19.         }
  20.     }
  21.     if (a.length > 2) {
  22.         if (a[m3] > a[m2] && a[m3] > a[m1]) {
  23.             return a[m3];
  24.         } else {
  25.             if (a[m2] > a[m1]) {
  26.                 return a[m2];
  27.             } else {
  28.                 return a[m1];
  29.             }
  30.         }
  31.     }
  32.     return false;
  33. }
  34.  
  35. var a = [4,3,2,4,-245,4,1,5,-124,-245,-308];
  36. console.log("valor : " + tercero(a));

Se puede implementar de esa forma porque es el 3 valor, escalar al 10 valor sería bastante mas complicado, y sería mas fácil ordenar,

Saludos,
  #62 (permalink)  
Antiguo 22/12/2013, 11:44
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 9 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

No funciona bien porque dije que los valores repetidos sólo cuentan como uno.
En [1,1,1,1,1,1,2,3] el tercero es 3.
  #63 (permalink)  
Antiguo 22/12/2013, 12:15
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 6 meses
Puntos: 319
Respuesta: Propuesta para desafíos javascript 2014

al problema de la inteligencia dejo mi propuesta.
funca bien y ademas, propone diferentes caminos para lograr el objetivo cambiando un unico parametro.

Código Javascript:
Ver original
  1. TRON.prototype.ia=function()
  2. {
  3.     // Aumentar este valor hace mas inteligente a la ia pero recarga la pila de recursion pudiendo explotar y/o ser leeeeeeento.
  4.     // Una gran mejora seria que en lugar de ser fijo, aumentara a medida que disminuyen los espacios libres, esto la haria mas versatil.
  5.     // Notese que cambiando este numero se obtienen diferentes soluciones de dominacion total.
  6.     // Ej: 3, 4.
  7.     // Con un valor menor a 2 no es lo sufientemente inteligente como para encontrar un camino correcto.
  8.     var maximunCall = 3;
  9.    
  10.     // Este valor es un parchesito para no complicar el algoritmo. con que sea mayor o igual a la longitud del mapa es suficiente.
  11.     // Otra gran mejora, seria que en lugar de ser fijo se calculara segun las dimenciones de la matriz.   
  12.     var incrementoAgresivo = 25;
  13.  
  14.     function mejorPosicion(arr, min, pred)
  15.     {
  16.         var max = min;
  17.         var dir = pred;
  18.         for(var i=0; i< arr.length; i++)
  19.         {
  20.             if(arr[i] > max)
  21.             {
  22.                 max = arr[i];
  23.                 dir = i;
  24.             }
  25.         }
  26.  
  27.         return dir;
  28.     }
  29.  
  30.     function recursiveMejorCamino(pos, mapa, movTmp, nroCall)
  31.     {
  32.         nroCall++;
  33.         if((mapa[pos[0]][pos[1]] == 0) && (nroCall < maximunCall))
  34.         {
  35.             movTmp++;
  36.             var movT = new Array();
  37.             movT[0] = recursiveMejorCamino([(pos[0]-1), pos[1]], mapa, movTmp , nroCall) + (((nroCall > 1) && (mapa[(pos[0]-((pos[0]-2) >= 0 ? (pos[0]-2) : 0))][pos[1]] == 2)) ? incrementoAgresivo : 0);                                  // Arriba
  38.             movT[1] = recursiveMejorCamino([(pos[0]+1), pos[1]], mapa, movTmp , nroCall) + (((nroCall > 1) && (mapa[((pos[0]+2) < mapa.length ? (pos[0]+2) : (mapa.length-1))][pos[1]] == 2)) ? incrementoAgresivo : 0);                    // Abajo
  39.             movT[2] = recursiveMejorCamino([pos[0], (pos[1]-1)], mapa, movTmp , nroCall) + (((nroCall > 1) && (mapa[pos[0]][(pos[1]-((pos[1]-2) >= 0 ? (pos[1]-2) : 0))] == 2)) ? incrementoAgresivo : 0);                                  // Izquierda
  40.             movT[3] = recursiveMejorCamino([pos[0], (pos[1]+1)], mapa, movTmp , nroCall) + (((nroCall > 1) && (mapa[pos[0]][((pos[1]+2) < mapa[pos[0]].length ? (pos[1]+2) : (mapa[pos[0]].length-1))] == 2)) ? incrementoAgresivo : 0);    // Derecha
  41.             var dir = mejorPosicion(movT, 0 , 3);
  42.            
  43.             return ((movTmp*1) + (movT[dir]*1));
  44.         } else
  45.             return 0;
  46.     }
  47.  
  48.     var movP = new Array();
  49.     movP[0] = recursiveMejorCamino([(this.jugador[0]-1), this.jugador[1]], this.mapa,   0,  0); // Arriba
  50.     movP[1] = recursiveMejorCamino([(this.jugador[0]+1), this.jugador[1]], this.mapa,   0,  0); // Abajo
  51.     movP[2] = recursiveMejorCamino([this.jugador[0], (this .jugador[1]-1)], this.mapa,  0,  0); // Izquierda
  52.     movP[3] = recursiveMejorCamino([this.jugador[0], (this.jugador[1]+1)], this.mapa,   0,  0); // Derecha
  53.  
  54.     var dir = mejorPosicion(movP,0 , 0);
  55.  
  56.     switch (dir)
  57.     {
  58.         case 0 :
  59.             return DIRECCION.arriba;
  60.         break;
  61.         case 1 :
  62.             return DIRECCION.abajo;
  63.         break;
  64.         case 2 :
  65.             return DIRECCION.izquierda;
  66.         break;
  67.         case 3 :
  68.             return DIRECCION.derecha;
  69.         break;
  70.     }
  71. };

con esto califico para entrar al concurso?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #64 (permalink)  
Antiguo 22/12/2013, 12:39
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 9 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Sí, pero pon el código completo funcionando en jsfiddle, para que cualquiera pueda probarlo abriendo simplemente el enlace. No requiere registrarse para guardar códigos, simplemente aprieta el "save" de arriba a la izquierda.

Y cuidado, las pruebas las haré en varias coordenadas, buscando puntos flacos. Por ejemplo, si pongo la posición inicial del jugador en [1,1], en la línea 24 de mi enlace jsfiddle con el juego, tu algoritmo obtiene 32 puntos, que es la mitad de los puntos totales.

Tu algoritmo es correcto, pero en cuanto a puntuación, te pueden batir. No obstante ser el primero en resolver un ejercicio suele tener mayor mérito xd. Si quieres, puedes reenviar tu solucion tantas veces como quieras, en la lista de resultados utilizaré tu último envío.


Por otro lado, y como posible consejo a seguir, se puede sacar todo el código aparte, y utilizarlo dentro del método IA de tron. En realidad sólo se necesitaría calcular el mejor camino una sola vez.
Así que un esqueleto de IA podría ser:

Código Javascript:
Ver original
  1. TRON.prototype.ia=function()
  2. {
  3.     if (camino==null)
  4.     {
  5.        camino=crearCamino(copia de posicion, copia de mapa);
  6.     }
  7.  
  8.     //Código para procesar el objeto "camino" con el
  9.    //objetivo de devolver la mejor direccion en esta llamada
  10. }

La variable camino y la función crearCamino habría que declararlas globalmente, arriba del todo, como primera línea de todo el javascript, para que sean visibles dentro de TRON.

Última edición por marlanga; 22/12/2013 a las 12:53
  #65 (permalink)  
Antiguo 22/12/2013, 13:04
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 6 meses
Puntos: 319
Respuesta: Propuesta para desafíos javascript 2014

Cita:
Ésta es una burda imitación del juego de las motos de TRON. El juego consiste en varias motos que se mueven por un mapa, con el objetivo de sobrevivir el máximo de tiempo posible. Las motos van dejando una estela por donde pasan, y si otra moto se topa con una estela, o contra una pared, muere. Por supuesto, las motos no pueden detenerse, siempre avanzan a la misma velocidad, si no, no tendría gracia.

En este primer intento no hay enemigos: La moto correrá sola en el mapa. El reto consiste en hacer los máximos puntos posibles. Y cada punto se gana moviéndose a otra casilla sin morir.
si hay varias motos si es nesesario calcularlo cada vez, tu razonamiento es correcto si solo existe una, pero vamos, ¿Quien se pondra a mirar un juego de motos manejada por un autonomo? no tiene sentido. mejor seria que una moto la controle el usuario y en un tablero de 400X400 corra contra dos 3 autonomas, eso si serviria de algo, como dijiste "en un principio" asumi que el algoritmo deberia ser escalable por eso no esta optimizado para este caso particular.

ya que tu eres el coordinar de este desafio, te propongo algo para que tu hagas. arma el tablero que ocupe toda la pantalla y haz que el TRON funcione con muchas IA (osea varias motos cn colores diferentes) asi, en cada IA ponemos el algoritmo de los que vallan resolviendo y luego, ponemos a todos a correr juntos a ver quien saca mas puntos que te parece? y, para darle mas vista, el cuadradito principal de la moto podria ser el avatar de cada usuario jajaja

EDITO: Para que lo gane desde la posicion 1 1 nesesita mas inteligencia con poner
Código Javascript:
Ver original
  1. var maximunCall = 5;
alcanza para que lo resuelva
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #66 (permalink)  
Antiguo 22/12/2013, 13:14
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 9 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Ese cambio lo haré en un futuro incierto si hay varios participantes, si no, es un trabajo inútil por mi parte xd.

Y por esa misma razón, el inmenso costo de tiempo, usar backtracking es muy ineficiente en javascript para IA's con mucha libertad, tendremos que pensar algoritmos voraces que con poca información hagan un trabajo aceptable xd, o alguna otra técnica liviana.

Por otro lado, ahora sólo hay una moto y no hay obstáculos, asi que es posible crear un supuesto recorrido sin demasiada complejidad algorítmica. Creo, no lo he programado ni pensado, pero lo presiento con mi sentido arácnido.


PD. Y si te pongo la posición en [8,8], aún con el maximunCall a 5, te dejas casillas en blanco xd. O en [5,5]. Ya digo que no hay que fiarse del ejemplo.

Última edición por marlanga; 22/12/2013 a las 13:22
  #67 (permalink)  
Antiguo 22/12/2013, 13:45
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 11 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Propuesta para desafíos javascript 2014

Hola,

Cita:
Iniciado por marlanga Ver Mensaje
No funciona bien porque dije que los valores repetidos sólo cuentan como uno.
En [1,1,1,1,1,1,2,3] el tercero es 3.
Es cierto no funciona en ese caso.

Bueno, ni modo, creo que el mejor caso es ordenar completamente. Dejo otro, en este caso estoy seguro que funciona bien pero no es muy eficiente en general.

http://jsfiddle.net/z4Zcg/2/

No sé cuanto tiempo dejan el código en jsfiddle,
Saludos,
  #68 (permalink)  
Antiguo 22/12/2013, 14:11
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 9 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

No sé cuanto duran los códigos en jsfiddle, pero creo que años.
Ok, ahora tu envío funciona, caundo actualice la lista de envíos lo incluyo. Si quieres puedes ir resolviendo algún otro.
  #69 (permalink)  
Antiguo 22/12/2013, 15:28
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 6 meses
Puntos: 319
Respuesta: Propuesta para desafíos javascript 2014

bueno como sea, aca dejo un fiddle con 3 ia en un tablero de 38 x 38. a ver si otros ponen sus algoritmos y los comparamos entre ellos http://jsfiddle.net/ProyectoNSD/dssvt/
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #70 (permalink)  
Antiguo 22/12/2013, 16:23
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 9 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

El objetivo de este reto es hacer puntos en un tablero controlado. La IAs que se presenten pueden no ser buenas para competir contra otras motos en el mismo tablero, porque es posible que sus algoritmos no necesiten leer contínuamente el estado del tablero.
  #71 (permalink)  
Antiguo 23/12/2013, 11:21
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 4 meses
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

Bueno, aquí mi primera solución parcial:
http://jsfiddle.net/jefebrondem/7ZQcT/2/
Recorre todas las casillas cuando almenos uno de los lados del tablero es par. En caso contrario aún no hay algoritmo implementado( puede petar, no lo he probado ).

El caso en que ambos lados del tablero sea impar tengo que pensarlo un poco más. Pues habrá casos en que no se podrán recorrer todas las casillas.

Por cierto marlanga, al copy-past tal cual de tu código inicial en un nuevo proyecto: http://jsfiddle.net/jefebrondem/2mt8q/, no sé porque no se muestra el tablero. He tenido que actualizar directamente de tu proyecto para que pudiera verse. Por eso el /2/ final.

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils
  #72 (permalink)  
Antiguo 23/12/2013, 11:54
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 9 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Da errores fatales cuando cambias los tamaños del mapa, como ya dices. Pero cuando funciona, lo hace perfecto.

Arriba a la izquierda del jsfiddle hay dos selects. El primero sirve para elegir librería de javascript que quieres que se cargue, que en este demo no vale para nada. Pero el segundo select sirve para decir cuándo cargar el código javascript. Por defecto está puesto "onload", pero a mí me gusta ponerlo siempre en "No warp - in head", que significa que lo va a incluir en el head de la página, y ya decidiré yo si usar window.onload o no.
El tron usa window.onload para iniciarse, asi que si no cambias ese select, el evento "load" no se disparará nunca en el código porque ya lo usó jsfiddle para cargar el código js del textarea.
  #73 (permalink)  
Antiguo 28/12/2013, 11:13
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 4 meses
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

Bueno, ya he conseguido hacer un algoritmo único para cualquier dimensión del tablero y posición inicial que recorra el máximo de casillas posibles... o eso creo:
http://jsfiddle.net/jefebrondem/2mt8q/1/

¡Feliz navidad y fiestas por venir!
__________________
github.com/xgbuils | npm/xgbuils
  #74 (permalink)  
Antiguo 28/12/2013, 12:16
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 6 meses
Puntos: 319
Respuesta: Propuesta para desafíos javascript 2014

Cita:
El objetivo de este reto es hacer puntos en un tablero controlado. La IAs que se presenten pueden no ser buenas para competir contra otras motos en el mismo tablero, porque es posible que sus algoritmos no necesiten leer contínuamente el estado del tablero.
Cita:
Bueno, ya he conseguido hacer un algoritmo único para cualquier dimensión del tablero y posición inicial que recorra el máximo de casillas posibles... o eso creo:

Si el TRON va a correr solo en el tablero, no hace falta nada eleborado, ni siquiera pensar mucho. de hecho con estas 8 lineas alcanza. Lo interesante es cuando mas de una moto corren juntas en el tablero
Código Javascript:
Ver original
  1. TRON.prototype.ia=function()
  2. {  
  3.     if(this.mapa[this.jugador[0]][(this.jugador[1]+1)] == 0)
  4.         return DIRECCION.derecha;
  5.     else if(this.mapa[(this.jugador[0]+1)][this.jugador[1]] == 0)
  6.         return DIRECCION.abajo;
  7.     else if(this.mapa[(this.jugador[0]-1)][this.jugador[1]] == 0)
  8.         return DIRECCION.arriba;
  9.     else
  10.         return DIRECCION.izquierda;
  11. };
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #75 (permalink)  
Antiguo 28/12/2013, 12:42
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 4 meses
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

Matando moscas a cañonazos. Que burro soy.

Sólo puedo objetar que para un tablero de 1xn o mx1 no hallará siempre el máximo de casillas. Pero esto es fácil de solucionar.
__________________
github.com/xgbuils | npm/xgbuils
  #76 (permalink)  
Antiguo 28/12/2013, 13:48
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 6 meses
Puntos: 319
Respuesta: Propuesta para desafíos javascript 2014

Si tienes una sola fila, o una sola columna solo se puede ir para una lado, salvo que inicies en un extremo es imposible conseguir todos. si embargo ese caso particular es curioso, ya que ahi hay que elegir correctamente hacia que lado ir.

El codigo que puse tiene una falla, y es que hay dos casos particulares de tableros cuadrados que no resulve. aqui la vercion mejorada y que contempla esas posibilidades.

Código Javascript:
Ver original
  1. TRON.prototype.ia=function()
  2. {      
  3.     // Casos de tablero particulares.
  4.     if(this.mapa.length == 1)
  5.     {
  6.         if(this.jugador[1] > (this.mapa[0].length/2))
  7.             return DIRECCION.arriba;
  8.         else
  9.             return DIRECCION.abajo;
  10.     }
  11.     else if(this.mapa[0].length == 1)
  12.     {
  13.         if(this.jugador[0] > (this.mapa.length/2))
  14.             return DIRECCION.izquierda;
  15.         else
  16.             return DIRECCION.derecha;  
  17.     }
  18.     else
  19.     {      
  20.         // Casos especiales.
  21.         if  (
  22.                 (
  23.                     // Esta en la primer columna.
  24.                     (this.jugador[1] == 1)
  25.                     ||
  26.                     // Esta en la esquina superior derecha.
  27.                     (
  28.                         (((this.jugador[0]-2) >= 0 ? this.mapa[this.jugador[0]-2][this.jugador[1]] : 3) > 0)
  29.                         && (((this.jugador[0]+2) < this.mapa[0].length ? this.mapa[this.jugador[0]][this.jugador[1]+2] : 3) > 0)
  30.                         && (this.mapa[this.jugador[0]+1][this.jugador[1]+1] == 0)
  31.                     )
  32.                 )          
  33.                 // Y esta libre.
  34.                 && (this.mapa[this.jugador[0]-1][this.jugador[1]] == 0)
  35.             )
  36.             return DIRECCION.arriba;
  37.         else
  38.         {
  39.             if(this.mapa[this.jugador[0]][this.jugador[1]+1] == 0)
  40.                 return DIRECCION.derecha;
  41.             else if(this.mapa[this.jugador[0]+1][this.jugador[1]] == 0)
  42.                 return DIRECCION.abajo;
  43.             else if(this.mapa[this.jugador[0]-1][this.jugador[1]] == 0)
  44.                 return DIRECCION.arriba;
  45.             else
  46.                 return DIRECCION.izquierda;
  47.         }
  48.     }
  49. };
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #77 (permalink)  
Antiguo 28/12/2013, 14:16
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 4 meses
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

Cita:
Iniciado por NSD
El codigo que puse tiene una falla, y es que hay dos casos particulares de tableros cuadrados que no resulve. aqui la vercion mejorada y que contempla esas posibilidades.
No se a que dos casos particulares te refieres. Pero, cierto, ahora me he fijado que el primer algoritmo que presentabas fallaba para tableros mxn con m > 2 y posición inicial (y,1) con y distinto de 1 y de m.

El segundo tengo que analizarlo. Sin embargo estas condiciones:
Código Javascript:
Ver original
  1. this.mapa.length == 1
  2. this.mapa[0].length == 1
me parecen extrañas con la implementación del tablero propuesta por marlanga. Donde un tablero fila de zeros se corresponderia con
Código Javascript:
Ver original
  1. this.mapa.length == 3
y un tablero columna de ceros se correspondería con
Código Javascript:
Ver original
  1. this.mapa[0].length == 3

Edit: en la esquina superior derecha, con lápiz y papel no veo ninguna razón para que falle el algoritmo.

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils
  #78 (permalink)  
Antiguo 28/12/2013, 14:36
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 6 meses
Puntos: 319
Respuesta: Propuesta para desafíos javascript 2014

Correcto, tienes razon, hay que preguntar por 3, escribi sin pensar (y sin probarlo)

en la esquina superior derecha fallaba si arranca ahi, si arranca en esa posicion se hace un nudo y termina, no obstante analizandolo mejor, el nudo no solo se hace en esa esquina sino en cualquier caso similar. por lo tanto la condicion general y definitiva seria:

Código Javascript:
Ver original
  1. // Casos especiales.
  2.         if  (
  3.                 (
  4.                     // Esta en la primer columna.
  5.                     (this.mapa[this.jugador[0]][this.jugador[1]-1] == 1)
  6.                     ||
  7.                     // Esta en un escalon.
  8.                     (
  9.                         (((this.jugador[0]-2) >= 0 ? this.mapa[this.jugador[0]-2][this.jugador[1]] : 3) > 0)
  10.                         && (((this.jugador[0]+2) < this.mapa[0].length ? this.mapa[this.jugador[0]-1][this.jugador[1]+1] : 3) > 0)
  11.                     )
  12.                     ||
  13.                     // Tiene que dar un rodeo.
  14.                     (
  15.                         (((this.jugador[0]-2) >= 0 ? this.mapa[this.jugador[0]-2][this.jugador[1]] : 3) > 0)
  16.                         && (((this.jugador[0]+2) < this.mapa[0].length ? this.mapa[this.jugador[0]-1][this.jugador[1]+1] : 3) > 0)
  17.                         && (this.mapa[this.jugador[0]+1][this.jugador[1]+1] == 0)
  18.                     )
  19.                 )          
  20.                 // Y esta libre.
  21.                 && (this.mapa[this.jugador[0]-1][this.jugador[1]] == 0)
  22.             )
  23.             return DIRECCION.arriba;
  24.         else
  25.         {
  26. ...

EDITO: eh aqui el fiddle con un random, hasta ahora nunca fallo: http://jsfiddle.net/ProyectoNSD/dssvt/2/
EDITO 2: y he aqui 3 ia compitiendo juntas: http://jsfiddle.net/ProyectoNSD/dssvt/3/
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 28/12/2013 a las 14:48
  #79 (permalink)  
Antiguo 28/12/2013, 15:00
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 4 meses
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

NSD, aquí tienes un fallo con tu algoritmo.
Tablero 7x8, inicio (4,3)
http://jsfiddle.net/jefebrondem/7ZQcT/5/
__________________
github.com/xgbuils | npm/xgbuils
  #80 (permalink)  
Antiguo 30/12/2013, 14:20
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 9 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Para probar mapas sin tener que escribir el mapa a mano, hice cambios en el código:

http://jsfiddle.net/marlanga/25Upk/

Ahora el tamaño del mapa se crea en el constructor del juego, en la última línea del código.
El orden de los argumentos son: id del canvas, filas del mapa, columnas del mapa, y un array con la fila y la columna del jugador.
Las filas y columnas incluyen las "paredes" negras que envuelven a todo el mapa. Es decir, si pones 3,3, en realidad solo habrá 1 celda del mapa en blanco para recorrer.


Tu código, pantalaimon, parece que da soluciones óptimas en todos los casos. Felicidades.

Y el tuyo, NSD, sigue centrándose en luchar contra otras motos xd así que sabiendo cómo funciona tu IA, es posible crear un mapa y una situación inicial que haga que la IA se deje casillas libres, al menos con la que tienes hasta el momento. Es eficaz, pero no óptimo. Pero ya tienes una base con la que trabajar si se hace el reto de carreras de TRON entre IA's xd.

Mi código aún no he empezado a hacerlo, a ver si me pongo ya de una vez xd. Aunque no es nada sencillo el reto, otra vez me pasé con el nivel de dificultad xd.

Así que mientras tanto, supongo que pondré otro reto javascript mas sencillito para abrir la puerta a nuevos participantes:

RETO NUEVO
Una aproximación al número PI

El ejercicio consiste en crear un código cuyo objetivo sea obtener el número PI, o una aproximación de él. Cualquier método para obtener el número PI será válido, aunque para evaluar este reto, me basaré en la "originalidad" o "rareza" del método empleado.
Obviamente, para obtener PI no se podrá utilizar valores "mágicos" o "precalculados" sin dar explicaciones válidas. Por ejemplo, todos sabemos que el (radio x 2 x PI) es el perímetro de la circunferencia, así que una aproximación incorrecta sería dividir el perímetro de una circunferencia ya calculada de antemano por el doble de su radio.

Lo ideal sería crear un método que cuantas mas veces ejecutes, mejor aproximación de PI dará.

Y aquí la música de ambientación: http://www.youtube.com/watch?v=lEpX5NQSEz0

Ale, a currar.

Última edición por marlanga; 30/12/2013 a las 14:26
  #81 (permalink)  
Antiguo 30/12/2013, 14:42
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 2 meses
Puntos: 396
Respuesta: Propuesta para desafíos javascript 2014

Bueno al ultimo reto me le mido . Siempre he considerado de que la secuencia Fibonacci tiene un impacto importante en todo lo que nos rodea.

Con la secuencia de Fibonacci se puede obtener la siguiente igualdad



Si observamos los denominadores que aparecen en cada una de las fracciones, son cada uno de los términos impares de la sucesión de Fibonnaci comenzando desde la posición número 3 (que equivale al número 2) en adelante.

Bueno dejo el siguiente demo, para quien quiera mejorarlo (quiero trabajar sobre precisiones)...

DEMO1: http://jsfiddle.net/87cFg/

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #82 (permalink)  
Antiguo 30/12/2013, 15:32
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 9 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Cuando puse el reto tenía en mente la aproximación de montecarlo, que es tener un círculo de radio 1 inscrito en un cuadrado de lado 2, y llenar el área cuadrada de puntos al azar. El área del cuadrado es lado x lado = 2 x 2 = 4 unidades. El área del círculo es radio * radio * PI = 1 * 1 * PI = PI. La ley de laplace de probabilidad dice que Probabilidad es igual a la cantidad de casos de éxito de las que queremos saber el porcentaje de probabilidad partido por la cantidad de casos totales posibles. Así que aplicado laplace al problema, la probabilidad de que un punto caiga en el círculo es P = area circulo / area cuardrado = PI / 4.

Así que aplicanddo laplace al problema, sabemos que PI / 4 = puntos dentro del circulo / puntos totales.
PI = (puntos dentro del circulo / puntos totales)*4.

Así que cuantos más puntos ponga, mejor aproximación de PI dará.
http://jsfiddle.net/marlanga/GLpcw/

Última edición por marlanga; 31/12/2013 a las 03:17
  #83 (permalink)  
Antiguo 31/12/2013, 07:57
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 2 meses
Puntos: 396
Respuesta: Propuesta para desafíos javascript 2014

Cita:
Iniciado por marlanga Ver Mensaje
Cuando puse el reto tenía en mente la aproximación de montecarlo, que es tener un círculo de radio 1 inscrito en un cuadrado de lado 2, y llenar el área cuadrada de puntos al azar. El área del cuadrado es lado x lado = 2 x 2 = 4 unidades. El área del círculo es radio * radio * PI = 1 * 1 * PI = PI. La ley de laplace de probabilidad dice que Probabilidad es igual a la cantidad de casos de éxito de las que queremos saber el porcentaje de probabilidad partido por la cantidad de casos totales posibles. Así que aplicado laplace al problema, la probabilidad de que un punto caiga en el círculo es P = area circulo / area cuardrado = PI / 4.

Así que aplicanddo laplace al problema, sabemos que PI / 4 = puntos dentro del circulo / puntos totales.
PI = (puntos dentro del circulo / puntos totales)*4.

Así que cuantos más puntos ponga, mejor aproximación de PI dará.
http://jsfiddle.net/marlanga/GLpcw/
Es bastante interesante el código... el único inconveniente que le veo es que requiere muchos puntos para poder tener una mayor precisión y que esta sea constante (cerca de 310.000 puntos para el 3.14 y mas o menos cerca de 80 millones de puntos para el 3.141)

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #84 (permalink)  
Antiguo 31/12/2013, 08:53
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 4 meses
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

Supongo que el algoritmo será más o menos bueno dependiendo de lo buena que sea la función que te dé los números pseudoaleatorios.

A mi ahora no se me ocurre ninguna solución. Bueno, se me ocurren varias, pero supongo que si no eres el Ramanujan del siglo XXI, todas ya estarán inventadas. Seguiré pensando a ver si le puedo dar un punto de vista distinto a este problema.
__________________
github.com/xgbuils | npm/xgbuils
  #85 (permalink)  
Antiguo 31/12/2013, 13:07
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 6 meses
Puntos: 319
Respuesta: Propuesta para desafíos javascript 2014

Otra forma mucho mas rapida (aunque no hay forma directa de aproximar a n decimales) es mediante funciones trigonometricas.
La formula seria: n * seno (180º / n) < PI < n * tangente (180º / n)

Para n = 3 => 2.598 < PI < 5.196
Para n = 4 => 2.828 < PI < 4
Para n = 5 => 2.938 < PI < 3.632
Para n = 6 => 3 < PI < 3.464
Para n = 10 => 3.09 < PI < 3.249
Para n = 20 => 3.128 < PI < 3.167
Para n = 60 => 3.14 < PI < 3.144
Para n = 90 => 3.14 < PI < 3.142
Para n = 360 => 3.1415 < PI < 3.1416
Para n = 720 => 3.14158 < PI < 3.14161
Para n = 1800 => 3.141591 < PI < 3.141958
Para n = 3600 => 3.1415922 < PI < 3.1415934
Para n = 9000 => 3.14159259 < PI < 3.141592781
Para n = 18000 => 3.141592638 < PI < 3.141592685
y para n = 72000=> 3.141592653 < PI < 3.141592656

el costo del calculo es fijo y la precicion depede de n.

no escribi el fiddle ya es que es solo un calculo matematico simple.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #86 (permalink)  
Antiguo 31/12/2013, 13:20
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 2 meses
Puntos: 396
Respuesta: Propuesta para desafíos javascript 2014

Cita:
Iniciado por NSD Ver Mensaje
Otra forma mucho mas rapida (aunque no hay forma directa de aproximar a n decimales) es mediante funciones trigonometricas.
La formula seria: n * seno (180º / n) < PI < n * tangente (180º / n)

Para n = 3 => 2.598 < PI < 5.196
Para n = 4 => 2.828 < PI < 4
Para n = 5 => 2.938 < PI < 3.632
Para n = 6 => 3 < PI < 3.464
Para n = 10 => 3.09 < PI < 3.249
Para n = 20 => 3.128 < PI < 3.167
Para n = 60 => 3.14 < PI < 3.144
Para n = 90 => 3.14 < PI < 3.142
Para n = 360 => 3.1415 < PI < 3.1416
Para n = 720 => 3.14158 < PI < 3.14161
Para n = 1800 => 3.141591 < PI < 3.141958
Para n = 3600 => 3.1415922 < PI < 3.1415934
Para n = 9000 => 3.14159259 < PI < 3.141592781
Para n = 18000 => 3.141592638 < PI < 3.141592685
y para n = 72000=> 3.141592653 < PI < 3.141592656

el costo del calculo es fijo y la precicion depede de n.

no escribi el fiddle ya es que es solo un calculo matematico simple.
Jajajaja pero independientemente de si es un calculo matemático simple esto son desafíos de programación así que antes de que el gato gruñón te de unos azotes has el fiddle

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #87 (permalink)  
Antiguo 31/12/2013, 13:40
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 6 meses
Puntos: 319
Respuesta: Propuesta para desafíos javascript 2014

Cita:
Obviamente, para obtener PI no se podrá utilizar valores "mágicos" o "precalculados" sin dar explicaciones válidas.
Como Math.sin y las demas trigonometricas toman sus argumentos en radianes y no en grados, es imposible escribir un algoritmo en javascript que aplique esta forma sin recurrir a la constante Math.pi para realizar la transformcion. Es solo un metodo interesante pero que no se puede emplear debido a la consigna del problema.

No se si hay una forma de pasar de grados a radianes sin PI, si la hay entonces lo que dije antes es erroneo, no obstante si existe la desconozco.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #88 (permalink)  
Antiguo 02/01/2014, 06:36
Avatar de danny_  
Fecha de Ingreso: septiembre-2012
Mensajes: 95
Antigüedad: 7 años, 1 mes
Puntos: 4
Respuesta: Propuesta para desafíos javascript 2014

Agrego una solución más al desafío y desde luego también me encantaría sumarme.

Código Javascript:
Ver original
  1. Array.prototype.unique=function(a){
  2.   return function(){return this.filter(a)}}(function(a,b,c){return c.indexOf(a,b+1)<0
  3. });
  4.  
  5. function getThirthMinorValue(data){
  6.     if(data.length != 0){  
  7.         var unique=data.unique();
  8.      unique.sort();
  9.        
  10.     }else{
  11.         return false;
  12.     }
  13.     return unique[2];
  14. }
  15.  
  16. var collection=[5,2,9,10,8,2,5];
  17. var a=getThirthMinorValue(collection);
  18.  
  19. alert(a);

Saludo a todos y feliz año nuevo!
__________________
http://www.danielcarvajal.es
  #89 (permalink)  
Antiguo 02/01/2014, 09:40
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 4 meses
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

Al final he optado por utilizar serie de Taylor para aproximarme a pi. La típica sería usar la del arcotangente de 1:

pi = 1 - 1/3 + 1/5 -1/7 ...

Pero al final he optado por calcular la serie de Taylor de la integral de sqrt(1-x²) entre 0 y 1/2 que vale pi/12 + sqrt(3)/8 y converge un poco más rápido:

Código Javascript:
Ver original
  1. var n = 21;
  2.  
  3. var a = -1;
  4. var b = 2;
  5. var term = 1;
  6. var x = 0.5;
  7. var sum = 0;
  8. for( var i = 0; i < n; ++i ) {
  9.     sum += term*x/(b-1);
  10.     term *= a/b;
  11.     x /= 4;
  12.     a += 2;
  13.     b += 2;    
  14. }
  15.  
  16. var picalc = 12*sum - 1.5*Math.sqrt(3);
  17. console.log( picalc );
  18. console.log( Math.PI );
http://jsfiddle.net/BTSzq/

Edit: por cierto, me pareció muy bonita la relación entre pi y los números de Fibonacci. Aunque perdió un poco la magia cuando vi que daba pi básicamente porque 4*arctan(1) = pi. http://www.maths.surrey.ac.uk/hosted....html#piandfib

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils

Última edición por Pantaláimon; 02/01/2014 a las 10:02
  #90 (permalink)  
Antiguo 07/01/2014, 13:10
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 2 meses
Puntos: 396
Respuesta: Propuesta para desafíos javascript 2014

@Pantaláimon apenas hoy he visto el link que muestras sobre la secuencia Fibonacci. Es cierto pierde la magia, anque me encantó el link que dejaste, está mucho mejor explicado el funcionamiento de la formula que usé para hacer el calculo.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.

Etiquetas: funcion, propuesta
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 3 personas




La zona horaria es GMT -6. Ahora son las 11:01.