[GO] Versuchen Sie, RPN mit Python zu berechnen (für Anfänger)

Einführung

Nachdem ich AOJ auf verschiedene Weise gelöst hatte, berührte ich zum ersten Mal seit einiger Zeit die "umgekehrte polnische Notation". 0087:Strange Mathematical Expression Nach der Überprüfung schrieb ich Reverse Polish Notation (RPN) in Python.

Was ist überhaupt die umgekehrte polnische Notation?

Als ich es in einer Universitätsklasse gelernt habe, dachte ich nur: "Hey, ich muss nicht nacheinander Klammern schreiben, und wenn ich mich erst einmal daran gewöhnt habe, ist es einfach zu bedienen." Es scheint mit Computern kompatibel zu sein, nur weil Sie nicht auf alle Zahlen und Operatoren warten müssen, die Sie berechnen möchten, ohne lange überlegen zu müssen.

Es scheint auch mit Japanern kompatibel zu sein. Zum Beispiel 「(1 + 3) * (9 - 2)」 Wenn Sie den bekannten mathematischen Ausdruck (dies wird als einleitende Notation bezeichnet) in umgekehrter polnischer Notation schreiben 「1 3 + 9 2 - *」 Es kann umgeschrieben werden als. Das heisst "Addiere 1 und 3, subtrahiere 2 von 9 und multipliziere sie." Deshalb ist die japanische Übersetzung fertig.

Mit Stack ist es einfach zu schreiben. ・ Wenn die Eingabe ein numerischer Wert ist, drücken Sie auf Stapel -Wenn die Eingabe ein Operator ist, geben Sie den numerischen Wert für das Argument aus Stack ein, berechnen Sie und drücken Sie den Rückgabewert erneut. Wiederholen Sie dies einfach.

Dies ist übrigens eine Seite, aber wissen Sie, warum es "(umgekehrte) polnische Notation" genannt wird? Ich habe völlig falsch verstanden, dass eine solche Beschreibungsmethode in Polen üblich war (wie?), Aber das ist nicht der Fall. Es wird gesagt, dass es genannt wird, weil der logische Gelehrte Jan Ukasevich, der ursprünglich diese Beschreibungsmethode entwickelte, ein Pole war. Wenn ja, könnte man es "Ukasevich-Notation" nennen, aber sein Name Jan Łukasiewicz wurde grob als "polnische Notation" bezeichnet, weil es für die Briten zu dieser Zeit schwierig war, sie auszusprechen. Korrekt.

Es ist ironisch, dass die polnische Notation, die entwickelt wurde, um die Notation von Klammern zu beseitigen, die Priorität anzeigen, von Lisp übernommen wird, das den Ruf hat, viele Klammern zu haben.

[Wikipedia-Yan Ukasevich](https://ja.wikipedia.org/wiki/%E3%83%A4%E3%83%B3%E3%83%BB%E3%82%A6%E3%82%AB % E3% 82% B7% E3% 82% A7% E3% 83% B4% E3% 82% A3% E3% 83% 81)

Eigentlich in Python schreiben

rpn.py


def RPN(states):
    '''
Eine Funktion, die die inverse polnische Notation berechnet
    '''
    operator = {
        '+': (lambda x, y: x + y),
        '-': (lambda x, y: x - y),
        '*': (lambda x, y: x * y),
        '/': (lambda x, y: float(x) / y)
    }
    stack = []
    print('RPN: %s' % states)
    for index, z  in enumerate(states):
        if index > 0:
            print(stack)
        if z not in operator.keys():
            stack.append(int(z))
            continue
        y = stack.pop()
        x = stack.pop()
        stack.append(operator[z](x,y))
        print('%s %s %s =' % (x, z, y))
    print(stack[0])
    return stack[0]

def test():
    print("OK" if RPN("37+621-*+") == 16 else "NG")

if __name__ == '__main__':
    import sys
    RPN(sys.argv[1])
    test()
$ python rpn.py 37+621-*+
RPN: 37+621-*+
[3]
[3, 7]
3 + 7 =
[10]
[10, 6]
[10, 6, 2]
[10, 6, 2, 1]
2 - 1 =
[10, 6, 1]
6 * 1 =
[10, 6]
10 + 6 =
[16]
OK

abschließend

Als ich mir nach der Überprüfung einige Websites angesehen habe, haben viele Leute die Aufzählungsfunktion für die Implementierung verwendet, also habe ich sie nachgeahmt.

>>> a = ['a','b','c']
>>> for x in a:
...     print(x)
... 
a
b
c

Für eine Liste wie

>>> a = ['a','b','c']
>>> for i,x in enumerate(a):
...     print('%d : %d' % (i,x))
... 
0 : a
1 : b
2 : c

Sie können so etwas tun.

Peinlicherweise habe ich es bis heute nicht verwendet, aber ich fand es sehr nützlich, wenn ich den Index und das Element gleichzeitig abrufen möchte (in einem Fall wie diesem).

Last but not least ist der Rechner, der PRN berechnen kann, Amazon List AE% E5% 87% BA% E6% 9D% A5% E3% 82% 8Bhp% E9% 9B% BB% E5% 8D% 93 / lm / R2KBMLT0XMHPJ2)

