sábado, 7 de abril de 2012

"Capicua" o "Palindromo" en JavaScript

"Capicua" o "Palindromo" en JavaScript


Buenas tardes a todos!

Después de un tiempo sin redactar nada.. vuelvo a la carga con un pequeño snipet que puede ayudar a los mas nobeles en programación.
Como comprobar si una palabra es capicua (palindromo) usando una función de JavaScript.

La forma humana de resolver este problema es intentar leer la palabra al revés y fijarnos si el orden de las letras es el mismo que si se lee normal. Pues eso mismo se puede implementar usando la programación.

Para ello declaramos el método .reverse para las cadenas de caracteres (palabras), ya que por defecto JavaScript no trae esta función. Para ello se usa la propiedad prototype que nos permite construir métodos para un tipo de dato.

Llegados a este punto, lo demás es muy sencillo, simplemente comprobar si la palabra al revés es igual que la palabra normal.

Codigo fuente:




<html>
<head>
<script>

     //Definimos un metodo para el tipo de datos "string", que lo unico que hace es devolver nuestra palabra en orden inverso.
String.prototype.reverse=function(){return this.split("").reverse().join("");}

function testCapCua(word) {


//Una vez definido, ya lo tenemos practicamente hecho.
var inverseWord = word.reverse();
if (word == inverseWord) { //Si la palabra es igual a la palabra girada.
alert("La palabra '"+word+"' SI es cap i cua");
return(true); //Es capicua/palindromo.
}
else {
alert("La palabra '"+word+"' NO es cap i cua: '"+inverseWord+"'");
return(false); //NO es capicua/palindromo.
}
}
</script>
</head>

<body>
<input type="text" placeholder="Introducir palabra." id="input-word" />
<input type="button" onclick="testCapCua(document.getElementById('input-word').value)" value="Comprobar"/>
</body>
</html>

7 comentarios:

  1. Gracias!!! me ayudó bastante :)

    ResponderEliminar
  2. De nada! Me alegro que haya servido a alguien ;). Si necesitas algo más dímelo.

    Un saludo!

    ResponderEliminar
  3. Hola estoy probando tu código pero no me funciona, falla en la comprobación que no ejecuta nada, lo he probado con DW con código interno y externo.

    Se un poquito de C en plan medio autodidacta, llegué a Structs, ficheros y poco más, nada de punteros todavía, pero quería conocer un poquito JavaScript que no es tan denso pero me estoy haciendo un lío del copón con tanta flexibilidad. Voy a trabajar las funciones para arrays de nuevo desde cero en vez de leerlas, a ver si así la cosa mejora.
    Pero la esencia debe ser creo una function, creo variable y la copio, uso split para array hasta que quede dividido en letras, luego reverse y join, y comparas las dos cadenas.
    Si me animo lo probare a hacer en C, que supongo si que sabré.

    Con todo gracias.

    ResponderEliminar
  4. Oye, te pido disculpas por el comentario anterior, que sí que funciona, es que era yo que toqué algunas cosas del código.
    Como mejoras es hacer que funcione para frases eliminando espacios en blanco. Con todo, se debe poder hacer de manera más arcáica, sin prototype, y es lo que voy a intentar.

    Gracias de nuevo.

    ResponderEliminar
  5. Buenas! Disculpas aceptadas ;). Se podría dar el caso que no funcionase bien, nadie es perfecto! De todos modos me aseguré de que fuera bastante genérico y no diera problemas. Me alegro que te haya servido.

    Respecto a tu propuesta de mejora, si unicamente quieres comprobar que una frase entera sacando los espacios en blanco también es palindromo, te bastaria con añadir la siguiente linea justo al entrar en la función testCapCua(word):

    var word = word.replace(" ","");

    Lo que hace es sustituir todos los espacios " ", por nada "".

    Si tienes alguna duda o sugerencia pregunta sin miedo ;)


    Un saludo!

    ResponderEliminar
  6. Por cierto. lo que uso de prototype no tiene que ver con la libreria de JavaScript PrototypeJS (www.prototypejs.org). Lo que se hace en este código es usando JavaScript puro y duro, asignar un nuevo método al tipo de datos String.
    Si no te gusta puedes sacar toda la linea de prototype y dejas la funcion testCapCua(word) de la siguiente manera:

    function testCapCua(word) {

    word = word.replace(" ","");
    //Una vez definido, ya lo tenemos practicamente hecho.
    var inverseWord = word.split("").reverse().join("");
    if (word == inverseWord) { //Si la palabra es igual a la palabra girada.
    alert("La palabra '"+word+"' SI es cap i cua");
    return(true); //Es capicua/palindromo.
    }
    else {
    alert("La palabra '"+word+"' NO es cap i cua: '"+inverseWord+"'");
    return(false); //NO es capicua/palindromo.
    }
    }


    Un saludo!

    ResponderEliminar
  7. Hola, podrias hacerlo con numeros? que seria capicua

    ResponderEliminar