Die Kombinationsgenerierung von Python-Anfängern (Schüler der Mittelstufe) lag diagonal darüber (Kombinationsgenerierung durch rekursive Verarbeitung)

Mathe-Puzzle

Mr. K studiert Python [Mathe-Puzzle](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3% 83% 9E% E8% 84% B3% E3% 82% 92% E9% 8D% 9B% E3% 81% 88% E3% 82% 8B% E6% 95% B0% E5% AD% A6% E3% 83% 91% E3% 82% BA% E3% 83% AB-% E3% 82% B7% E3% 83% B3% E3% 83% 97% E3% 83% AB% E3% 81% A7% E9% AB% 98 % E9% 80% 9F% E3% 81% AA% E3% 82% B3% E3% 83% BC% E3% 83% 89% E3% 81% 8C% E6% 9B% B8% E3% 81% 91% E3 % 82% 8B% E3% 82% 88% E3% 81% 86% E3% 81% AB% E3% 81% AA% E3% 82% 8B70% E5% 95% 8F-% E5% A2% 97% E4% BA% 95-% E6% 95% 8F% E5% 85% 8B / dp / 479814245X / ref = asc_df_479814245X /? Tag = jpo-22 & linkCode = df0 & hvadid = 295723231663 & hvpos = 1o1 & hvnetw = g & hvrand = 6299120 & hvlocint = & hvlocphy = 100009242 & hvtargid = pla-526233948639 & psc = 1 & th = 1 & psc = 1) Das zweite Mal davon.

Das Problem, eine Bedingung zu finden, in der das Ergebnis der Berechnung mit der umgekehrten Reihenfolge der ursprünglichen Zahl übereinstimmt, indem vier Betriebsregeln zwischen die vierstelligen Zahlen eingefügt werden. Geben Sie mindestens eine der vier Regeln ein. Wenn Sie die Antwort schreiben, 5931 5931 = 1395 Das ist die Antwort. Schauen Sie sich um und finden Sie diejenige, die den Bedingungen entspricht.

In etwa ist es ein Programm wie dieses.

op_table = ["","+","-","*","/"]
for number in range(1000,10000):
    for op1 in op_table:
        for op2 in op_table:
            for op3 in op_table:
                if check(number,op1, op2, op3):
                    print(number,op1, op2, op3)

Python-Anfängerarbeit

def Quinary(n):
    if (int(n/5)):
        return Quinary(int(n/5)) + str(n%5)
    return str(n%5)

def eval_change(a):
    b = list_change(a)
    try:
        return int(eval(b))
    except ZeroDivisionError:
        return -1
    except SyntaxError:
        return -1
   
def list_change(a):
    b = ""
    for l in a:
        b += l
    return b

table = ["","+","-","*","/"]
for i in range(1000,10000):
    for j in range(1,125):
        a = (Quinary(j).zfill(3))
        b = list(str(i))
        for k in range(3):
            b.insert(k*2+1,table[int(a[k])])
        if str(eval_change(b)) == str(i)[::-1]:
            print(i,list_change(b),"=",int(str(i)[::-1]))

Hey hey. Herr K entschied sich für eine Doppelschleife. Ich habe das Gefühl, dass ich eine ziemlich steile Straße gewählt habe, aber ich habe sie gut gelöst. Quinary scheint im Internet gesucht zu haben. Da es fünf Arten von Operatoren gibt, besteht die Idee darin, Quintuplets zu verwenden. Ich hatte diese Idee nicht.

Das Herzstück dieses Programms ist, dass es rekursiv verwendet, um Kombinationen zu generieren. Sie können sich nicht die Mühe machen, ein Quintett aufzurufen, aber Sie können ein Round-Robin generieren, ohne mehrere Loops zu verwenden, oder? Außerdem kann diese Methode durch Ändern der Parameter realisiert werden.

