अजगर जल्लाद सॉल्वर
मैंने एक प्रोग्राम लिखा, जिसमें एक सीएसवी फ़ाइल पढ़ी जिसमें 100 पंक्तियाँ थीं जो इस तरह दिखती हैं:
1;S****L;SCHOOL
2;*A*G*A*;HANGMAN
फिर एक जल्लाद खेल की तरह अक्षरों का अनुमान लगाने की कोशिश करें। मेरा दायरा हर सही और गलत अक्षरों को गिनना और फिर उन्हें समेटना है। कोड ठीक काम करता है, मुझे अक्षरों का अनुमान लगाने के लिए लगभग 1670 सही + गलत प्रयास मिलते हैं। मेरा दृष्टिकोण एक शब्दकोश बनाना था जिसमें मैं वर्णमाला के सभी अक्षरों को संग्रहीत करता हूं और फ़ाइल से हर शब्द को पढ़ता हूं फिर एक पत्र के प्रत्येक स्वरूप को योग करता हूं और उन्हें शब्दकोश में संग्रहीत करता हूं। सोमेथिन की तरह
{
"A" : 30,
"B" : 40
}
फिर मैं हर अक्षर के होने पर आधारित हुक्म को छांटता हूं और सबसे पहले पत्र को सबसे स्पष्टता के साथ अनुमान लगाने की कोशिश करता हूं।
मेरा प्रश्न। क्या कुछ ऐसा है जिसे मैं कम संख्या में प्रयास करने के लिए सुधार सकता हूं?
import csv
INPUT_FILE = "words.csv"
def oppenFile(): # function to read the file
with open(INPUT_FILE, "r", encoding="utf-8") as words:
reader = list(csv.reader(words, delimiter=";"))
return reader
def letterCount(): # function that count every the letter in the file and return a dict: {A : 2}
letters = dict.fromkeys("QWERTYUIOPĂÎASDFGHJKLȘȚÂZXCVBNM", 0)
words = oppenFile()
for w in range(len(words)):
for l in list(words[w][2]):
if l not in list(words[w][1]):
letters[l] += 1
return letters
def checkLetters(word, wholeWord, letters): # function that solve a word return the number of right + wrong attempts
attempts = 0
for letter, key in letters.items():
if letter in wholeWord and letter not in word:
attempts += 1
index = [i for i, lit in enumerate(wholeWord) if lit == letter]
letters[letter] -= len(index)
for j in range(len(index)):
word = word[:index[j]] + letter + word[(index[j] + 1):]
elif '*' not in word:
break
else:
attempts += 1
return attempts
def hangman():
words = oppenFile()
numberOfAttempts = 0
letters = letterCount()
for i in range(len(words)):
letters = dict(sorted(letters.items(), key=lambda x: x[1], reverse=True)) # sort the dict
numberOfAttempts += checkLetters(words[i][1], words[i][2], letters)
print(f"{numberOfAttempts} right + wrong attempts")
if __name__ == "__main__":
hangman()
जवाब
कोड समीक्षा में आपका स्वागत है!
PEP-8
अजगर में, साफ, रखरखाव योग्य और सुसंगत कोड लिखने के लिए पीईपी -8 शैली गाइड का पालन करना आम (और अनुशंसित) है।
फ़ंक्शंस और वेरिएबल्स को ए lower_snake_case, क्लासेस के रूप UpperCamelCaseमें और कॉन्स्टेंट के रूप में नामित किया जाना चाहिए UPPER_SNAKE_CASE।
संकेत टाइप करें
नए अजगर संस्करणों के साथ, आप चर और फ़ंक्शन मापदंडों के प्रकार का एक संक्षिप्त अवलोकन देने के लिए टाइप हिंटिंग का उपयोग कर सकते हैं।
गिनती के अक्षर
अजगर collections.Counterआपके लिए उपयोग करने के लिए एक इनबिल्ट प्रदान करता है।
टिप्पणियाँ
टिप्पणियाँ वास्तव में यहाँ मदद नहीं करती हैं। इसके अलावा, कार्यों के लिए टिप्पणियों पर docstring लिखना पसंद करते हैं।
चर नाम
आप एक फ़ाइल खोलते हैं, और उसके पॉइंटर को नाम देते हैं words, जबकि फ़ंक्शन शब्दों की सूची लौटा रहा है; कहा जाता है reader, जो बदले में एक चर में संग्रहीत किया जाता है words?
अजीब बातचीत
आप डिक्शनरी (हैश-मैप / टेबल / लुकअप) के रूप में उनके संबंधित काउंट्स को अक्षरों की एक मैपिंग उत्पन्न करते हैं, फिर इसे 2-वैल्यू टपल की सूची में परिवर्तित करते हैं, उस तरह से टाइप करते हैं और डिक्शनरी में वापस कन्वर्ट करते हैं। क्यों? dictहै \$ O(1) \$ देखने और छांटने से आपके मामले में कोई मतलब नहीं है।
सूचकांक के साथ परिवर्तन
आप निम्न लूप संरचना का उपयोग करते हैं:
for i in range(len(words)):
जहाँ, iअपने आप में कोई उद्देश्य नहीं है। उपयोग की प्रत्येक घटना iफॉर्म का है words[i]। आप केवल wordsसूची के मूल्यों पर पुनरावृति कर सकते हैं :
for word in words: