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. Bueno, visto que el hilo "desafío javascript 2012" lleva tiempo muerto, y que ni siquiera se hizo el esfuerzo de crear un post para 2013, ...

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

Bueno, visto que el hilo "desafío javascript 2012" lleva tiempo muerto, y que ni siquiera se hizo el esfuerzo de crear un post para 2013, me propongo como candidato para proponer retos y evaluarlos para este nuevo año que llega 2014.
Y si puede ser, que mientras dure el desafío, si tiene éxito, el post quede como fijo.

Para saber si ésto va a funcionar, o si va a morir de inanición como le pasó al otro, me gustaría que todos aquellos usuarios que aseguren que van a participar, que dejen una respuesta a este post. Para participar se requiere que se sepa programar; aunque pondré retos de varias dificultades, el que no tenga un poco de soltura estará perdido.

¿Y qué mejor forma de presentar tu candidatura para participar, que resolviendo un primer reto sencillo? El que quiera apuntarse, deberá hacerlo incluyendo en su mensaje una función javascript que resuelva el siguiente problema:

Quiero una función que me devuelva el tercer número más pequeño de un array. Cuidado: si dos o más números del array son iguales, sólo cuenta uno de ellos. SI no hay solución, se tiene que devolver un FALSE.
El array pasado como parámetro SIEMPRE será un array de enteros.

Código Javascript:
Ver original
  1. function tercero(arr){
  2.     if (arr.length==0) return false;
  3.     return arr[0];
  4. }
  5.  
  6. var datos=[4,1,7,2];
  7. console.log(tercero(datos));

Última edición por marlanga; 14/12/2013 a las 03:51
  #2 (permalink)  
Antiguo 14/12/2013, 04:12
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 11 años, 9 meses
Puntos: 51
Respuesta: Propuesta para desafíos javascript 2014

Me gusta la idea de los retos XD así me perfecciono un poco el programar
a ver si pienso algo mas complejo y esta tarde lo posteo.

Por sierto la solucion sera algo asi

Código Javascript:
Ver original
  1. function tercero(arr){
  2.     if (arr.length==0) return false;
  3.     var clone = arr.slice(0);
  4.     clone.sort();
  5.     var rem = [];
  6.     var remT = [];
  7.     for(var n in clone)rem[clone[n]]=clone[n];
  8.     for(var n in rem)remT.push(rem[n]);
  9.     return remT[2];
  10. }
Por cierto la solución sería algo así

//Nota he echo Trampa el primer código estaba mal XC en todo caso lo he programado en una media de 5 minutos, perdón la próxima reviso bien el código antes de publicarlo
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft

Última edición por Lynxcraft; 14/12/2013 a las 04:22 Razón: Ml Programado XD
  #3 (permalink)  
Antiguo 14/12/2013, 06:18
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 1 mes
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

Como lo más evidente era tirar de API yo he escogido otro camino.

Código Javascript:
Ver original
  1. var sink = function ( array, i ) {
  2.     var n = array.length;
  3.     var j = 2*i+1;
  4.     var k = j + 1;
  5.     var item = array[i];
  6.     while( j < n ) {
  7.         if( k < n && array[k] < array[j] ) j = k;
  8.         if( item > array[j] ) {
  9.             array[i] = array[j];
  10.             array[j] = item;
  11.         }
  12.         i = j;
  13.         j = 2*i+1;
  14.         k = j + 1;
  15.         item = array[i];
  16.     }
  17. }
  18.  
  19. Array.prototype.toHeap = function() {
  20.     var n = (this.length >> 1) - 1;
  21.     for( ; n >= 0; --n ) {
  22.         sink( this, n );
  23.     }
  24. }
  25.  
  26. Array.prototype.popMin = function()
  27. {
  28.     var n = this.length;
  29.     if( n > 0 ) {
  30.         this[0] = this[n-1];
  31.         this.pop();
  32.         sink( this, 0 );
  33.     }
  34.  
  35. }
  36.  
  37. function tercero( arr ) {
  38.     if( arr.length < 3 ) {
  39.         return false;
  40.     } else {
  41.         arr.toHeap();
  42.         var n = 1;
  43.         do {
  44.             var value = arr[0];
  45.             arr.popMin();
  46.             if( arr[0] != value ) ++n;
  47.         } while( n < 3 )
  48.  
  49.         return arr[0];
  50.     }
  51. }
  52.  
  53. var datos = [4,1,7,2];
  54. console.log(tercero(datos));

Edit: vaya que despiste, no me di cuenta del tema de que números repetidos eran considerados como uno solo. Ya está corregido

Última edición por Pantaláimon; 14/12/2013 a las 06:42
  #4 (permalink)  
Antiguo 14/12/2013, 09:22
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 7 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Lynxcraft, tu código tiene un problemas: No controlas los posibles casos en que no haya soluciones.

Pantalaimon, tu código funciona, ¿pero no has podido hacer algo más enrevesado aún? Si tu objetivo era que nadie pudiera copiarte, creo que lo has conseguido, a costa de marear la perdiz con operaciones no necesarias xd.

Bueno, de momento tenemos dos participantes. Contando conmigo, ni siquiera puedo montar una partida de dominó. Esperaré varios días antes de echarme a llorar.
  #5 (permalink)  
Antiguo 14/12/2013, 09:34
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 11 años, 9 meses
Puntos: 51
Respuesta: Propuesta para desafíos javascript 2014

Cita:
Lynxcraft, tu código tiene un problemas: No controlas los posibles casos en que no haya soluciones.
jeje tienes razon ok nose pero para estar seguro pongo como ejemplo varios casos
a ver si la idea es la correcta.

Código Javascript:
Ver original
  1. <script>
  2. var ej=[1,3,5,6,8,9]; //resultado tendría que ser  5
  3. var ej=[1,2,3,5,6,8,9]; //resultado tendría que ser  3
  4. var ej=[1,1,1,5,6,8,9]; //resultado tendría que ser  6
  5. var ej=[-1,2,3,5,6,8,9]; //resultado tendría que ser  3
  6. var ej=[1,2,2,2,5,6,8,9]; //resultado tendria que ser  5
  7. var ej=[1,2]; //resultado tendría que ser  false
  8. var ej=[1,1,1,2,2,2]; //resultado tendría que ser  false
  9. </script>

Ahora me pongo a correir el código XD
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #6 (permalink)  
Antiguo 14/12/2013, 09:36
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 7 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Los casos de prueba que has puesto son correctos. Y ahora que lo pienso mejor, el código de Pantalaimon falla en alguno de esos casos, por ejemplo con
Código Javascript:
Ver original
  1. var ej=[1,1,1,2,2,2];
  #7 (permalink)  
Antiguo 14/12/2013, 10:34
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 11 años, 9 meses
Puntos: 51
Respuesta: Propuesta para desafíos javascript 2014

Bueno me a llebado algo mas de tiempo del que esperaba XDXD

he añadido varios casos mas

Código Javascript:
Ver original
  1. <script>
  2. function tercero(arr){
  3.     if (!arr || !arr.length ) return false;
  4.     var clone, rem=[];
  5.     clone = arr.slice(0);
  6.     for(var n in clone){
  7.          var nu = clone[n];
  8.         (typeof rem[nu] != "undefined")?
  9.             delete clone[n] : rem[nu]=true;
  10.     }
  11.     clone.sort();
  12.     return (typeof clone[2] == "undefined" )?false:clone[2];
  13. }
  14.  
  15. var ej=[1,3,5,6,8,9]; console.log(tercero(ej)); //resultado tendría que ser  5
  16. var ej=[1,2,3,5,6,8,9]; console.log(tercero(ej)); //resultado tendría que ser  3
  17. var ej=[1,1,1,5,6,8,9]; console.log(tercero(ej)); //resultado tendría que ser  6
  18. var ej=[-1,2,3,5,6,8,9]; console.log(tercero(ej)); //resultado tendría que ser  3
  19. var ej=[1,2,2,2,5,6,8,9]; console.log(tercero(ej)); //resultado tendria que ser  5
  20. var ej=[1,2]; console.log(tercero(ej)); //resultado tendría que ser  false
  21. var ej=[1,1,1,2,2,2]; console.log(tercero(ej)); //resultado tendría que ser  false
  22. var ej=[1,"a",2,"b",3,"c"]; console.log(tercero(ej)); //resultado tendría que ser  3
  23. var ej=["1","a",2,"b",3,"c"]; console.log(tercero(ej)); //resultado tendría que ser  3
  24. var ej=["1","a","2","b","3","c"]; console.log(tercero(ej)); //resultado tendría que ser  3
  25. var ej=["-1","a","2","b","-3","c",4,"d"]; console.log(tercero(ej)); //resultado tendría que ser  2
  26. </script>

