lunes, 21 de septiembre de 2020

Anagramas

Reto: Anagramas

Crear una función que detecte si dos palabras son anagramas.

Dada una palabra, si reordenamos sus letras obtendremos un anagrama de ella. Por ejemplo, Roma es un anagrama de Amor y viceversa. Otros ejemplos de anagramas son:

  • saco -cosa
  • frase - fresa
  • Eva - ave
  • Marta - trama - matar
  • amor - ramo - Roma - mora
  • valora - Álvaro
  • riesgo - Sergio
  • poder - Pedro
  • delira - lidera
  • raza -azar
  • alma - mala - lama
  • rica - cría
  • aire - reía
  • gato - gota - toga
  • Ernesto - eternos - estreno - enteros
https://repl.it/@valoro/anagrama

Método 1

Vamos a crear una función que nos diga con True o False si dos palabras son o no son un anagrama una de la otra.


Convertimos las palabras a minúsculas y las convertimos en listas de caracteres. De esta forma la palabra Roma se convierte en la lista:

['r', 'o', 'm', 'a']

Luego se ordena de menor a mayor con sort(). De esta forma, haciendo este proceso en las dos palabras, si coinciden las listas ordenadas quiere decir que contienen los mismos caracteres. Esto nos permite asegurar que las palabras son anagramas la una de la otra.
def anagrama(cadena1,cadena2):  
  cadena1lista=list(cadena1.lower()) #lo pasamos a minúsculas y lo convertimos en una lista de caracteres  
  cadena2lista=list(cadena2.lower())  
  cadena1lista.sort()        #lo ordenamos  
  cadena2lista.sort()  
  return cadena1lista==cadena2lista #comparamos las listas de caracteres ordenadas, si son iguales dará True  
palabra1='Roma'  
palabra2='amor'  
print("¿Son anagramas {} y {}?: ".format(palabra1,palabra2),anagrama(palabra1,palabra2))  




Método 2

Vamos a eliminar los acentos o tildes de las palabras antes de trabajar con ellas.

Hemos creado una función denominada normalizar que elimina los acentos (tildes) de las letras vayan en mayúsculas o en minúsculas.

El método 1 no detectaría que Álvaro y valora son anagramas, pero el método 2 si nos responde True. Se basa en el uso de la función replace.
def normalizar(s):  
  parejas = (  
    ("á", "a"),  
    ("é", "e"),  
    ("í", "i"),  
    ("ó", "o"),  
    ("ú", "u"),  
  )  
  for a, b in parejas:  
    s = s.replace(a, b).replace(a.upper(), b.upper())  
  return s  
def anagrama(cadena1,cadena2):  
 cadena1=normalizar(cadena1)  
 cadena2=normalizar(cadena2)  
 cadena1lista=list(cadena1.lower())  
 cadena2lista=list(cadena2.lower())  
 cadena1lista.sort()  
 cadena2lista.sort()  
 return cadena1lista==cadena2lista  
palabra1='Álvaro'  
palabra2='valora'  
print("¿Son anagramas {} y {}?: ".format(palabra1,palabra2),anagrama(palabra1,palabra2))