Después de algunos intentos, solo una de estas funciones me dio el resultado correcto en CodeWars. ¿Alguien me puede explicar el motivo por favor?
{ //1. solution => wrong var middle = Math.round(s.length / 2); s.length % 2 == 0 ? console.log(s[middle-1] + s[middle]) : console.log(s[middle-1]); //2. solution => correct return (s.length%2 == 0 ? s.substr((s.length/2-1),2) : s.substr((s.length/2),1)); }
La primera solución maneja incorrectamente las cadenas con una longitud impar; está devolviendo el carácter antes del medio s[middle-1]
en lugar del carácter en el medio s[middle]
.
La segunda solución lo soluciona colocando el carácter en la posición (s.length/2)
, que corresponde al valor de medio en la primera solución.
Actualización con problema adicional de @evolutionxbox:
Como señaló @evolutionxbox, si su solución original usaba console.log en lugar de regresar para generar los resultados, eso también es un problema. Supuse que agregaste eso para ver los resultados uno al lado del otro.
Los mensajes de las pruebas fallidas le indican que el valor devuelto (el valor recibido por el código de prueba) siempre fue undefined
, ya que indican que se expected undefined to equal 'es'
.
El problema con su primera solución es que imprime los resultados en la consola (llamando a console.log
) en lugar de devolver el resultado con una declaración de return
.
Si se deshace de las llamadas de console.log
y agrega una declaración de return
, entonces la primera solución es casi idéntica a la segunda solución y pasará la mayoría de las pruebas.
Sin embargo, todavía hay una ligera diferencia, la primera solución devuelve NaN
si la entrada es una cadena vacía, mientras que la segunda solución devuelve una cadena vacía. Entonces, dependiendo del conjunto de pruebas, es posible que la primera solución aún no pase todas las pruebas.
Ejecute el siguiente código para comparar los resultados.
solution1 = (s) => { var middle = Math.round(s.length / 2); return s.length % 2 == 0 ? s[middle-1]+s[middle] : s[middle-1]; }; solution2 = (s) => { return (s.length%2 == 0 ? s.substr((s.length/2-1),2) : s.substr((s.length/2),1)); }; ["", "x", "oz", "eye", "test", "--z--", "---uv---"].forEach(it => console.log("solution1: '%s' solution2: '%s' for input '%s'", solution1(it), solution2(it), it) );