si falla en otro tipo de caso dimelo a ver se puede hacer XD
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #8 (permalink)  
Antiguo 14/12/2013, 11:08
Avatar de Panino5001
Moderatroll
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.096
Antigüedad: 15 años, 2 meses
Puntos: 788
Respuesta: Propuesta para desafíos javascript 2014

A ver si entendí bien:
Código PHP:
<script>
function 
tercero(arr){
    return 
arr.sort().filter(function(el,i,ar){if(i==ar.indexOf(el))return 1;return 0})[2] || false;
}
</script> 
  #9 (permalink)  
Antiguo 14/12/2013, 11:17
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 11 años, 9 meses
Puntos: 51
Respuesta: Propuesta para desafíos javascript 2014

Cita:
Iniciado por Panino5001 Ver Mensaje
A ver si entendí bien:
Código PHP:
<script>
function 
tercero(arr){
    return 
arr.sort().filter(function(el,i,ar){if(i==ar.indexOf(el))return 1;return 0})[2] || false;
}
</script> 
Que maquina XD mas simple que el mio, ni me acordaba del filter
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #10 (permalink)  
Antiguo 14/12/2013, 11:20
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 7 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Ok, tenemos otro concursante.
Tu solución, paninho, es muy parecida a la que tenía en la mente cuando propuse este mini reto, pero tu función falla cuando el número a devolver es un cero. por ejemplo, con
Código Javascript:
Ver original
  1. var datos=[-3,-2,0,1];

Ya somos tres y yo, así que en caso de que llore, al menos lo haré por un sólo ojo.

La tuya, lynxcraft, parece que funciona bien.

Aquí estan todas las funciones que tienen los Arrays en la última versión ecmascript 5, que todo buen programador javascript debe conocer:
https://developer.mozilla.org/en-US/..._Objects/Array

Última edición por marlanga; 14/12/2013 a las 11:29
  #11 (permalink)  
Antiguo 14/12/2013, 11:31
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 11 años, 9 meses
Puntos: 51
Respuesta: Propuesta para desafíos javascript 2014

El codigo de Panino5001 me parece el mejor y con respecto al caso mensionado [-3,-2,0,1]. en la funcion de Panino5001 tendo un modo de resolverlo pero no se si va contra las reglas modificar el codigo de otro XD
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #12 (permalink)  
Antiguo 14/12/2013, 11:40
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 1 mes
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

Cita:
Iniciado por marlanga
Pantalaimon, tu código funciona, ¿pero no has podido hacer algo más enrevesado aún? Si tu objetivo era que nadie pudiera copiarte, creo que lo has conseguido, a costa de marear la perdiz con operaciones no necesarias xd.
jaja, vaya. He implementado la estructura de un montículo binario( min heap o priority queue ) para luego extraer mínimos hasta llegar al tercero más pequeño. La gracia és que a partir de ese código es facil implementar uno general que halle el k-esimo menor en complejidad algorítmica O( n + k*log(n) )

Pero si gusta el código corto, esta fue mi primera idea:
Código Javascript:
Ver original
  1. function tercero( arr ) {
  2.     var x = new Object();
  3.     arr.forEach( function(e){ this[e] = 0; }, x );
  4.     return (x=Object.keys(x).sort()).length < 3 ? false : x[2];
  5. }
¡Aunque veo que Panino5001 ha hecho un código aun más corto!

Cita:
Iniciado por marlanga
Y ahora que lo pienso mejor, el código de Pantalaimon falla en alguno de esos casos, por ejemplo con
Cierto, modifico la función tercero para que funcione bien.
Código Javascript:
Ver original
  1. function tercero( arr ) {
  2.     arr.toHeap();
  3.     console.log( arr );
  4.     console.log( arr.length );
  5.     var n = 1;
  6.     do {
  7.         var value = arr[0];
  8.         console.log( arr );
  9.         console.log( arr.length );
  10.         arr.popMin();
  11.         if( arr.length == 0 ) return false;
  12.         else if( arr[0] != value )     ++n;
  13.     } while( n < 3 && arr.length > 0 );
  14.  
  15.     return n < 3 ? false : arr[0];
  16. }

