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.
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)
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
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