Il est temps pour vous d'implémenter mon nouveau langage basé sur la pile! Cela s'appelle StackyMath. Ce sera un langage basé sur la pile avec 8 opérations sur la pile et des façons d'ajouter des numéros à la pile.
Liste des opérations:
/
: Division. Joué sur les 2 premiers numéros de la pile. Repousse le résultat sur la pile.*
: Multiplication. Joué sur les 2 premiers numéros de la pile. Repousse le résultat sur la pile-
: Soustraction. Joué sur les 2 premiers numéros de la pile. Repousse le résultat sur la pile+
: Une addition. Joué sur les 2 premiers numéros de la pile. Repousse le résultat sur la pile^
: Exponentiation. Joué sur les 2 premiers numéros de la pile. Repousse le résultat sur la pile%
: Modulo. Joué sur les 2 premiers numéros de la pile. Repousse le résultat sur la pile!
: Factorielle. Joué sur le numéro du haut de la pile. Repousse le résultat sur la pileD
: Dupliquer le premier numéro de la pile
Opérations définies en pseudo code:
/
:push(pop divided by pop)
*
:push(pop times pop)
-
:push(pop minus pop)
+
:push(pop plus pop)
^
:push(pop to the pop)
%
:push(pop mod pop)
!
:push(factorial pop)
D
:t = pop; push(t); push(t)
Comment envoyer des nombres à la pile:
Ajouter des numéros à la pile est facile, il suffit de mettre le numéro brut dans votre programme là où vous en avez besoin. Si vous devez mettre plusieurs nombres sur la pile, vous pouvez les séparer par une virgule ( ,
). Votre programme n'aura pas besoin de traiter les -
nombres en entrée. Si l'utilisateur en veut un, il doit pousser le nombre qu'il veut annuler, zéro et -
. Les nombres dans l'entrée du programme sont également limités à des nombres entiers positifs.
Contribution:
Votre programme doit prendre l'entrée sur la ligne de commande, ou à partir de std in. L'entrée sera uniquement composée de nombres (pas de notation scientifique ou décimales) délimités par ,
au besoin, et des opérations définies ci-dessus.
Production:
Votre programme doit imprimer le numéro en haut de la pile.
Cas d'erreur:
- Si le programme essaie de surcharger la pile, vous devez imprimer
StackUnderflowException!!!
. - Si vous avez une division par zéro, imprimez
DivisionByZeroException!!!
- Si un nombre qui dépasse 64 bits, lors de l'exécution du programme ou du traitement d'un nombre dans l'entrée, imprimez
NumberOverflowException!!!
- Si vous obtenez en quelque sorte un nombre négatif en haut de la pile et que vous devez faire une factorielle, imprimez
NegativeFactorialException!!!
- Si vous avez un nombre à virgule flottante sur les sommets de la pile et que l'opération suivante est factorielle, imprimez
FloatingFactorialException!!!
- Si aucun numéro ne se trouve sur la pile à la fin du programme (c'est-à-dire que le programme était vide) imprimer
EmptyProgram!!!
Remarques:
- Toutes les sorties d'erreur vers devraient avoir yo std err ou l'équivalent le plus proche.
- Tous les nombres sont limités à une virgule flottante 64 bits.
Exemples de programmes:
50,47* -> 2350
50,47/ -> 0.94
100,8! -> 40320
100D* -> 10000
! -> StackUnderflowException!!!
5,2/! -> FloatingFactorialException!!!
4,3!2*/ -> 3
654,489,48,43/5*7D+-*% -> 77.68749999999909
-> EmptyProgram!!!
(Je peux ajouter plus si nécessaire)
la source
!
enF
).654,489,48,43/5*7D+-*%
devrait revenir77.6875
. (43/48*5-(7+7)
devrait être(7+7)-43/48*5
)Réponses:
Rubis,
412410404392380377 caractèresIl s'agit d'une version de précision régulière utilisant
Float
. La précision du résultat est comme dans l'exemple de code, mais la détection de débordement numérique n'est pas exacte.Exemple d'exécution:
Rubis,
378377 caractèresIl s'agit d'une version de haute précision utilisant
Rational
. La précision du résultat n'est pas toujours la même que dans l'exemple de code, mais la détection de dépassement numérique est exacte.Exemple d'exécution:
la source
JavaScript (ES6), 430 octets
422 octets avec ES7 en passant
Math.pow(2,2)
à2**2
Explication
Utilise
eval
pour remplacer certaines phrases courantes. Non golfé et sans leeval
ça ressemble à ceci:la source
Math.pow(p(),p())
parp()**p()
.Groovy, 718 octets. Fore!
Peut aussi poster mon implémenté au golf. Rencontrez mon grand mur de code:
Non golfé:
Édition 1: économisez ~ 15 octets grâce à @Doorknob
Édition 2: supprimez ~ 130 octets avec quelques astuces supplémentaires
la source
for
/if
, etc.System.in.text
place deSystem.in.newReader().readLine()
..text
est gourmand et tant que les données sont dans le lecteur, il ne reviendra pas.Candy ,
298348392 octetsBien que Candy soit basée sur la pile, je ne suis pas sûr que cela ait vraiment aidé ...
Un peu formaté révèle un peu de structure:
Le calcul réel se produit sur les deux dernières lignes. Il y est entraîné par une table de saut sur la troisième ligne.
la source