PD.: Veo que tengo el mismo problema con [-3,-2,0,1]. Veo que tiene algo que ver con la conversión automática a tipo string. Pero parseInt() no me acaba de solventar el problema. Seguiré pensando.

Última edición por Pantaláimon; 14/12/2013 a las 11:57
  #13 (permalink)  
Antiguo 14/12/2013, 12:09
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 11 años, 9 meses
Puntos: 51
Respuesta: Propuesta para desafíos javascript 2014

jeje Párese es que esto se va animando

Bueno solo tengo una duda las funciones que se presente tiene que ser compatibles lo digo porque utilizar forEach o nuevas funciones, en algún navegador (cuyo nombre no mencionare ) no funcionaria.

La pregunta seria que versión de javascript seria la mínima?
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #14 (permalink)  
Antiguo 14/12/2013, 12:19
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 7 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Te sale a reducir esa ingeniería que tienes, Pantalaimon xd.
El índice var j = 2*i+1 es como un faro en medio de la oscuridad; sólo con verlo, se puede pensar que estás creando algún tipo de árbol. Dios, qué oxidados los tengo usando arrays, se nota que hace mil años que no toco C xd.


Lynx, Yo uso Chrome, así que con que funcionen en Chrome, me vale. A explorer que le den por donde amargan los pepinos.

Y si no quereis aburriros esperando a que se formalice la creación de un post de retos 2014, si finalmente se hace, decídmelo y escribo aquí otro mini reto rápido. O darle la vara a moderadores y usuarios por MP para que se apunte gente, y así empieza el post oficial antes.
  #15 (permalink)  
Antiguo 14/12/2013, 12:24
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 1 mes
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

No sé, como veais, en este caso, por suerte, forEach sólo es azucar sintáctico:
Código Javascript:
Ver original
  1. arr.forEach( function(e){ this[e] = 0; }, x );
lo puedo sustituir por
Código Javascript:
Ver original
  1. for( i in arr ) x[arr[i]] = 0;

Por cierto, ya he encontrado el truco para que funcione para números negativos. Esto de trabajar con lenguajes no tipados tiene sus ventajas y sus desventajas.
  #16 (permalink)  
Antiguo 14/12/2013, 13:19
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 1 mes
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

He descubierto la función reduce que me ha recordado a los tiempos que programaba en Haskell y no me he podido resistir a usarla. Otra versión tirando de API:

Código Javascript:
Ver original
  1. function tercero( arr ) {
  2.     return (x = arr.sort( function(a,b){ return a-b;} ).reduce( function( p, c ){
  3.         if( p.indexOf( c ) == -1 ) p.push( c );
  4.         return p;
  5.     }, [] )).length < 3 ? false : x[2];
  6. }

Cita:
Iniciado por marlanga
Y si no quereis aburriros esperando a que se formalice la creación de un post de retos 2014, si finalmente se hace, decídmelo y escribo aquí otro mini reto rápido. O darle la vara a moderadores y usuarios por MP para que se apunte gente, y así empieza el post oficial antes.
Supongo que los moderadores ya acabarán viéndolo. Si te apetece ir escribiendo retos aquí tienes a un viciado que intentará resolverlos.
  #17 (permalink)  
Antiguo 15/12/2013, 04:42
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 7 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Bien pantalaimon, no hace falta que machaques a los otros candidatos proponiendo 3 soluciones al mismo problema, me estás espantando a posibles futuros participantes xd.
Y como yo también estoy muy aburrido, y no sé cuánto tiempo me queda antes que me baneen del foro por irrespetuoso y mala educación, propondré otro reto, aunque más elaborado que el anterior:

El código morse tiene esta forma:
a .-
b -...
c -.-.
d -..
e .
f ..-.
g --.
h ....
i ..
j .---
k -.-
l .-..
m --
n -.
o ---
p .--.
q --.-
r .-.
s ...
t -
u ..-
v ...-
w .--
x -..-
y -.--
z --..

Pues bien, quiero dos funciones:
1-La primera, codificaMorse acepta una cadena con sólo letras (de la a a la z, sin tildes y sin incluir la Ñ) en mayúsculas o minúsculas, y tiene que devolver la cadena codificada a código morse. Todos los símbolos morse se ponen seguidos, excepto los espacios, que se siguen manteniendo.

