Palíndromos en Go

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. Aquí está un pequeño programa escrito en Go que nos permite saber si una palabra es o no es palíndromo.

package main

import (
  "bufio"
  "fmt"
  "os"
)

func main() {
  capt := bufio.NewScanner(os.Stdin)
  var igual, aux int

  fmt.Print("Ingrese la palabra a evaluar: ")
  capt.Scan()
  valor := capt.Text()

  for char := len(valor) - 1; char >= 0; char-- {
    if valor[char] == valor[aux] {
      igual++
    }
    aux++
  }

  if len(valor) == igual {
    fmt.Println("La palabra ingresada si es palindromo!! :D")
  } else {
    fmt.Println("La palabra ingresada no es palindromo!! :(")
  }
}

Todo programa escrito en Go debe llevar como primera línea la sentencia package, dependiendo del paquete asi mismo sera el nombre que acompaña dicha sentencia; el paquete principal debe llevar main, si al anterior código le cambiamos la sentencia package main por package palíndromos, nos arroja el siguiente error –go run: cannot run non-main package– informándonos que no podemos ejecutar un paquete que no es main.

Importando paquetes necesarios en Go:
import (
   "bufio"
   "fmt"
   "os"
)

Importamos los siguientes tres paquetes, bufio, fmt y os con la sentencia import; el primer paquete implementa un buffer de entrada y salida de datos; el segundo paquete contiene funciones de entrada y salida de datos formateadas al estilo de C; el tercer paquete proporciona una interfaz a las funcionalidades del sistema operativo independientes de la plataforma.

Función main() principal:
func main() {
    /* Bloque de codigo */
}

Al igual que en lenguajes de programación como C, C++, Java y C#, el lenguaje Go también debe tener una función main; cuando se ejecuta un programa Go, todo el código que se encuentre al interior de la función main() sera ejecutado.

Declaración de variables e instancia de objeto Scanner:
capt := bufio.NewScanner(os.Stdin)
var igual, aux int

Creamos un objeto Scanner que recibe como argumento la variable Stdin el cual se encuentra en el paquete os; ahora este objeto tiene acceso a todos los métodos que nos van a permitir trabajar con operaciones de lectura de datos desde el buffer. Para algunos quizás esto es mucho código solo para leer datos ingresados por el usuario comparado con fmt.Scanf(), pero hay un problema con la anterior función que explicaré más adelante; en la segunda línea declaramos dos variables de tipo int (entero).

Solicitud, ingreso y asignación de datos por teclado:
fmt.Print("Ingrese la palabra a evaluar: ")
capt.Scan()
valor := capt.Text()

En este punto se puede apreciar que no estoy usando la función fmt.Scanf() para leer los datos ingresados por el usuario y esto se debe a que dicha función no lee frases completas con espacios; por ejemplo, la frase «Estoy en casa» causará que cuando el usuario presione Enter solo leerá la palabra «Estoy», omitirá el resto de la frase y si existen otra función Scanf() esperando el ingreso de datos desde el teclado, esta función tomará el salto de línea y no dejará que el usuario ingrese los datos.

Esta es la razón por la cual no se usa fmt.Scanf() y en reemplazo se usa un objeto Scanner para realizar este tipo de operaciones. A continuación dejo un pantallazo que ilustra mejor el problema de usar Scanf().

Una vez explicado el porqué no estoy usando Scanf(), sigo explicando lo que hacen las 3 líneas del fragmento de código anterior; la primera le solicita al usuario que ingrese una palabra para ser evaluada; en la segunda línea entra en juego el objeto Scanner llamado capt usando el método Scan(), espera a que el usuario ingrese la palabra o el texto y lo almacena en el buffer; En la tercera línea se declara una variable (con inferencia de tipos) que almacenará la palabra o texto extraído desde el buffer usando el método .Text().

Bucle for(), iterando sobre la longitud de un string:
for char := len(valor) - 1; char >= 0; char-- {
    if valor[char] == valor[aux] {
       igual++
    }
    aux++
}

El bucle for() utilizado va a iterar desde la longitud de la palabra o texto hasta cero, reduciendo su valor por 1. Para ello, se declara una variable char que almacenará el valor de dicha longitud entregado por la función len(); Al interior del bucle for hay una sentencia if() y dos variables que se van a incrementar su valor por 1.

La primera variable solo se incrementa si la igualdad en la sentencia if se cumple, de esta variable depende que el usuario sepa si una palabra es o no es palindroma; la segunda variable sirve como auxiliar para una futura evaluación, incrementa su valor por 1 y es la que equilibra la balanza en la igualdad entre los valores que se leen de adelante hacia atrás y viceversa.

Sentencia if(), verificando la igualdad:
if len(valor) == igual {
   fmt.Println("La palabra ingresada si es palindromo!! :D")
} else {
   fmt.Println("La palabra ingresada no es palindromo!! :(")
}

La sentencia if() verifica si la longitud de la variable valor es igual al valor almacenado en la variable igual; si la igualdad se cumple, entonces la palabra es palindroma y se le informa al usuario, de lo contrario se le informa al usuario que la palabra no es palindroma.

Deja un comentario

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