Mencari Kata Pertama Wordle Terbaik menggunakan Python (Bagian 4)

Fahmi Salman
Miloo Community
Published in
5 min readOct 27, 2022
Photo by Evgeni Tcherkasski on Unsplash

Setelah kita mendapatkan kombinasi kata pertama dan kedua di postingan sebelumnya, sekarang kita akan mencari kombinasi kata yang paling optimal untuk menjadi kata pertama dan kedua dalam permainan Wordle.

Kita sudah mendapatkan hasilnya dengan menggunakan kode berikut.

import pandas as pd
import numpy as np
import math
def best_words(words):
distinct_words = []
for word in words:
distinct_words.append(list(set(word)))
letter_counter = {}
for word in distinct_words:
for letter in word:
if letter in letter_counter:
letter_counter[letter] += 1
else:
letter_counter[letter] = 0
word_values = []
for word in distinct_words:
temp_value = 0
for letter in word:
temp_value += letter_counter[letter]
word_values.append(temp_value)
return word_values
def get_best_word(words, word_values):
return words[np.argmax(word_values)]
def remove_word_contain_letters(words, first_word):
result_word = []
first_word_list = list(set(first_word))

for word in words:
in_word = False
i = 0
while i < len(first_word_list) and not in_word:
if first_word_list[i] in word:
in_word = True
i += 1
if not in_word:
result_word.append(word)
return result_word
words = []
with open('sgb-words.txt') as f:
words = [line.rstrip() for line in f]
word_values = best_words(words)
first_word = get_best_word(words, word_values)
second_words = remove_word_contain_letters(words, first_word)
second_values = best_words(second_words)
second_word = get_best_word(second_words, second_values)
values = best_words(words)
values_index = np.argsort(values)[::-1]
best_val = 0
best_word_list = []
top_words = sorted(values, reverse=True)
for i, idx in enumerate(values_index):
best_word = words[idx]
second_words = remove_word_contain_letters(words, best_word)
second_values = best_words(second_words)
second_best_word = get_best_word(second_words, second_values)
temp_value = 0
for letter in second_best_word:
temp_value += letter_counter[letter]
if temp_value + top_words[i] >= best_val:
best_val = temp_value + top_words[i]
best_word_list.append([best_word, second_best_word])
print(best_word, second_best_word, top_words[i] + temp_value)

Yang perlu kita lakukan selanjutnya adalah menghitung bobot huruf untuk setiap posisi. Caranya adalah sebagai berikut.

letter_list =['r', 'o', 'a', 's', 't', 'l', 'i', 'n', 'e', 's']letter_value = {}
for letter in letter_list:
letter_counter = {}
for i in range(len(letter_list)//2):
loc_counter = 0
for j in range(len(words)):
if words[j][i] == letter:
loc_counter += 1
letter_counter[str(i)] = loc_counter
letter_value[letter] = letter_counter

Variable letter_list terdiri dari huruf-huruf yang muncul paling banyak. Setelah itu kita akan menghitung berapa kemunculan huruf tersebut di awal kata dan seterusnya dari keseluruhan kata yang ada pada dataset.

Isi dari letter_value adalah sebagai berikut.

{'r': {'0': 268, '1': 456, '2': 475, '3': 310, '4': 401},
'o': {'0': 108, '1': 911, '2': 484, '3': 262, '4': 150},
'a': {'0': 296, '1': 930, '2': 605, '3': 339, '4': 178},
's': {'0': 724, '1': 40, '2': 248, '3': 257, '4': 1764},
't': {'0': 376, '1': 122, '2': 280, '3': 447, '4': 360},
'l': {'0': 271, '1': 360, '2': 388, '3': 365, '4': 202},
'i': {'0': 74, '1': 673, '2': 516, '3': 284, '4': 45},
'n': {'0': 118, '1': 168, '2': 410, '3': 386, '4': 203},
'e': {'0': 129, '1': 660, '2': 397, '3': 1228, '4': 595}}

Hasil tersebut menjelaskan bahwa misalnya huruf r muncul sebagai huruf pertama sebanyak 268 kali, huruf kedua sebanyak 456 kali dan seterusnya. Sehingga bisa kita dapatkan nilai dari masing-masing posisi.

Selanjutnya kita akan menghitung bobot kombinasi kata yang telah kita dapatkan sebelumnya dengan menggunakan letter_value. Caranya adalah sebagai berikut.

result_list = []
for i in range(len(best_word_list)):
word_value = 0
for word in best_word_list[i]:
for j, letter in enumerate(word):
if letter in letter_value:
word_value += letter_value[letter][str(j)]
result_list.append(word_value)

Dan inilah hasilnya.

for i in range(len(result_list)):
print(best_word_list[i], result_list[i])
**result['arose', 'unity'] 3219
['tears', 'doily'] 5507
['stare', 'doily'] 4148
['tares', 'doily'] 6565
...
['lined', 'roast'] 4983
['intro', 'leads'] 4282
['nitro', 'leads'] 4831
['nodal', 'tries'] 5910

Untuk mendapatkan hasil kombinasi nilai paling optimum, kita bisa memasukan sintaks berikut.

result_index = np.argsort(result_list)[::-1]
best_word_list[result_index[0]]

Dan kombinasi kata terbaik adalah toned dan rails.

Untuk yang terakhir, ini merupakan full code dari seri pencarian kata pertama Wordle menggunakan Python.

import pandas as pd
import numpy as np
import math
def best_words(words):
distinct_words = []
for word in words:
distinct_words.append(list(set(word)))
letter_counter = {}
for word in distinct_words:
for letter in word:
if letter in letter_counter:
letter_counter[letter] += 1
else:
letter_counter[letter] = 0
word_values = []
for word in distinct_words:
temp_value = 0
for letter in word:
temp_value += letter_counter[letter]
word_values.append(temp_value)
return word_values
def get_best_word(words, word_values):
return words[np.argmax(word_values)]
def remove_word_contain_letters(words, first_word):
result_word = []
first_word_list = list(set(first_word))

for word in words:
in_word = False
i = 0
while i < len(first_word_list) and not in_word:
if first_word_list[i] in word:
in_word = True
i += 1
if not in_word:
result_word.append(word)
return result_word
words = []
with open('sgb-words.txt') as f:
words = [line.rstrip() for line in f]

distinct_words = []
for word in words:
distinct_words.append(list(set(word)))
letter_counter = {}
for word in distinct_words:
for letter in word:
if letter in letter_counter:
letter_counter[letter] += 1
else:
letter_counter[letter] = 0
word_values = best_words(words)
first_word = get_best_word(words, word_values)
second_words = remove_word_contain_letters(words, first_word)
second_values = best_words(second_words)
second_word = get_best_word(second_words, second_values)
values = best_words(words)
values_index = np.argsort(values)[::-1]
best_val = 0
best_word_list = []
top_words = sorted(values, reverse=True)
for i, idx in enumerate(values_index):
best_word = words[idx]
second_words = remove_word_contain_letters(words, best_word)
second_values = best_words(second_words)
second_best_word = get_best_word(second_words, second_values)
temp_value = 0
for letter in second_best_word:
temp_value += letter_counter[letter]
if temp_value + top_words[i] >= best_val:
best_val = temp_value + top_words[i]
best_word_list.append([best_word, second_best_word])

letter_list =['r', 'o', 'a', 's', 't', 'l', 'i', 'n', 'e', 's']
letter_value = {}
for letter in letter_list:
letter_counter = {}
for i in range(len(letter_list)//2):
loc_counter = 0
for j in range(len(words)):
if words[j][i] == letter:
loc_counter += 1
letter_counter[str(i)] = loc_counter
letter_value[letter] = letter_counter

result_list = []
for i in range(len(best_word_list)):
word_value = 0
for word in best_word_list[i]:
for j, letter in enumerate(word):
if letter in letter_value:
word_value += letter_value[letter][str(j)]
result_list.append(word_value)
result_index = np.argsort(result_list)[::-1]
print(best_word_list[result_index[0]])

Bisa disimpulkan bahwa kata toned dan rails merupakan kombinasi kata terbaik untuk memulai permainan Wordle. Selain karena huruf-huruf pada kombinasi kata tersebut merupakan huruf yang paling muncul dalam dataset, huruf-huruf tersebut juga diletakan di posisi yang mempunyai nilai tertinggi.

Demikianlah akhir dari seri pencarian kata pertama Wordle menggunakan Python. Jawaban tersebut mungkin tidak sepenuhnya optimal karena hanya mengandalkan statistik data saja tanpa melihat pertimbangan yang lain. Jika kamu punya cara lain untuk mendapatkan kata yang paling optimal dalam permainan Wordle, silahkan tulis di komentar.

--

--