2-La segunda función decodificaMorse, que es la que tiene chicha, es la que hace el trabajo contrario: Recoje una cadena con sólo símbolos ".", "-" o espacios, y la convierte a una cadena con espacios y letras desde la "a" a la "z". Ojo, es posible que la cadena morse pueda convertirse a varias cadenas de texto diferentes, así que esta función debe devolver siempre un array de cadenas. Dicho array puede estar vacío si no hay forma humana de descodificar la cadena. Es decir, la traducción tiene que ser exacta, debe gastar todos los símbolos por letras sin que sobre ninguno. Si os hace falta, se pueden crear funciones auxiliares.

Cuando haga pruebas, siempre usaré cadenas con sólo caracteres a-z y espacios para codificar, y sólo espacios, "." y "-" para decodificar.

Código Javascript:
Ver original
  1. function codificaMorse(str){
  2.     return ".-...-. -.-......-.-.";
  3. }
  4.  
  5. function decodificaMorse(str){
  6.     return ["at","em","ett","w"];
  7. }
  8.  
  9. console.log(codificaMorse("Ave Cesar"));
  10. console.log(decodificaMorse(".--"));


Por cierto, copiar vuestras soluciones para probarlas es un coñazo, mover el culo y además de escribir vuestro código dentro del post, poned también un enlace a http://jsfiddle.net/ con el reto resuelto y algún par de ejemplos que veáis interesantes.

Resolver este problema en vez del primero, también vale para apuntarse al desafío 2014, y además con nota.

Última edición por marlanga; 15/12/2013 a las 08:11
  #18 (permalink)  
Antiguo 15/12/2013, 09:13
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 11 años, 2 meses
Puntos: 1011
Respuesta: Propuesta para desafíos javascript 2014

pero que malos que son los domingos!!

Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Documento sin título</title>
<script type="text/javascript">

var letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
var morse = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--"];


function codificar(form) {

var input = [].concat(form.input.value.toUpperCase().split(""));

output = "";

input.forEach(function(ielem) {

  letters.forEach(function(lelem, lindx) {

    if(lelem == ielem) {

      output += morse[lindx] + " ";
    }

  })

});

form.output.value = output;
}




function descodificar(form){

var output = [].concat(form.output.value.toUpperCase().split(" "));

input = "";

output.forEach(function(ielem) {

  morse.forEach(function(lelem, lindx) {

    if(lelem == ielem) {
      
      input += letters[lindx];
    }

  })

});

form.input.value = input;
}
</script>
</head>
<body>

<form>
<textarea name="input"></textarea><br />
<textarea name="output"></textarea><br />
<input type="button" value="Codificar" onclick="codificar(this.form)" /><input type="button" value="Descodificar" onclick="descodificar(this.form)" />
</form>

</body> 
</html>
pd: esto no implica participar en futuros retos
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #19 (permalink)  
Antiguo 15/12/2013, 09:27
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 7 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Bueno, una concursante mas. PD: O no.
Bien. Ahora las pegas:
Dije que al codificar, no hay que meter espacios entre los símbolos morse: Pégalos todos, como en el ejemplo. Sólo se respetan los espacios de la cadena original.
por ejemplo,
"Ave Cesar" tiene que tener la salida ".-...-. -.-......-.-.". Todos los códigos morse están pegados, respetando en la salida en morse el espacio que separa "Ave" de "Cesar".

Para decodificar, es más difícil de lo que parece. Al estar los símbolos pegados unos a otros, tienes que probar cuáles encajan y cuales no. Si los símbolos estuvieran separados con espacios, sería una tarea muy sencilla, y es como tú lo has resuelto.
Pero al estar los símbolos morse que forman una misma palabra, pegados, sin espacios entre ellos, puede haber múltiples soluciones para decodificar una cadena morse, y por eso se necesita devolver un array. De hecho, es difícil encontrar una cadena morse que forme una palabra de más de 4 letras que sólo tenga una decodificación posible.

Una cadena tan pequeña como ".--" genera todas estas posibles soluciones:
["at","em","ett","w"]

Última edición por marlanga; 15/12/2013 a las 10:03
  #20 (permalink)  
Antiguo 15/12/2013, 10:29
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 8 años, 3 meses
Puntos: 343
Respuesta: Propuesta para desafíos javascript 2014

Cita:
Iniciado por Panino5001 Ver Mensaje
A ver si entendí bien:
Código PHP:
<script>
function 
tercero(arr){
    return 
arr.sort().filter(function(el,i,ar){if(i==ar.indexOf(el))return 1;return 0})[2] || false;
}
</script> 
El problema de sort es que es lexicografico por defecto, entonces [1, 2, 10] -> [1, 10, 2]. Por este motivo es necesario pasarle el callback.

