Skip to content

Commit

Permalink
Reto mouredev#24 - Raku
Browse files Browse the repository at this point in the history
  • Loading branch information
joaquinferrero committed Sep 24, 2023
1 parent 1ddd8f4 commit 4d882e3
Showing 1 changed file with 47 additions and 0 deletions.
47 changes: 47 additions & 0 deletions Retos/Reto #24 - CIFRADO CÉSAR [Fácil]/raku/joaquinferrero.raku
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#!/usr/bin/env raku
#
# Cifrado César
#
# Crea un programa que realize el cifrado César de un texto y lo imprima.
# También debe ser capaz de descifrarlo cuando así se lo indiquemos.
#
# Te recomiendo que busques información para conocer en profundidad cómo
# realizar el cifrado. Esto también forma parte del reto.
#
# Joaquín Ferrero, 20230924
#
use v6;

sub cifra-césar($texto, $hay-que-cifrar = True, $desplazamiento = 3) {
my @alfabeto = <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>;
my %indice-a-letra = @alfabeto.kv;
my %letra-a-indice = %indice-a-letra.invert;

my $shift = $desplazamiento; # separación entre alfabetos normal y codificado
$shift *= -1 if $hay-que-cifrar; # al decodificar se invierte el sentido del desplazamiento

my $texto-cifrado = [~] gather { # resultado de la (des)codificación
for $texto.comb -> $letra {
my $letra-es-mayúscula = True if $letra eq $letra.uc;
my $letra-en-minúscula = $letra.lc;

take do {
my $letra-cifrada = (%letra-a-indice{$letra-en-minúscula}:exists)
?? %indice-a-letra{(%letra-a-indice{$letra-en-minúscula} + $shift) % @alfabeto}
!! $letra;

$letra-cifrada = $letra-cifrada.uc if $letra-es-mayúscula;
$letra-cifrada;
};
}
}

return $texto-cifrado;
}

sub cifra($texto, $desplazamiento = 3) { cifra-césar $texto, True, $desplazamiento }
sub descifra($texto, $desplazamiento = 3) { cifra-césar $texto, False, $desplazamiento }

say cifra("Mi nombre es MoureDev. ¿Seguro?");
say descifra("Jf kmjzóc cp JmrócBcu. ¿Pceróm?");

0 comments on commit 4d882e3

Please sign in to comment.