Ich will ... nicht wahr?

Recommended Posts

Versuchen Sie, RPN mit Python zu berechnen (für Anfänger)
Versuchen Sie, Trace in Python zu berechnen
Berechnen wir das statistische Problem mit Python
~ Tipps für Python-Anfänger mit Liebe von Pythonista ③ ~
Führen Sie unittest in Python aus (für Anfänger)
Versuchen Sie, sich mit Python bei qiita anzumelden
[Für Anfänger] Versuchen Sie Web Scraping mit Python
Memo Nr. 4, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
Der schnellste Weg für Anfänger, um Python zu beherrschen
Erste Schritte zum Testen von Google CloudVision in Python
Versuchen Sie, Oni Mai Tsuji Miserable mit Python zu implementieren
3,14 π Tag, versuchen Sie also, in Python auszugeben
Versuchen Sie automatisch, Enum in Python 3.6 automatisch zu bewerten
Python für Super-Anfänger Super-Anfänger Python # Einfach loszuwerden
Memo Nr. 1, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
Python Lehrbuch für Anfänger
Versuchen Sie gRPC in Python
Memo Nr. 2, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
Probieren Sie 9 Slices in Python aus
Memo Nr. 7, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
Einführung in die Programmierung (Python) TA Tendenz für Anfänger
Memo Nr. 6 für Python-Anfänger zum Lesen von "Detaillierte Erklärung der Python-Grammatik"
Wie man Python für Anfänger schneller macht [numpy]
OpenCV für Python-Anfänger
Memo Nr. 5, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
[Einführung für Anfänger] Umgang mit MySQL mit Python
[Für Anfänger] Einführung in die Vektorisierung beim maschinellen Lernen
Einführung in die Graph Database Neo4j in Python für Anfänger (für Mac OS X)
Grundlegende Geschichte der Vererbung in Python (für Anfänger)
Datenanalyse in Python Zusammenfassung der Quellen, die Anfänger zuerst betrachten sollten
Janken Poi in Python für Anfänger (Antworten und Erklärungen)
Ein Tool zum Erstellen von Maskenbildern für ETC in Python
Python-Anfänger versucht, dem Administrator von Django eine grundlegende Authentifizierung hinzuzufügen
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
So konvertieren Sie den Python # -Typ für Super-Anfänger von Python: str
[Für Anfänger] So studieren Sie den Python3-Datenanalysetest
Versuchen Sie, Ihr eigenes Intro-Quiz mit Python zu verbessern
So führen Sie Python im virtuellen Raum aus (für MacOS)
Versuchen Sie, in Python nach einem Profil mit einer Million Zeichen zu suchen
[Für Anfänger] Lernen Sie in 5 Stunden kostenlos die grundlegende Python-Grammatik!
Python # So überprüfen Sie Typ und Typ für Super-Anfänger
Berechnen Sie mW <-> dBm in Python
So löschen Sie stdout in Python
Lernablauf für Python-Anfänger
Versuchen Sie, Python selbst zu verstehen
Melden Sie sich auf der Website in Python an
Techniken zum Sortieren in Python
Versuchen Sie LINE Notify mit Python
Python #Funktion 2 für Super-Anfänger
Sprechen mit Python [Text zu Sprache]
Lassen Sie uns Yuma in Python 3 implementieren
Grundlegende Python-Grammatik für Anfänger
100 Pandas klopfen für Python-Anfänger
Python #Funktion 1 für Super-Anfänger
Wie man in Python entwickelt
Python #Liste für Super-Anfänger
Einführung in Python For, While
Über "für _ in range ():" von Python