Skip to content

Commit

Permalink
V1.3
Browse files Browse the repository at this point in the history
- обновил логику
- перевел комментарии на русский
- подготовил файл, который меняет автоматически длину слова и выбор нужного словаря
  • Loading branch information
Plim4ik committed Sep 20, 2023
1 parent 952658a commit 5eefb51
Show file tree
Hide file tree
Showing 19 changed files with 35,617 additions and 276 deletions.
172 changes: 86 additions & 86 deletions WordleSolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,111 +42,111 @@
validwords = list(validwords)

def isThisSecretAvailable(testword,mask,secret):
'''
mask: G,Y,N -- green, yellow, none
Return True if secret can be secret word with this testword and mask
'''
for i in range(len(mask)):
if(mask[i]=='N' and testword[i] not in secret):continue
if(mask[i]=='G' and testword[i]==secret[i]):continue
if(mask[i]=='Y' and testword[i] in secret and testword[i]!=secret[i]):continue
return False
return True
'''
mask: G,Y,N -- зеленый, желтый, отсутствует
Возвращает True, если секретное слово может быть секретным словом с этим тестовым словом и маской
'''
for i in range(len(mask)):
if(mask[i]=='N' and testword[i] not in secret):continue
if(mask[i]=='G' and testword[i]==secret[i]):continue
if(mask[i]=='Y' and testword[i] in secret and testword[i]!=secret[i]):continue
return False
return True

def getMask(testword,secret):
'''
Returns mask of NYG symbols for typed testword and secretword
'''
mask=""
for i in range(len(testword)):
if(testword[i]==secret[i]):mask+="G"
elif(testword[i] in secret):mask+="Y"
else:mask+="N"
return mask
'''
Возвращает маску из символов NYG для введенного тестового слова и секретного слова
'''
mask=""
for i in range(len(testword)):
if(testword[i]==secret[i]):mask+="G"
elif(testword[i] in secret):mask+="Y"
else:mask+="N"
return mask

def getAvailableWordsByMask(testword,mask,wordlist):
'''
Return list of available words by typed testword and mask
'''
validsecrets=[]
for w in wordlist:
if(isThisSecretAvailable(testword,mask,w)):
validsecrets.append(w)
return validsecrets
'''
Возвращает список доступных слов для введенного тестового слова и маски
'''
validsecrets=[]
for w in wordlist:
if(isThisSecretAvailable(testword,mask,w)):
validsecrets.append(w)
return validsecrets

# Get more difference start step
# Получить больше различий в начальном шаге

print("Analyze dictionary ("+str(len(validwords))+" words)...")
print("Анализ словаря ("+str(len(validwords))+" слов)...")

testwordmasks=dict() # Сделаем словарь: слово -> множество возможных масок
for i in validwords:
testwordmasks[i]=set()
for s in validwords:
testwordmasks[i].add(getMask(i,s))
testwordmasks[i]=set()
for s in validwords:
testwordmasks[i].add(getMask(i,s))

masksvariances=[] # Сделаем лист с информацией о количестве разных масок
masksvariances=[] # Сделаем список с информацией о количестве разных масок
for i in validwords:
masksvariances.append(len(testwordmasks[i]))
masksvariances.append(len(testwordmasks[i]))

maxmasksvariances=max(masksvariances)
maxvariancewords1=[]
for i in range(len(validwords)):
if(masksvariances[i]==maxmasksvariances):
print(validwords[i])
maxvariancewords1.append(validwords[i])
if(masksvariances[i]==maxmasksvariances):
print(validwords[i])
maxvariancewords1.append(validwords[i])


