forked from mouredev/retos-programacion-2023
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request mouredev#5124 from joaquinferrero/main
Reto mouredev#29 - Perl
- Loading branch information
Showing
2 changed files
with
128 additions
and
0 deletions.
There are no files selected for viewing
65 changes: 65 additions & 0 deletions
65
Retos/Reto #29 - EL CARÁCTER INFILTRADO [Fácil]/perl/joaquinferrero.pl
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
#!/usr/bin/env perl | ||
# | ||
# El carácter infiltrado | ||
# | ||
# Crea una función que reciba dos cadenas de texto casi iguales, | ||
# a excepción de uno o varios caracteres. | ||
# La función debe encontrarlos y retornarlos en formato lista/array. | ||
# - Ambas cadenas de texto deben ser iguales en longitud. | ||
# - Las cadenas de texto son iguales elemento a elemento. | ||
# - No se pueden utilizar operaciones propias del lenguaje | ||
# que lo resuelvan directamente. | ||
# | ||
# Ejemplos: | ||
# - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] | ||
# - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] | ||
# | ||
# Joaquín Ferrero, 20230925 | ||
# | ||
use v5.38; | ||
use utf8; | ||
use open qw<:std :utf8>; | ||
|
||
|
||
busca_diferencias("Cadenas de distinta longitud", "Otra cadena"); | ||
|
||
my @diferencias; | ||
|
||
@diferencias = busca_diferencias("Una cadena igual", "Una cadena igual"); | ||
pinta_diferencias(@diferencias); | ||
|
||
@diferencias = busca_diferencias("Me llamo mouredev", "Me llemo mouredov"); | ||
pinta_diferencias(@diferencias); | ||
|
||
@diferencias = busca_diferencias("Me llamo.Brais Moure", "Me llamo brais moure"); | ||
pinta_diferencias(@diferencias); | ||
|
||
@diferencias = busca_diferencias("Me llamo Brais Moure", "Me llamó Bráis Mouré"); | ||
pinta_diferencias(@diferencias); | ||
|
||
|
||
sub pinta_diferencias(@diferencias) { | ||
say "[", join(", ", map { qq{"$_"} } @diferencias), "]"; | ||
} | ||
|
||
sub busca_diferencias($cadena_1, $cadena_2) { | ||
if (length($cadena_1) != length($cadena_2)) { | ||
warn "ERROR: Las cadenas\n [$cadena_1] y\n [$cadena_2]\n tienen distinta longitud\n"; | ||
return; | ||
} | ||
|
||
# ^. es el OR exclusivo para cadenas, a partir de Perl v5.28 | ||
# A partir de aquí, serán "\0" los caracteres que coincidan entre las dos cadenas | ||
my @mezcla = split //, $cadena_1 ^. $cadena_2; | ||
|
||
# Recorrer la $mezcla para ver qué caracteres de $cadena_2 han cambiado | ||
my @diferentes; | ||
|
||
while(my($i, $letra) = each @mezcla) { # A partir de Perl v5.12 | ||
next if $letra eq "\0"; | ||
push @diferentes, substr $cadena_2, $i, 1; | ||
} | ||
|
||
return @diferentes; | ||
} | ||
|
63 changes: 63 additions & 0 deletions
63
Retos/Reto #29 - EL CARÁCTER INFILTRADO [Fácil]/raku/joaquinferrero.raku
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
#!/usr/bin/env raku | ||
# | ||
# El carácter infiltrado | ||
# | ||
# Crea una función que reciba dos cadenas de texto casi iguales, | ||
# a excepción de uno o varios caracteres. | ||
# La función debe encontrarlos y retornarlos en formato lista/array. | ||
# - Ambas cadenas de texto deben ser iguales en longitud. | ||
# - Las cadenas de texto son iguales elemento a elemento. | ||
# - No se pueden utilizar operaciones propias del lenguaje | ||
# que lo resuelvan directamente. | ||
# | ||
# Ejemplos: | ||
# - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] | ||
# - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] | ||
# | ||
# Joaquín Ferrero, 20230925 | ||
# | ||
use v6; | ||
|
||
|
||
busca-diferencias("Cadenas de distinta longitud", "Otra cadena"); | ||
|
||
my @diferencias; | ||
|
||
@diferencias = busca-diferencias("Una cadena igual", "Una cadena igual"); | ||
pinta-diferencias(@diferencias); | ||
|
||
@diferencias = busca-diferencias("Me llamo mouredev", "Me llemo mouredov"); | ||
pinta-diferencias(@diferencias); | ||
|
||
@diferencias = busca-diferencias("Me llamo.Brais Moure", "Me llamo brais moure"); | ||
pinta-diferencias(@diferencias); | ||
|
||
@diferencias = busca-diferencias("Me llamo Brais Moure", "Me llamó Bráis Mouré"); | ||
pinta-diferencias(@diferencias); | ||
|
||
|
||
sub pinta-diferencias(@diferencias) { | ||
"[%s]\n".printf: @diferencias.map({qq/"$_"/}).join(", "); | ||
} | ||
|
||
sub busca-diferencias($cadena_1, $cadena_2) { | ||
if $cadena_1.chars != $cadena_2.chars { | ||
note "ERROR: Las cadenas\n [$cadena_1] y\n [$cadena_2]\n tienen distinta longitud\n"; | ||
return; | ||
} | ||
|
||
# ~^ es el OR exclusivo para cadenas | ||
# A partir de aquí, serán "\0" los caracteres que coincidan entre las dos cadenas | ||
my @mezcla = ($cadena_1 ~^ $cadena_2).comb; | ||
|
||
# Recorrer la $mezcla para ver qué caracteres de $cadena_2 han cambiado | ||
my @diferentes; | ||
|
||
for @mezcla.kv -> $i, $letra { | ||
next if $letra eq "\0"; | ||
@diferentes.push: substr $cadena_2, $i, 1; | ||
} | ||
|
||
return @diferentes; | ||
} | ||
|