उलटी गिनती संख्या खेल सॉल्वर
मुझे कोई सुराग नहीं है कि क्या यह हर मामले के लिए काम करता है, लेकिन यह उन लोगों में है जो मैंने कोशिश की थी। यदि कोई अनुकूलन हो तो कहीं भी हो सकता है कृपया इस पर टिप्पणी करें। मेरी कोड शैली के बारे में, मुझे यकीन है कि वहाँ कुछ ठीक करना है।
इस गेम में आपको संख्याओं का एक सेट और एक लक्ष्य दिया जाता है। आपको केवल दिए गए नंबरों और ऑपरेटरों का उपयोग करके लक्ष्य तक पहुँचने की आवश्यकता है ( \$ + \$, \ _$ - \$, \ _$ / \$, \ _$ \times \$) है। आप किसी भी संख्या का एक से अधिक बार उपयोग नहीं कर सकते हैं, लेकिन प्रत्येक ऑपरेटर को कई बार आवश्यक रूप से उपयोग किया जा सकता है। आपको हर नंबर / ऑपरेटर का उपयोग करने की आवश्यकता नहीं है।
import itertools
target = 225
numbers = [25, 1, 9, 9, 4, 2]
math_functions = "+-/*"
solution = None
def generate_number_permutations(numbers, length):
return list(itertools.permutations(numbers, length))
def generate_function_permutations(length):
return list(itertools.product(math_functions, repeat=length))
for x in range(len(numbers)):
number_permutations = generate_number_permutations(numbers, x+1)
function_permutations = generate_function_permutations(x)
if x == 0:
for y in number_permutations:
if y[0] == target:
solution = y[0]
break
else:
continue
for permutation in number_permutations:
for functions in function_permutations:
value = permutation[0]
for function in enumerate(functions):
if function[1] == "+":
value += permutation[function[0]+1]
elif function[1] == "-":
value -= permutation[function[0]+1]
elif function[1] == "/":
value /= permutation[function[0]+1]
else:
value *= permutation[function[0]+1]
if value == target:
solution = permutation, functions
break
else:
continue
break
if solution is not None:
break
print(solution)
जवाब
वैश्विक
चूंकि target, numbersऔर math_functionsवैश्विक स्थिरांक हैं, इसलिए उन्हें ऑल-कैप होना चाहिए - जैसे TARGET। उस ने कहा, आपको इसे रिफ्लेक्टर करना चाहिए ताकि लक्ष्य और संख्याएं पैरामीट्रिक हों, ताकि वे (अंततः) यादृच्छिक रूप से उत्पन्न हो सकें।
समाधान वैश्विक के रूप में नहीं है, क्योंकि यह परिवर्तनशील है - इसकी उपस्थिति आपके कार्यक्रम को फिर से प्रवेश करने से रोकती है।
इसी तरह, विश्व स्तर पर स्कोप वाले कोड for xको एक फ़ंक्शन में स्थानांतरित किया जाना चाहिए।
ऑपरेटरों का उपयोग
यह "डेटा के रूप में कोड" की श्रेणी में आता है। यह ब्लॉक:
if function[1] == "+":
value += permutation[function[0]+1]
elif function[1] == "-":
value -= permutation[function[0]+1]
elif function[1] == "/":
value /= permutation[function[0]+1]
else:
value *= permutation[function[0]+1]
यदि आप अपने math_functionsऑपरेटर के जोड़े के टपल (या शायद शब्दकोश) को बदल सकते हैं , जहां आप अपने ऑपरेटरों को आयात करते हैं, तो इसे बहुत सरल बनाया जा सकता हैhttps://docs.python.org/3/library/operator.html ।
ऑपरेटर्स
यह सिर्फ @Reinderien उत्तर को जोड़ना है। आप एक फ़ंक्शन बना सकते हैं, उन मानों को पास कर सकते हैं जिन्हें आप चालू करना चाहते हैं और ऑपरेटर जिसे आप उपयोग करना चाहते हैं, और उन दो नंबरों की गणना लौटाएं।
def perform_operator(op: str, a: int, b: int) -> int:
return { "+": a + b, "-": a - b, "*": a * b, "/": a / b }[op]
यहां बताया गया है कि आप इस फ़ंक्शन का उपयोग कैसे करेंगे
...
for function in enumerate(functions):
value = perform_operator(function[1], value, permutation[function[0] + 1])
if value == target:
solution = permutation, functions
break
...