def getBestSteps(wordlist,allwords=None):
'''
Get best step for find word in wordlist by allwords dictionary
HardMode on if allwords=None or allwords=wordlist
'''
if(allwords is None):
allwords=wordlist
testwordmasks=dict()
for i in allwords:
testwordmasks[i]=set()
for s in wordlist:
testwordmasks[i].add(getMask(i,s))
masksvariances=[]
for i in allwords:
masksvariances.append(len(testwordmasks[i]))
maxmasksvariances=max(masksvariances)
print("Different masks:",maxmasksvariances)
maxvariancewords=[]
maxvariancewords2=[]
maxvariancewords3=[]
for i in range(len(allwords)):
if(masksvariances[i]==maxmasksvariances):
print(allwords[i])
maxvariancewords.append(allwords[i])
if(maxmasksvariances==1):break
elif(masksvariances[i]==maxmasksvariances-1):
# На случай, если в maxvariancewords будет всего одно слово и его не будет в словаре игры
maxvariancewords2.append(allwords[i])
elif(masksvariances[i]==maxmasksvariances-2):
maxvariancewords3.append(allwords[i])
# Среди лучших вариантов я бы поставил на первое место те, в которых буквы не повторяются
maxvariancewords.sort(key=lambda x:-len(set(x)))
maxvariancewords2.sort(key=lambda x:-len(set(x)))
maxvariancewords3.sort(key=lambda x:-len(set(x)))
return maxvariancewords+maxvariancewords2+maxvariancewords3
'''
Получить лучший шаг для поиска слова в списке wordlist с использованием словаря allwords
Режим Hard включен, если allwords=None или allwords=wordlist
'''
if(allwords is None):
allwords=wordlist
testwordmasks=dict()
for i in allwords:
testwordmasks[i]=set()
for s in wordlist:
testwordmasks[i].add(getMask(i,s))
masksvariances=[]
for i in allwords:
masksvariances.append(len(testwordmasks[i]))
maxmasksvariances=max(masksvariances)
print("Различные маски:",maxmasksvariances)
maxvariancewords=[]
maxvariancewords2=[]
maxvariancewords3=[]
for i in range(len(allwords)):
if(masksvariances[i]==maxmasksvariances):
print(allwords[i])
maxvariancewords.append(allwords[i])
if(maxmasksvariances==1):break
elif(masksvariances[i]==maxmasksvariances-1):
# На случай, если в maxvariancewords будет всего одно слово и его не будет в словаре игры
maxvariancewords2.append(allwords[i])
elif(masksvariances[i]==maxmasksvariances-2):
maxvariancewords3.append(allwords[i])
# Среди лучших вариантов я бы поставил на первое место те, в которых буквы не повторяются
maxvariancewords.sort(key=lambda x:-len(set(x)))
maxvariancewords2.sort(key=lambda x:-len(set(x)))
maxvariancewords3.sort(key=lambda x:-len(set(x)))
return maxvariancewords+maxvariancewords2+maxvariancewords3

def mainloop():
print("Enter one of next words:",maxvariancewords1,"("+str(maxmasksvariances)+" different masks)")
newwordlist=getAvailableWordsByMask(input("What word did you type: ").lower(),input("What mask did you get: ").upper(),validwords)
print("Found",len(newwordlist),"available words")
beststeps=getBestSteps(newwordlist,validwords)
if(len(beststeps)>7):beststeps=beststeps[:7]
print("Please, type one of next words:",beststeps)
while(len(newwordlist)>1):
newwordlist=getAvailableWordsByMask(input("What word did you type: ").lower(),input("What mask did you get: ").upper(),newwordlist)
print("Found",len(newwordlist),"available words")
if(len(newwordlist)==1):break
beststeps=getBestSteps(newwordlist,validwords)
if(len(beststeps)>7):beststeps=beststeps[:7]
print("Please, type one of next words:",beststeps)
print("Your word is",newwordlist)
print("Введите одно из следующих слов:",maxvariancewords1,"("+str(maxmasksvariances)+" разных масок)")
newwordlist=getAvailableWordsByMask(input("Какое слово вы ввели: ").lower(),input("Какую маску вы получили: ").upper(),validwords)
print("Найдено",len(newwordlist),"доступных слов")
beststeps=getBestSteps(newwordlist,validwords)
if(len(beststeps)>7):beststeps=beststeps[:7]
print("Пожалуйста, введите одно из следующих слов:",beststeps)
while(len(newwordlist)>1):
newwordlist=getAvailableWordsByMask(input("Какое слово вы ввели: ").lower(),input("Какую маску вы получили: ").upper(),newwordlist)
print("Найдено",len(newwordlist),"доступных слов")
if(len(newwordlist)==1):break
beststeps=getBestSteps(newwordlist,validwords)
if(len(beststeps)>7):beststeps=beststeps[:7]
print("Пожалуйста, введите одно из следующих слов:",beststeps)
print("Ваше слово:",newwordlist)

if(__name__=="__main__"):
mainloop()
mainloop()
42 changes: 42 additions & 0 deletions change_letters_count.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# ░██████╗░██╗░░░██╗░█████╗░███╗░░██╗████████╗██╗░░░██╗███╗░░░███╗  ░██████╗████████╗░█████╗░░█████╗░██╗░░██╗
# ██╔═══██╗██║░░░██║██╔══██╗████╗░██║╚══██╔══╝██║░░░██║████╗░████║  ██╔════╝╚══██╔══╝██╔══██╗██╔══██╗██║░██╔╝
# ██║██╗██║██║░░░██║███████║██╔██╗██║░░░██║░░░██║░░░██║██╔████╔██║  ╚█████╗░░░░██║░░░███████║██║░░╚═╝█████═╝░
# ╚██████╔╝██║░░░██║██╔══██║██║╚████║░░░██║░░░██║░░░██║██║╚██╔╝██║  ░╚═══██╗░░░██║░░░██╔══██║██║░░██╗██╔═██╗░
# ░╚═██╔═╝░╚██████╔╝██║░░██║██║░╚███║░░░██║░░░╚██████╔╝██║░╚═╝░██║  ██████╔╝░░░██║░░░██║░░██║╚█████╔╝██║░╚██╗
# ░░░╚═╝░░░░╚═════╝░╚═╝░░╚═╝╚═╝░░╚══╝░░░╚═╝░░░░╚═════╝░╚═╝░░░░░╚═╝  ╚═════╝░░░░╚═╝░░░╚═╝░░╚═╝░╚════╝░╚═╝░░╚═╝



import configparser

# Функция для создания и настройки файла конфигурации
def create_config_file(word_length):
config = configparser.ConfigParser()

config['Settings'] = {
'DictionaryPath': f'dict/russian/russian_nouns_{word_length}.txt',
'ValidCharacters': 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
'йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ',
'WordLength': str(word_length),
'WordsToRemove': 'clint,garbo,galen,abner'
}

with open('config.ini', 'w') as configfile:
config.write(configfile)

while True:
# Спрашиваем пользователя о количестве букв
print("Сколько букв в вашем слове?")
print("Выберите длину слова (от 4 до 11):")
word_length = int(input())

if word_length < 4 or word_length > 11:
print("Недопустимая длина слова. Выберите от 4 до 11 букв.")
else:
with open(f'dict/russian/russian_nouns_{word_length}.txt', 'w') as f:
# Здесь можно добавить код для наполнения файла словами нужной длины
pass

create_config_file(word_length)
print(f"Настройки изменены. Теперь выбрана длина слова: {word_length}")
break
16 changes: 5 additions & 11 deletions config.ini
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
# ░██████╗░██╗░░░██╗░█████╗░███╗░░██╗████████╗██╗░░░██╗███╗░░░███╗  ░██████╗████████╗░█████╗░░█████╗░██╗░░██╗
# ██╔═══██╗██║░░░██║██╔══██╗████╗░██║╚══██╔══╝██║░░░██║████╗░████║  ██╔════╝╚══██╔══╝██╔══██╗██╔══██╗██║░██╔╝
# ██║██╗██║██║░░░██║███████║██╔██╗██║░░░██║░░░██║░░░██║██╔████╔██║  ╚█████╗░░░░██║░░░███████║██║░░╚═╝█████═╝░
# ╚██████╔╝██║░░░██║██╔══██║██║╚████║░░░██║░░░██║░░░██║██║╚██╔╝██║  ░╚═══██╗░░░██║░░░██╔══██║██║░░██╗██╔═██╗░
# ░╚═██╔═╝░╚██████╔╝██║░░██║██║░╚███║░░░██║░░░╚██████╔╝██║░╚═╝░██║  ██████╔╝░░░██║░░░██║░░██║╚█████╔╝██║░╚██╗
# ░░░╚═╝░░░░╚═════╝░╚═╝░░╚═╝╚═╝░░╚══╝░░░╚═╝░░░░╚═════╝░╚═╝░░░░░╚═╝  ╚═════╝░░░░╚═╝░░░╚═╝░░╚═╝░╚════╝░╚═╝░░╚═╝

[Settings]
DictionaryPath = dict/russian_nouns_five.txt
ValidCharacters = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZйцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ
WordLength = 5
WordsToRemove = clint,garbo,galen,abner
dictionarypath = dict/russian/russian_nouns_4.txt
validcharacters = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZйцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ
wordlength = 4
wordstoremove = clint,garbo,galen,abner

File renamed without changes.
Loading

0 comments on commit 5eefb51

Please sign in to comment.