Après avoir résolu AOJ de différentes manières, j'ai abordé la "notation polonaise inversée" pour la première fois depuis longtemps. 0087:Strange Mathematical Expression Donc, après avoir examiné, j'ai écrit la notation polonaise inversée (RPN) en Python.
Quand je l'ai appris dans une classe universitaire, je me suis seulement dit: "Hé, je n'ai pas besoin d'écrire des parenthèses à chaque fois, et une fois que je m'y suis habitué, c'est facile à utiliser." Il semble compatible avec les ordinateurs simplement parce que vous n'avez pas à attendre tous les nombres et opérateurs que vous voulez calculer sans avoir à réfléchir sérieusement.
En outre, il semble être compatible avec les Japonais. Par exemple 「(1 + 3) * (9 - 2)」 Si vous écrivez l'expression mathématique familière (c'est ce qu'on appelle la notation d'introduction) en notation polonaise inversée 「1 3 + 9 2 - *」 Il peut être réécrit comme. Ça signifie "Additionnez 1 et 3, soustrayez 2 de 9 et multipliez-les." C'est pourquoi la traduction japonaise est faite.
C'est facile d'écrire avec Stack. ・ Si l'entrée est une valeur numérique, appuyez sur Empiler -Si l'entrée est un opérateur, saisissez la valeur numérique de l'argument de Stack et calculez, puis appuyez à nouveau sur la valeur de retour. Répétez simplement ceci.
Au fait, c'est un aparté, mais savez-vous pourquoi on l'appelle «notation polonaise (inversée)»? J'ai complètement mal compris qu'une telle méthode de description était courante en Pologne (hein?), Mais ce n'est pas le cas. On dit qu'il s'appelle parce que le savant logique Jan Ukasevich qui a initialement conçu cette méthode de description était un Polonais. Si tel est le cas, on pourrait l'appeler «notation Ukasevich», mais son nom Jan Łukasiewicz est venu à être appelé à peu près «notation polonaise» parce qu'il était difficile pour les Britanniques à l'époque de le prononcer. C'est vrai.
Il est ironique que la notation polonaise, qui a été conçue pour éliminer la notation des parenthèses qui indiquent la priorité, soit adoptée par Lisp, qui a la réputation d'avoir de nombreuses parenthèses.
[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):
'''
Une fonction qui calcule la notation polonaise inverse
'''
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
Lorsque je regardais certains sites après avoir examiné, de nombreuses personnes ont utilisé la fonction d'énumération pour l'implémentation, alors je l'ai imitée.
>>> a = ['a','b','c']
>>> for x in a:
... print(x)
...
a
b
c
Pour une liste comme
>>> a = ['a','b','c']
>>> for i,x in enumerate(a):
... print('%d : %d' % (i,x))
...
0 : a
1 : b
2 : c
Vous pouvez faire quelque chose comme ça.
Embarrassant, je ne l'ai pas utilisé jusqu'à aujourd'hui, mais je l'ai trouvé très utile lorsque je veux récupérer l'index et l'élément en même temps (dans un cas comme celui-ci).
Enfin, la calculatrice qui peut calculer le PRN est [Amazon List](https://www.amazon.co.jp/RPN%E8%A8%98%E6%B3%95%E3%81% Il a été résumé dans AE% E5% 87% BA% E6% 9D% A5% E3% 82% 8Bhp% E9% 9B% BB% E5% 8D% 93 / lm / R2KBMLT0XMHPJ2).
Je veux ... n'est-ce pas?
Recommended Posts