Lösen wir dieses Problem also mit einer anderen Methode als der mittelmäßigen Vierfachschleife.

SyntaxError verhindern

Reparieren Sie das Teil, das Sie interessiert, bevor Sie einen größeren Umbau durchführen

Wenn in Python vor der 0-Zahl eine 0 steht, z. B. 01 001, tritt ein SyntaxError auf. Daher führt eval ("1 + 001") zu einem SyntaxError. Herr K hat eine Strategie gewählt, die in einem solchen Fall nicht berechnet wird. Die richtige Antwort war nicht dieses Muster, also bat ich um eine Antwort. Um genau zu sein, es ist kein Round-Robin, also habe ich versucht, keinen Fehler zu machen (fügen Sie beim Erstellen der Formel keine unnötigen Nullen hinzu). Nach dem Erstellen der Formel scheint es eine Möglichkeit zu geben, 0 mit einem regulären Ausdruck zu löschen.

Beginnen Sie mit dem Kochen

Operatoren kombinieren Erstellen Sie einen Generator, der rekursiv generiert wird.

gen_sequence



a0=[["a","b"],["A","B","C"]]

def gen_sequence(a):
    for i in a[0]:
        if(len(a)>1):
            for j in gen_sequence(a[1:]):
                yield([i]+j)
        else:
            yield([i])

for x in gen_sequence(a0):
    print(x)

Ausführungsergebnis


['a', 'A']
['a', 'B']
['a', 'C']
['b', 'A']
['b', 'B']
['b', 'C']

Generieren Sie eine Kombination von Operatoren mit gen_sequence und prüfen Sie, ob die Bedingung durch Runden erfüllt ist. Das Generieren der Zeichenkette in Mr. Ks Formel war ziemlich schwierig, deshalb habe ich sie mit zip in einen Prozess umgeschrieben und zu einer Funktion gemacht.

from itertools import zip_longest

op_list=[["","+","-","*","/"]]*3

def gen_sequence(a):
    for i in a[0]:
        if(len(a)>1):
            for j in gen_sequence(a[1:]):
                yield([i]+j)
        else:
            yield([i])

def build_formula(number_str, ops):
    formula = ""
    for num, op in zip_longest(number_str , ops, fillvalue=""):
        if len(formula)>1 and not formula[-2].isdigit() and formula[-1]=="0":
            #Löschen Sie die 0 unmittelbar nach dem Operator
            formula = formula[:-1]
        formula += num + op
    return formula

def eval_string(string):
    try:
        return eval(string)
    except ZeroDivisionError:
        return -1
           
for i in range(1000,10000):
    number_str = str(i)
    number_str_rev = number_str[::-1]
    for op in gen_sequence(op_list):
        if op ==[""]*3:
            continue
        formula = build_formula(number_str, op)
        if str(eval_string(formula)) == number_str_rev:
            print(i , formula , "=" , number_str_rev)

Ich habe versucht, eine Round-Robin-Kombination ohne Verwendung einer Schleife zu generieren. 2020/01/01 Geändert zu zip_longest ()

Ich habe eine gen_sequence-Funktion erstellt, aber itertools.product (* op_list) war gleichbedeutend damit. Da der Zweck darin besteht, diese Funktion zu erstellen, habe ich sie dieses Mal erstellt. Wenn Sie diese Funktion benötigen, können Sie itertools.product verwenden.

Recommended Posts

Die Kombinationsgenerierung von Python-Anfängern (Schüler der Mittelstufe) lag diagonal darüber (Kombinationsgenerierung durch rekursive Verarbeitung)
Ich habe versucht, den Code des Python-Anfängers (Schüler der Mittelstufe) zu überarbeiten.
Programmieranfänger (Schüler der Mittelstufe) Optimieren Sie den erstellten Algorithmus
Ich habe versucht, den Code des Python-Anfängers (Schüler der Mittelstufe) in objektorientiertes Knuspriges umzuwandeln