Trifelios

Aunque poca gente sabe lo que es un trifelio, casi todo el mundo conoce al menos uno: “monja”. Como todos los niños saben, si se repite rápidamente esa palabra muchas veces, aparece otra distinta, “jamón”.

Hay muchas otras parejas de palabras que tienen esta misma propiedad, como “copa” y “Paco”, “mora” y “amor” o “diosa” y “adiós”.

Otras requieren cambios ortográficos (más allá de las tildes) como “carro” y “roca”, “llave” y “bella” o “labio” y “viola”.

Por último, también existen algunas parejas que son trifelios al escribirlos, pero no al decirlos, ya sea por cambio de fonética o de entonación (o ambas), como “cogeré” y “recoge” o “encuadernaré” y “reencuaderna”. Los llamamos trifelios ortográficos.

Entrada

La entrada comienza con el número de casos de prueba que se deberán procesar. Cada caso ocupará una línea independiente y contendrá dos palabras de no más de 20 letras. Aunque suponga fallos ortográficos, por simplicidad ninguna vocal llevará tilde.

Salida

Para cada caso de prueba se escribirá “SI” si la pareja de palabras es un trifelio, y “NO” en otro caso.

Dado que fonéticamente la ‘b’ y la ‘v’ son similares, deben considerarse iguales. De nuevo por simplicidad, el resto de idiosincrasias del español deberán ignorarse y considerar por tanto únicamente los trifelios ortográficos. Ten en cuenta que una palabra no forma un trifelio consigo misma ni, en este problema, con sus posibles variaciones de ‘b’ y ‘v’.

Entrada de ejemplo

5
monja jamon
Paco copa
carro roca
lavese Besela
vota bota

Salida de ejemplo

SI
SI
NO
SI
NO

Solución propuesta

from itertools import permutations


def calcular_permutaciones(palabra: str):
    permutaciones = [''.join(permutacion) for permutacion in permutations(palabra)]
    permutaciones.remove(palabra)
    if 'b' in palabra:
        palabra_v = palabra.replace('b', 'v')
        permutaciones += [''.join(permutacion) for permutacion in permutations(palabra_v)]
        permutaciones.remove(palabra_v)
    elif 'v' in palabra:
        palabra_b = palabra.replace('v', 'b')
        permutaciones += [''.join(permutacion) for permutacion in permutations(palabra_b)]
        permutaciones.remove(palabra_b)
    return permutaciones


if __name__ == '__main__':
    soluciones = []
    numero_parejas = int(input())
    for _ in range(numero_parejas):
        palabra_1, palabra_2 = [x.lower() for x in input().split()]
        if palabra_2 in calcular_permutaciones(palabra_1):
            soluciones.append('SI')
        else:
            soluciones.append('NO')
    for solución in soluciones:
        print(solución)

Enlace del código

Enlace en aceptaelreto.com

Publicado el 29 de enero de 2018