J'essaye de faire un script où il y a un mot ("administrateur") et il y a une extraction des lettres qui composent le mot.

La sortie que je recherche après chaque boucle ressemble à ceci:

1ère boucle: la lettre "d" est extraite

_ ré _ _ _ _ _ _ _ _ _ _ _

2ème boucle: la lettre "m" est extraite

_ d m _ _ _ _ _ _ _ _ _ _ _

3ème boucle: la lettre "a" est extraite

A d m _ _ _ _ _ _ a _ _ _

Maintenant, le problème est que je veux occuper un seul poste à la fois. Comme vous pouvez le voir avec la lettre "a", lorsqu'une lettre apparaît plus d'une fois dans un mot, le script remplira tous les endroits où se trouve la lettre.

La solution est probablement basée sur le fait que le script doit extraire les index et non les mots, et remplir la place correspondant à chaque index via un dictionnaire. J'ai essayé de le faire, mais je n'ai pas réussi à le faire fonctionner.

Avez-vous des idées sur la façon dont je pourrais le faire fonctionner?

Le code:

import time
import random


word = 'administrator'
letters_extracted = []

def string_word(word, letters_extracted):
    string = ''
    for letter in word:
        print("\nletter:", letter)
        print("letters_extracted:", letters_extracted)            
        if letter in letters_extracted:
            string += letter + " "
        else:
            string += ' _ '
    return string

letters_in_word = []
for letter in word:
    letters_in_word.append(letter)
    print("letters_in_word", letters_in_word)

while True:
    print(string_word(word, letters_extracted))
    new_letter = random.choice(letters_in_word)
    print("\nnew letter = ", new_letter)
    #in order to avoid to extract the same letter twice.
    letters_in_word.remove(new_letter)
    letters_extracted.append(new_letter)
    time.sleep(1)
    print(string_word(word, letters_extracted))
    if len(letters_in_word)==0:
        break

Ce qui suit est ma tentative d'utiliser le dictionnaire. Afin d'extraire des lettres aléatoires, j'ai remanié le mot "administrateur" et je l'ai mis dans un dictionnaire appelé "word_dictionary_shuffled". Le problème est que lorsque la boucle for démarre, elle suit l'ordre des lettres dans le dictionnaire remanié (word_dictionary_shuffled). Les lettres ne sortent donc pas dans l'ordre du mot d'origine ("administrateur"). L'ordre est celui du mot remanié. De plus, les soulignements ne ressortent pas.

import time
import random

word = 'administrator'
word_shuffled = ''.join(random.sample(word, len(word)))

word_dictionary = dict(enumerate(word))
word_dictionary_shuffled = dict(enumerate(word_shuffled))

print("word_dictionary", dict(enumerate(word)))
print("word_dictionary_shuffled", dict(enumerate(word_shuffled)))



def string_word(word_dictionary, word_dictionary_shuffled):
    string = ''
    for index,value in word_dictionary_shuffled.items():
        if index in word_dictionary_shuffled:
            string += value + " "
        else:
            string += ' _ '
        print("\nindex", index)
        print("string = ", string)
    return string


while True:
    print(string_word(word_dictionary, word_dictionary_shuffled))

    time.sleep(1)

    print(string_word(word_dictionary, word_dictionary_shuffled))    
1
Carl 18 mars 2019 à 19:02

2 réponses

Meilleure réponse

Vous n'avez pas besoin d'un dict pour mapper les index aux lettres. La chaîne elle-même peut déjà être indexée par des index de lettres. Vous devez mélanger les index au lieu des lettres afin de pouvoir parcourir les index mélangés pour démasquer les lettres correspondantes une par une:

import time
import random

word = 'administrator'

indices_shuffled = list(range(len(word)))
random.shuffle(indices_shuffled)
letters = ['_'] * len(word)
for i in indices_shuffled:
    letters[i] = word[i]
    print(''.join(letters))
    time.sleep(1)

Exemple de sortie:

_d___________
_d_____t_____
_dm____t_____
_dm__i_t_____
_dm__ist_____
_dm__ist_a___
_dm__ist_a_o_
adm__ist_a_o_
admi_ist_a_o_
admi_istra_o_
admi_istra_or
administra_or
administrator
2
blhsing 18 mars 2019 à 16:51

Une autre solution:

import random

word = 'administrator'
result = [[x, '_'] for x in word]
for i in result:
    res = random.choice([x for x in result if x[1] == '_'])
    index = result.index(res)
    result[index][1] = result[index][0]
    print(''.join([x[1] for x in result]))

Production:

____n________
____n___r____
____n_s_r____
____n_s_r__o_
____n_s_r__or
___in_s_r__or
a__in_s_r__or
a__in_str__or
ad_in_str__or
ad_in_stra_or
ad_inistra_or
ad_inistrator
administrator
0
Alderven 18 mars 2019 à 17:01