Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created January 22, 2019 03:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parzibyte/728d29860b1293a5bba37e94e7019724 to your computer and use it in GitHub Desktop.
Save parzibyte/728d29860b1293a5bba37e94e7019724 to your computer and use it in GitHub Desktop.
Cifrado César en Ruby created by parzibyte - https://repl.it/@parzibyte/Cifrado-Cesar-en-Ruby
$alfabeto_mayusculas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
$alfabeto_minusculas = "abcdefghijklmnopqrstuvwxyz"
$longitud_alfabeto = 26
$limite_inferior_mayusculas = 65
$limite_inferior_minusculas = 97
=begin
Rotar una cadena determinadas posiciones
usando el cifrado César
@author parzibyte
La cadena es el mensaje a cifrar o descrifrar
Las rotaciones indican el número de rotaciones con el que se cifra o descifra
La orientación indica si estamos rotando hacia la derecha (codificando)
o hacia la izquierda (decodificando). Los valores pueden ser 1 o -1;
por defecto es 1 (derecha)
=end
def cesar(cadena, rotaciones, orientacion = 1)
cadena_con_rotaciones = ""
# Ir letra por letra...
for letra in cadena.chars
# Si no es una letra (es un espacio, punto, etcétera) entonces
# no la rotamos ni cambiamos, ponemos el carácter así como es
if !letra.match(/^[[:alpha:]]$/)
cadena_con_rotaciones += letra
next
end
# Suponemos que la letra es mayúscula
alfabeto = $alfabeto_mayusculas
limite = $limite_inferior_mayusculas
# Pero comprobamos y cambiamos si es necesario
if letra == letra.downcase # ¿Es minúscula?
alfabeto = $alfabeto_minusculas
limite = $limite_inferior_minusculas
end
valor_ascii = letra.ord
# Saber si rotamos hacia la izquierda o derecha, así se suma o resta dependiendo de la orientación
rotaciones_verdaderas = rotaciones * orientacion
# Rotar
nueva_posicion = (valor_ascii - limite + rotaciones_verdaderas) % $longitud_alfabeto
# Y ver cuál carácter está en esa posición
cadena_con_rotaciones += alfabeto[nueva_posicion]
end
# Regresar nueva cadena
cadena_con_rotaciones
end
mensaje = "Programando en Ruby desde parzibyte.me"
rotaciones = 5
puts "El mensaje original es '#{mensaje}'. Lo vamos a rotar #{rotaciones} posiciones"
# El mensaje original es 'Programando en Ruby desde parzibyte.me'. Lo vamos a rotar 5 posiciones
mensaje_cifrado = cesar(mensaje, rotaciones)
puts "El mensaje cifrado es '#{mensaje_cifrado}'"
# El mensaje cifrado es 'Uwtlwfrfsit js Wzgd ijxij ufwengdyj.rj'
mensaje_descifrado = cesar(mensaje_cifrado, rotaciones, -1)
puts "El mensaje descifrado es '#{mensaje_descifrado}'"
# El mensaje descifrado es 'Programando en Ruby desde parzibyte.me'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment