Palíndromos con Kotlin

Los palíndromos son palabras, frases o números que leídos de atrás hacia adelante se leen igual de adelante hacia atrás; por ejemplo: arenera y ana. Para el caso de los números se les llama comúnmente capicúa; por ejemplo: 1991 y 2002. Este pequeño programa o frase nos indica si una palabra es o no es palíndromo.

Código fuente:
/*
*    Autor:  Fixed Torres
*    Descp:  Evaluar si una palabra o frase es o no es palindromo.
*/

package palindromos

fun main(Args: Array<String>) {
    var (igual, aux) = Pair(0, 0)
    var texto: String

    print("Ingrese la palabra que desea evaluar: ")
    texto = readLine() as String

    for (ind in texto.length - 1 downTo 0) {
        when { texto[ind] == texto[aux] -> igual++ }
        aux++
    }

    when (igual) {
        texto.length -> println("$texto es palindromo!!")
        else -> println("$texto no es palindromo!!")
    }
}

En Kotlin la sentencia package es opcional; pero es recomendado usar dicha sentencia asignando un nombre de paquete al archivo fuente cuando se trabaja en programas más grandes que serán divididos en diferentes archivos con el fin de facilitar la importación desde otros archivos fuente. En este caso lo he puesto para explicar esta parte ya que no es necesario por ser un pequeño programa.



Función main() en Kotlin:
fun main(arg: Array<String>) {
    println("Esto es un programa básico en Kotlin")
}

El Kotlin la función main() es requerida y cumple exactamente la misma labor que en otros lenguajes como C, C++, Go y Java; es la unica funcion que se ejecuta de forma automática cuando el programa está en ejecución, todo lo que se encuentre en su interior será ejecutado incluyendo funciones, objetos e instancia de objetos.

A diferencia de su homologo Java, en Kotlin no es obligatorio declarar una clase con el mismo nombre que el archivo fuente y en su interior declarar la función main(). Por ejemplo:

public class ProgramaBasico {
    public static void main(String[] args) {
        System.out.println("Esto es un programa básico en Java");
    }
}
 Declarando variables y asignación múltiple:
var (igual, aux) = Pair(0, 0)
var texto: String

En la primera línea se crean 2 variables inicializadas a 0 mediante la desestructuración de datos usando la clase Pair(); dicha clase toma sólo 2 valores (solo dos) y los asigna a un par de variables en el mismo orden que se encuentran. También hay una clase llamada Triple() que funciona igual que Pair(), pero con 3 valores.

En la segunda línea se crea una variable de tipo String sin ser inicializada, llamada texto. Cabe aclarar que en Kotlin toda variable se crea usando la palabra clave var + nombre de la variable + : + el tipo, esta regla solo es obligatoria cuando no se ha inicializado la variable.

Solicitud y lectura de datos por teclado con readLine():
print("Ingrese la palabra que desea evaluar: ")
texto = readLine() as String

La primera línea imprime un mensaje en donde se le pide al usuario ingresar una palabra a evaluar, esta labor la cumple la función println(). La segunda línea deja en espera la terminal hasta que el usuario ingrese el dato solicitado y presione Enter; sin embargo, el valor que es leído por readLine() es de tipo String? (anulable) pero él debe ser convertido a tipo String (no nulo), esta labor puede realizarse ya sea usando el operador as como se evidencia en el código, seguida por el tipo de dato o con la función .toString().

Sentencia for(), iterando sobre la longitud del string:
for (ind in texto.length - 1 downTo 0) {
    when { texto[ind] == texto[aux] -> igual++ }
    aux++
}

El bucle for() en Kotlin funciona de forma diferente a Java, C++, Go o Groovy for(int i = 0; i < n; i++) {...} sino que funciona sobre rangos, secuencias de elementos o colecciones. El bucle va a iterar sobre un rango de números de forma descendente tomando como primer valor la longitud del texto o palabra usando el método length sin incluir el último valor e irá reduciendo dicho valor en 1 hasta 0 con cada iteración.

La sentencia when {…} es el sustituto de la legendaria sentencia switch() que hay en el lenguaje como C++ o Go; pero con vitaminas. En este fragmento de código dicha sentencia va a verificar si el carácter que está en el índice ind es igual que el carácter que está en el índice aux e incrementa el valor de la variable igual en 1, solo si la igualdad se cumple o es verdadera; por último se incrementa el valor de la variable aux en 1.

Sentencia when() {…}, ¿es o no es palíndromo?:
when (igual) {
    texto.length -> println("$texto es palindromo!!")
    else -> println("$texto no es palindromo!!")
}

Anteriormente se usó la sentencia when sin argumentos pero aquí se usará pasándole un argumento, ambas formas son válidas, solo se hace para mostrar cómo funcionan. Como se dijo antes, la sentencia when() {…} es el sustituto de la legendaria sentencia switch() que hay en el lenguaje como C++ o Go; pero con vitaminas.



En este fragmento de código la sentencia when va a tomar el valor del argumento y lo va a comparar contra cada opción en sus ramas. Si la variable igual es igual a la longitud de la variable texto, entonces muestra un mensaje indicando que dicho texto es palíndromo; pero de lo contrario, muestra un mensaje indicando que no es palíndromo. Las variables precedidas por el signo «$» son interpoladas y se reemplazan por el valor que está en la variable cuando se imprimen en pantalla.

Al compilar y ejecutar el programa, nos da el siguiente resultado:

[fixedtorres@linuxero]$ kotlinc -include-runtime Palindromos.kt -d Palindromos.jar
[fixedtorres@linuxero]$ kotlin Palindromos.jar
Ingrese la palabra que desea evaluar: arenera
arenera es palindromo!!
[fixedtorres@linuxero]$
Forma sencilla, función reversed():

Esta es la forma más corta de hacer el programa, nos ahorra un monton de lineas reduciendo el código a sólo 16 líneas, así se ve el código fuente escrito de forma corta:

/*
*    Autor:  Fixed Torres
*    Descp:  Evaluar si una palabra o frase es o no es palindromo.
*/

package palindromos

fun main(Args: Array<String>) {
    var (igual, aux) = Pair(0, 0)
    var texto: String

    print("Ingrese la palabra que desea evaluar: ")
    texto = readLine() as String

    var reverse = texto.reversed()
    if(texto == reverse) {
        println("$texto es palindromo!!")
    } else {
        println("$texto no es palindromo!!")
    }
}

La función .reversed() toma el valor almacenado en la variable, lo invierte y retorna un nuevo valor. En la línea #15 se crea una variable llamada reverse, en ella se almacena el valor de la variable texto invertido y luego usando una sentencia if() se verifica si ambas son iguales; de acuerdo a eso se imprime el mensaje.

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *