Alexander Kramer
2 years ago
1 changed files with 136 additions and 0 deletions
@ -0,0 +1,136 @@
|
||||
#!/usr/bin/env python3 |
||||
import random |
||||
|
||||
print("Welcome to this debug tool!") |
||||
print("Just follow the instructions,") |
||||
print("however the input syntax is special.") |
||||
print() |
||||
print("A letter following by a !:") |
||||
print(" this letter doesn't exist at all") |
||||
print() |
||||
print("A letter following by a ?:") |
||||
print(" this letter exits but is misplaced") |
||||
print() |
||||
print("For example:") |
||||
print("li!n?u!s!") |
||||
print() |
||||
print("Which translates into:") |
||||
print(" the first letter is an l") |
||||
print(" the word doesn't contain an i") |
||||
print(" the letter n is misplaced") |
||||
print(" the word doesn't contain an u") |
||||
print(" the word doesn't contain an s") |
||||
print() |
||||
print() |
||||
|
||||
|
||||
def determine_guess(words: list, tries: int) -> str: |
||||
""" Selects one word from the remaining dictionary """ |
||||
if tries > 0: |
||||
return random.choice(words) # good enough |
||||
else: |
||||
return "intro" |
||||
|
||||
|
||||
def is_letter(char: str) -> bool: |
||||
""" Checks if a character exists within the alphabet """ |
||||
return char >= "a" and char <= "z" |
||||
|
||||
|
||||
def get_next_letter(response: str, current_index: int) -> str: |
||||
""" Returns the following letter """ |
||||
next_index = current_index + 1 |
||||
if next_index >= len(response): |
||||
return None |
||||
|
||||
return response[next_index] |
||||
|
||||
|
||||
def update_hints(hints: dict, response: str) -> dict: |
||||
""" |
||||
Reads the user supplied response and translates it into logical assumptions |
||||
|
||||
The hints dictionary contains single letters as keys, |
||||
where the values are lists of possible locations for this letter. |
||||
|
||||
When the user enters o! we know that 'o' has no valid position within the searched word. |
||||
dict['o'] -> [] |
||||
|
||||
When a letter is marked as misplaced, this eliminates possible positions. |
||||
dict['k'] -> [0, 1, 3, 4] |
||||
|
||||
Lastly, correct letters are greatly reducing the possibilities. |
||||
dict['m'] -> [2] |
||||
""" |
||||
response = response.lower() |
||||
|
||||
position = 0 |
||||
for i in range(len(response)): |
||||
letter = response[i] |
||||
if not is_letter(letter): |
||||
continue |
||||
|
||||
if not letter in hints: |
||||
hints[letter] = [0, 1, 2, 3, 4] |
||||
|
||||
next_letter = get_next_letter(response, i) |
||||
if not next_letter or is_letter(next_letter): |
||||
hints[letter] = [position] |
||||
elif next_letter == "?": |
||||
hints[letter] = [l for l in hints[letter] if l != position] |
||||
elif next_letter == "!": |
||||
hints[letter] = [] |
||||
else: |
||||
print("invalid input syntax") |
||||
position += 1 |
||||
return hints |
||||
|
||||
|
||||
def narrow_dictionary(words: list, hints: dict) -> list: |
||||
""" Apply the hints to narrow down the possibilities """ |
||||
invalid_words = [] |
||||
|
||||
for word in words: |
||||
for key in hints: |
||||
pos = word.find(key) |
||||
|
||||
# skip optional hints |
||||
if pos == -1 and len(hints[key]) == 0: |
||||
continue |
||||
|
||||
if not pos in hints[key]: |
||||
invalid_words.append(word) |
||||
break |
||||
|
||||
return list(filter(lambda w: w not in invalid_words, words)) |
||||
|
||||
|
||||
with open("en.txt", "r") as handle: |
||||
words = handle.readlines() |
||||
words = list(map(lambda l: l.strip(), words)) |
||||
hints = {} |
||||
|
||||
tries = 0 |
||||
while tries < 6: |
||||
guess = determine_guess(words, tries) |
||||
|
||||
print(f"{len(words)} words remaining") |
||||
print(f"input: {guess}") |
||||
response = input("response: ") |
||||
print() |
||||
|
||||
hints = update_hints(hints, response) |
||||
words = narrow_dictionary(words, hints) |
||||
|
||||
if len(words) == 1: |
||||
print(f"It must be {words[0]}") |
||||
exit() |
||||
|
||||
if len(words) == 0: |
||||
print("There are no words left, please check your input.") |
||||
exit() |
||||
|
||||
tries += 1 |
||||
|
||||
print("I hope the last try was successful.") |
||||
print() |
Loading…
Reference in new issue