15,845,436 members
See more:
I was trying to optimise a functionfor Hangman code and failed after various attempts, Can anyone please help me understatnd how to solve ths question.

Question:
When a user plays Hangman, the server first selects a secret word at random from a list. The server then returns a row of underscores (space separated)—one for each letter in the secret word—and asks the user to guess a letter. If the user guesses a letter that is in the word, the word is redisplayed with all instances of that letter shown in the correct positions, along with any letters correctly guessed on previous turns. If the letter does not appear in the word, the user is charged with an incorrect guess. The user keeps guessing letters until either (1) the user has correctly guessed all the letters in the word or (2) the user has made six incorrect guesses.

You are required to write a "guess" function that takes current word (with underscores) as input and returns a guess letter.You are provided with a basic, working algorithm. This algorithm will match the provided masked string (e.g. a _ _ l e) to all possible words in the dictionary, tabulate the frequency of letters appearing in these possible words, and then guess the letter with the highest frequency of appearence that has not already been guessed. If there are no remaining words that match then it will default back to the character frequency distribution of the entire dictionary.

This benchmark strategy is successful approximately 18% of the time. Your task is to design an algorithm that significantly outperforms this benchmark.

Code:
Python
```class HangmanAPI(object):
def __init__(self, access_token=None, session=None, timeout=None):
self.hangman_url = self.determine_hangman_url()
self.access_token = access_token
self.session = session or requests.Session()
self.timeout = timeout
self.guessed_letters = []

full_dictionary_location = "words_250000_train.txt"
self.full_dictionary = self.build_dictionary(full_dictionary_location)
self.full_dictionary_common_letter_sorted = collections.Counter("".join(self.full_dictionary)).most_common()

self.current_dictionary = []\

def guess(self, word): # word input example: "_ p p _ e "
###############################################
# Replace with your own "guess" function here #
###############################################

# clean the word so that we strip away the space characters
# replace "_" with "." as "." indicates any character in regular expressions
clean_word = word[::2].replace("_",".")

# find length of passed word
len_word = len(clean_word)

# grab current dictionary of possible words from self object, initialize new possible words dictionary to empty
current_dictionary = self.current_dictionary
new_dictionary = []

# iterate through all of the words in the old plausible dictionary
for dict_word in current_dictionary:
# continue if the word is not of the appropriate length
if len(dict_word) != len_word:
continue

# if dictionary word is a possible match then add it to the current dictionary
if re.match(clean_word,dict_word):
new_dictionary.append(dict_word)

# overwrite old possible words dictionary with updated version
self.current_dictionary = new_dictionary

# count occurrence of all characters in possible word matches
full_dict_string = "".join(new_dictionary)

c = collections.Counter(full_dict_string)
sorted_letter_count = c.most_common()

guess_letter = '!'

# return most frequently occurring letter in all possible words that hasn't been guessed yet
for letter,instance_count in sorted_letter_count:
if letter not in self.guessed_letters:
guess_letter = letter
break

# if no word matches in training dictionary, default back to ordering of full dictionary
if guess_letter == '!':
sorted_letter_count = self.full_dictionary_common_letter_sorted
for letter,instance_count in sorted_letter_count:
if letter not in self.guessed_letters:
guess_letter = letter
break

return guess_letter```

What I have tried:

I tried to keep a track of correct number of alphabets guessed, and if no right letter is guessed, the algorthm will start creatng "new_dictionary" from full_dictionary again.

I also tried to repeat the same steps no letters is left in "new_dictionary", bbuut still no result.

Posted
Updated 11-Jun-23 15:04pm
v2

## Solution 1

While we are more than willing to help those that are stuck, that doesn't mean that we are here to do it all for you! We can't do all the work, you are either getting paid for this, or it's part of your grades and it wouldn't be at all fair for us to do it all for you.

So we need you to do the work, and we will help you when you get stuck. That doesn't mean we will give you a step by step solution you can hand in!
Start by explaining where you are at the moment, and what the next step in the process is. Then tell us what you have tried to get that next step working, and what happened when you did.

So far, you don't appear to have done much except google and we expect to see actual code that you wrote and need help with.

If you are having problems getting started at all, then this may help: How to Write Code to Solve a Problem, A Beginner's Guide[^]