Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Palavras correspondentes a números de telefones

Seja a tabela de correspondência abaixo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Escreva um script que, dado um número de sete dígitos, gere todas as combinações possíveis de palavras de sete letras correspondentes a esse número. Existem 2.187 (3^7) dessas combinações. Evite números de telefone com dígitos 0 e 1 (para os quais nenhuma letra corresponde)

Tentei fazer assim:

 import itertools

letters = ['   ', '   ', 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PRS', 'TUV', 'WXY']


telefone = 2345678

total = ''
for i in str(telefone):
    total += letters[int(i)]

anagramas = []
for anagrama in itertools.combinations(total, len(str(telefone))):
    anagramas.append(''.join(anagrama))

print(anagramas)

Mas são geradas MUITO mais combinações do que o problema quer.... Alguma ideia? Alguém conseguiria me ajudar?

1 resposta
solução!

O problema da solução inicial foi:

Eu criei uma string contendo todas as letras correspondentes aos dígitos do telefone, e depois gerei todas as combinações possíveis desta string.

Ou seja, muitas dessas combinações terão o primeiro caractere correspondente a um dígito que não é o primeiro do telefone. E o mesmo vale para todos os dígitos em todas as posições.

Uma possível solução:

from itertools import product

letters = ['0', '1', 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PRS', 'TUV', 'WXY']
fone = 2345678  

#Converte o fone numa string e a partir dessa string obtém um iterador para um anagrama  
#relacionando cada dígito de fone a um elemento de letters. 
#Nesse exemplo: ("ABC", "DEF", "GHI", "JKL", "MNO", "PRS", "TUV")
anagrama = map(lambda d: letters[int(d)], str(fone))

#Faz o produto cartesiano entre as string do anagrama obtendo um iterador de tuplas caracteres contendo as combinações buscadas. 
#Exemplo de uma das tuplas escolhidas aleatoriamente: ('C', 'F', 'I', 'K', 'M', 'S', 'T').
#Junta cada uma das tuplas obtidas em uma string e as coloca em uma lista.
resultados = [*map(''.join, product(*anagrama))]

#Imprime os resultados.
print(*resultados, sep="\n")
print(f'Resultados obtidos: {len(resultados)} combinações')