Skip to content

Instantly share code, notes, and snippets.

@chiayolin
Created August 19, 2022 11:48
Show Gist options
  • Save chiayolin/85977d1c66548dedca09e32e2775afe6 to your computer and use it in GitHub Desktop.
Save chiayolin/85977d1c66548dedca09e32e2775afe6 to your computer and use it in GitHub Desktop.
import re
N = 5
# deserialize wordlist file
with open('/usr/share/dict/words') as f:
words = f.readlines()
words = filter(lambda w: len(w) == N,
map(lambda w: w.rstrip().lower(), words))
none = set()
known = set()
green = ['.'] * N
yellow = [[], [], [], [], []]
for _ in range(10):
while len((guess := input("guess word: "))) != N:
print('a word must be 5-character long')
for i in range(N):
# read unitl valid option
while (opt := input(
f'{guess[i].upper()} [(g)reen/(y)ellow/(n)one]: '
).lower()) not in 'gyn': print(f'invalid option: {opt}')
if opt[0] == 'n':
if guess[i] in green:
yellow[i].append(guess[i])
else: none.add(guess[i])
elif opt[0] == 'g':
if guess[i] in none:
none.remove(guess[i])
if guess[i] in known:
known.remove(guess[i])
green[i] = guess[i]
elif opt[0] == 'y':
known.add(guess[i])
yellow[i].append(guess[i])
# filter for green letters
words = [*filter(lambda w: re.match(f'^{"".join(green)}$', w), words)]
#print(words, len(words))
# filter for known letters
for kc in known:
words = [*filter(lambda w: kc in w, words)]
#print(words, len(words))
# filter out grey letters
words = [*filter(lambda w: none == (none - set(w)), words)]
#print(words, len(words))
# filter out known letters at incorrect positions
for pos in range(len(yellow)):
words = [*filter(lambda w: w[pos] not in yellow[pos], words)]
#print(words, len(words))
print(*words)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment