Created
January 22, 2019 03:20
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$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