Código Morse en Ruby

Este pequeño programa toma un texto o palabra ingresada por el usuario y la codifica en Código Morse. Para realizar esta labor vamos a crear un mapa que contenga diferentes caracteres a codificar junto con respectiva clave morse, se analizará la palabra o texto ingresado por el usuario y se codifica carácter por carácter usando el mapa.

Código fuente
#!/usr/bin/env ruby

codigos = {
  "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" => "--..",

  "0" => "-----", "1" => ".----", "2" => "..---",
  "3" => "...--", "4" => "....-", "5" => ".....",
  "6" => "-....", "7" => "--...", "8" => "---..", "9" => "----.",

  "." => ".-.-.-", "," => "-.-.--", "?" => "..--..", "\"" => ".-..-."
}

texto_codificado = ""

print "Ingrese un texto a codigicar: "
texto = gets().chomp()

texto.downcase!
texto.each_char { |chr|
  if codigos.keys.include?(chr) && chr != " "
    texto_codificado << codigos[chr]
  else
    texto_codificado << chr
  end
}

puts "Texto codificado: #{texto_codificado}"

Nota: la primera línea se conoce como Shebang, es muy famosa en sistemas Unix-Like ya que permite ejecutar los programas que requieren de un intérprete, directamente sobre la línea de comandos sin necesidad de escribir el nombre del intérprete; por ejemplo, ./CodigoMorse.rb en lugar de rubyCodigoMorse.rb.

Creando mapa
codigos = {
  "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" => "--..",

  "0" => "-----", "1" => ".----", "2" => "..---",
  "3" => "...--", "4" => "....-", "5" => ".....",
  "6" => "-....", "7" => "--...", "8" => "---..", "9" => "----.",

  "." => ".-.-.-", "," => "-.-.--", "?" => "..--..", "\"" => ".-..-."
}

Este mapa consta de todo el alfabeto, los números desde el 0 hasta el 9 y otros símbolos, todos con su respectiva clave morse después del operador «=>». Esta es la forma como se crean mapas en Ruby.

Creando variable
texto_codificado = ""

Creamos una variable que almacene el texto codificado, en este caso la variable se llama texto_codificado.

Solicitando y leyendo texto
print "Ingrese un texto a codigicar: "
texto = gets().chomp()

Con la función print le solicitamos al usuario que ingrese un texto que desee codificar, luego leemos el texto ingresado por el usuario usando la función gets() y con el método chomp() eliminamos el últimos carácter «\n» que corresponde a un salto de línea; por último asignamos ese valor a la variable texto.

Convertir en minúscula el string
texto.downcase!

Antes de cualquier operación debemos convertir el string en minúscula usando el método .downcase!. El signo «!» le indica a Ruby que se debe modificar directamente el string sin devolver una copia.

Iterando sobre el string
texto.each_char { |chr|
  if codigos.keys.include?(chr) && chr != " "
    texto_codificado << codigos[chr]
  else
    texto_codificado << chr
  end
}

Iteramos sobre el string usando el método .each_char {}, cada carácter obtenido se asigna a la variable local chr. En la sentencia if usamos el método .keys para indicarle a Ruby que queremos consultar solo las claves y luego usamos el método .include?() para preguntarle a Ruby si el mapa incluye cada caracter del string entre sus claves; también se verifica en la sentencia if que cada carácter sea diferente a un espacio » « vacío.

Si las expresión booleana en la sentencia if es true, entonces entonces obtenemos el código morse de dicho carácter en el mapa que creamos al inicio -codigos[chr]- y luego concatena en la variable texto_codificado usando el operador «<<«, de lo contrario se concatena solamente el carácter almacenado en la variable chr. La sentencia else nos garantiza que los caracteres que no estén en el mapa sean respetados.

Ejecutando nuestro programa

Al ejecutar el programa nos produce el siguiente resultado:

[fixedtorres@linuxero]$ ./CodigoMorse.rb
Ingrese un texto a codigicar: Fecha: 02/12/2018
Texto codificado: ..-..-.-......-: -----..---/.----..---/..--------.-------..
[fixedtorres@linuxero]$

Hicimos la prueba con un texto que indica la fecha actual para comprobar que el programa codifica el texto en Código Morse y que además respeta caracteres como «:» o el «/».

Deja un comentario

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