उलटी गिनती संख्या खेल सॉल्वर

Oct 09 2020

मुझे कोई सुराग नहीं है कि क्या यह हर मामले के लिए काम करता है, लेकिन यह उन लोगों में है जो मैंने कोशिश की थी। यदि कोई अनुकूलन हो तो कहीं भी हो सकता है कृपया इस पर टिप्पणी करें। मेरी कोड शैली के बारे में, मुझे यकीन है कि वहाँ कुछ ठीक करना है।

इस गेम में आपको संख्याओं का एक सेट और एक लक्ष्य दिया जाता है। आपको केवल दिए गए नंबरों और ऑपरेटरों का उपयोग करके लक्ष्य तक पहुँचने की आवश्यकता है ( \$ + \$, \ _$ - \$, \ _$ / \$, \ _$ \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)

जवाब

3 Reinderien Oct 09 2020 at 22:29

वैश्विक

चूंकि 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 ।

Linny Oct 10 2020 at 05:24

ऑपरेटर्स

यह सिर्फ @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
...