Mi solución, bastante similar, aunque use reduce en lugar de filter:

Código Javascript:
Ver original
  1. function getMin(arr, pos) {
  2.     pos = pos || 0;
  3.     return arr
  4.             .reduce(function(m, c) {
  5.                 if(m.indexOf(c) == -1) m.push(c);
  6.                 return m;
  7.             }, [])
  8.             .sort(function(a, b) {
  9.                 return a > b ? 1 : -1;
  10.             })[pos] || false;
  11. }
  12.  
  13. var tercero = function(arr) { return getMin(arr, 2) };
  14.  
  15. function assertEquals(a, b) {
  16.     if(a !== b) console.error(
  17.         'Expected: ' + a + '. Got: ' + b
  18.     );
  19. }
  20.  
  21. assertEquals(tercero([]), false);
  22. assertEquals(tercero([1]), false);
  23. assertEquals(tercero([1, 2]), false);
  24. assertEquals(tercero([1, 2, 3]), 3);
  25. assertEquals(tercero([1, 2, 2]), false);
  26. assertEquals(tercero([2, 2, 2, 2, 2]), false);
  27. assertEquals(tercero([1, 2, 2, -3]), 2);
  28. assertEquals(tercero([1, 2, 2, -3, -3]), 2);
  29. assertEquals(tercero([1, 2, 2, -3, -11]), 1);
  30. assertEquals(tercero([1, 2, 2, -3, -Infinity]), 1);
  31. assertEquals(tercero([1, 2, 2, -3, -Infinity]), 1);
__________________
blog | @aijoona
  #21 (permalink)  
Antiguo 15/12/2013, 11:06
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 11 años, 9 meses
Puntos: 51
Respuesta: Propuesta para desafíos javascript 2014

Buenas ya estoy por aquí código morse interesante, pero creo que el planteamiento esta mal, el código morse no se escribe seguido tiene reglas de separación entre caracteres de otro modo conseguir de codificar una frase con código sin espacio nos daría como resultado miles de posibilidades.

La codificación debería respetar dichas reglas
http://es.wikipedia.org/wiki/C%C3%B3digo_morse

Pues bien dicho esto la separación de caracteres tendría que ser de un espacio y por palabra de 3.

No si esta de acuerdo marlanga.

Bueno ahora me pondré a programa a ver que tal XD
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #22 (permalink)  
Antiguo 15/12/2013, 11:11
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 7 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Correcto aijona.
¿He de suponer que ya tenemos otro caballo de competición en la futura carrera?

Y ya que has puesto un código genérico, voy a lucirme diciéndote cómo aplicarle una técnica llamada "curry" que es muy apropiada para este caso.

Curry consiste en pre-almacenar argumentos en un buffer de memoria para utilizarlos es llamadas posteriores a alguna función en particular. La mejor forma de implementarla es insertarla en el prototipo del objeto Fuction:

Código Javascript:
Ver original
  1. Function.prototype.curry=function(){
  2.     var aps = Array.prototype.slice;
  3.     var self=this;
  4.     var args=aps.call(arguments);
  5.     return function(){
  6.         return self.apply(self, args.concat(aps.call(arguments)));
  7.     }
  8. };
  9.  
  10. function getMin(pos,arr) {
  11.     pos = pos || 0;
  12.     return arr
  13.             .reduce(function(m, c) {
  14.                 if(m.indexOf(c) == -1) m.push(c);
  15.                 return m;
  16.             }, [])
  17.             .sort(function(a, b) {
  18.                 return a > b ? 1 : -1;
  19.             })[pos] || false;
  20. }
  21.  
  22. var tercero = getMin.curry(2);

Como puedes ver, es una solución parecida a la tuya, con la diferencia de que con curry yo puedo crear funciones con valores predefinidos dinámicamente sin esfuerzo.



En cuanto a lynx, ya sé cómo es el morse, pero como le dije a IsabelM, si separo los caracteres morse con espacios, el reto de decodificar no tendría ningún sentido. Yo quiero que calculéis esas miles de posibilidades.

Última edición por marlanga; 15/12/2013 a las 11:18
  #23 (permalink)  
Antiguo 15/12/2013, 11:47
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 13 años, 1 mes
Puntos: 32
Respuesta: Propuesta para desafíos javascript 2014

¡Claro Lynxcraft! como el problema con los caracteres morse unidos es más difícil, digamos que está mal planteado y ya está.

Un respeto para los que se lo curran. Que conseguir registrarme en http://jsfiddle.net/ me ha llevado horas. ; - )

Aquí una solución:
http://jsfiddle.net/jefebrondem/hTssX/

PD.: Veo que para que la consola de Chrome me funcione bien tengo que actualizar la pagina una vez he entrado en el link.

Última edición por Pantaláimon; 15/12/2013 a las 12:16
  #24 (permalink)  
Antiguo 15/12/2013, 12:59
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 11 años, 2 meses
Puntos: 1011
Respuesta: Propuesta para desafíos javascript 2014

(.--...) --> los caracteres son (ast) o son (ab) o quizás (ws)?? aunque puede que sea (etni) o etc .... quién va programarlo??
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #25 (permalink)  
Antiguo 15/12/2013, 13:01
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 7 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Bueno pantalaimon, tú en tu línea, haciendo códigos embrollados horribles de seguir xd. He ejecutado varias pruebas junto con el mío, y aunque no respetas el orden alfabético para devolver los resultados, el número es correcto. Asi que asumiré de que todas las soluciones son válidas.
Te mando por MP la solución que hice, en 10 minutos, teniendo claro un par de cosas xd.
  #26 (permalink)  
Antiguo 15/12/2013, 13:07
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 8 años, 3 meses
Puntos: 343
Respuesta: Propuesta para desafíos javascript 2014

Marlanga, gracias por las buenas intenciones, pero tengo que pincharte el globo:

Curry != aplicación parcial

Curry es descomponer una función en la composición de n funciones de un argumento.

Ejemplo f(a, b, c) -> f(a)(b)(c)

Lo que vos propones es aplicación parcial, que tiene unas cuantas variantes (left, right, etc).

PD: Un buen artículo sobre esto es este de Ben Allman

http://benalman.com/news/2012/09/par...on-vs-currying
__________________
blog | @aijoona
  #27 (permalink)  
Antiguo 15/12/2013, 13:15
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 7 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Caramba, pues creía que todas esas técnicas estaban dentro del conjunto currying. Bueno, supongo que lo importante es saber que existen esas técnicas y cómo aplicarlas, no el nombre que tuvieran xd, hay que ser optimista.
  #28 (permalink)  
Antiguo 15/12/2013, 13:16
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 11 años, 2 meses
Puntos: 1011
Respuesta: Propuesta para desafíos javascript 2014

recojo las migajas del primer reto
Cita:
Array.prototype.tercero = function(esteIndex) {

var rep = {}, i = 0, val = 0;

var e = this.sort(function(a, b) {return a - b;}).every(function(elem) {

if (!(elem in rep)) {

rep[elem] = elem;

val = elem;

if (++i == esteIndex) return false;
}

return true;

});

return (!e) ? rep[val] : false;
}


console.log([].tercero(3));
console.log([1].tercero(3));
console.log([1, 2].tercero(3));
console.log([1, 2, 3].tercero(3));
console.log([1, 2, 2].tercero(3));
console.log([2, 2, 2, 2, 2].tercero(3));
console.log([1, 2, 2, -3].tercero(3));
console.log([1, 2, 2, -3, -3].tercero(3));
console.log([1, 2, 2, -3, -11].tercero(3));
console.log([1, 2, 2, -3, -Infinity].tercero(3));
console.log([1, 2, 2, -3, -Infinity].tercero(3));
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}

Última edición por IsaBelM; 15/12/2013 a las 14:51 Razón: sobraba la matriz
  #29 (permalink)  
Antiguo 15/12/2013, 13:22
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 8 años, 7 meses
Puntos: 206
Respuesta: Propuesta para desafíos javascript 2014

Es correcto, aunque sin seguir la API que especifiqué en el primer mensaje xd.
Pero son detalles sin importancia, me gusta tocar los cataplines.
  #30 (permalink)  
Antiguo 15/12/2013, 15:18
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 11 años, 9 meses
Puntos: 51
Respuesta: Propuesta para desafíos javascript 2014

bueno amigos ya esto aqui esta el mio algo chapusero

XD

http://jsfiddle.net/lynxcraft/gSyGf/
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft

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 19:03.