Essayez de calculer RPN avec Python (pour les débutants)

introduction

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.

Qu'est-ce que la notation polonaise inversée en premier lieu?

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)

En fait, écrire en Python

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

en conclusion

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

Essayez de calculer RPN avec Python (pour les débutants)
Essayez de calculer Trace en Python
Calculons en fait le problème statistique avec Python
~ Conseils pour les débutants de Python présentés avec amour par Pythonista ③ ~
Exécutez unittest en Python (pour les débutants)
Essayez de vous connecter à qiita avec Python
[Pour les débutants] Essayez le web scraping avec Python
Mémo n ° 4 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Le moyen le plus rapide pour les débutants de maîtriser Python
Premiers pas pour essayer Google CloudVision en Python
Essayez d'implémenter Oni Mai Tsuji Miserable avec python
3.14 π jour, alors essayez de sortir en Python
Essayez auto pour évaluer automatiquement Enum dans Python 3.6
Python pour les super débutants Super débutants Python # Facile à éliminer
Mémo n ° 1 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Manuel python pour les débutants
Essayez gRPC en Python
Mémo n ° 2 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Essayez 9 tranches en Python
Mémo n ° 7 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Introduction à la programmation (Python) TA Tendency pour les débutants
Mémo n ° 6 pour les débutants Python à lire "Explication détaillée de la grammaire Python"
Comment rendre le Python des débutants plus rapide [numpy]
OpenCV pour les débutants en Python
Mémo n ° 5 que les débutants Python lisent "Explication détaillée de la grammaire Python"
[Introduction pour les débutants] Manipuler MySQL avec Python
[Pour les débutants] Introduction à la vectorisation dans l'apprentissage automatique
Introduction à la base de données Graph Neo4j en Python pour les débutants (pour Mac OS X)
Histoire de base de l'héritage en Python (pour les débutants)
Analyse des données en Python Résumé des sources que les débutants devraient d'abord consulter
Janken Poi en Python pour les débutants (réponses et explications)
Un outil pour créer des images de masque pour ETC en Python
python débutant essaie d'ajouter une authentification de base à l'administrateur de Django
Essayez de créer un module Python en langage C
Comment convertir le type Python # pour les super débutants de Python: str
[Pour les débutants] Comment étudier le test d'analyse de données Python3
Essayez d'améliorer votre propre quiz d'introduction avec Python
Comment exécuter python dans l'espace virtuel (pour MacOS)
Essayez de rechercher un profil d'un million de caractères en Python
[Pour les débutants] Apprenez la grammaire de base Python gratuitement en 5 heures!
Python # Comment vérifier le type et le type pour les super débutants
Calculer mW <-> dBm en Python
Pour vider stdout en Python
Flux d'apprentissage pour les débutants en Python
Essayez de comprendre Python soi
Connectez-vous au site Web en Python
Techniques de tri en Python
Essayez LINE Notify avec Python
Python #function 2 pour les super débutants
Parler avec Python [synthèse vocale]
Implémentons Yuma dans Python 3
Grammaire de base Python pour les débutants
Pandas 100 coups pour les débutants en Python
Python #function 1 pour les super débutants
Comment développer en Python
#List Python pour les super débutants
Introduction à Python pour, pendant
À propos de "for _ in range ():" de python