Befunge - 37 x 5 = 185 38 x 3 = 114 caractères
Ceci est limité aux nombres entiers car Befunge n'a pas de support en virgule flottante.
&v /& _ #`&# "-"$# -#< v
>~:0`!#v_:" "`! #v_:","`#^_"*"`#v_&*>
^ ># $ .# @#< >&+
Explication
La plus grande caractéristique distinctive de Befunge est qu'au lieu d'être un ensemble linéaire d'instructions comme la plupart des langues; c'est une grille 2D d'instructions à caractère unique, où le contrôle peut circuler dans n'importe quelle direction.
Le premier &
saisit simplement le premier nombre. Le v
, >
puis rediriger le contrôle vers le chemin principal sur la deuxième ligne.
~:0`!#v_
Cela entre un caractère ( ~
), le duplique ( :
), pousse zéro sur la pile ( 0
), fait apparaître les deux premiers éléments et détermine si le second est supérieur au premier ( `
je suis surpris que vous ne puissiez pas utiliser `` `pour obtenir code backticks. ), inverse la véracité de l'élément supérieur ( !
), puis va à droite s'il est nul, vers le bas sinon ( #v_
).
Fondamentalement, il vérifie si l'entrée ne -1
représente plus d'entrée.
># $ .# @
Si l'entrée était -1
alors la valeur d'entrée dupliquée est supprimée ( $
), le haut de la pile est sorti sous forme d'entier ( .
) et le programme est arrêté ( @
).
:" "`! #v_
Sinon, un processus similaire est répété pour déterminer si l'entrée est inférieure ou égale à un espace. S'il s'agit d'un espace, le contrôle descend, sinon le contrôle se dirige vers la droite.
^ ># $ .# @#<
S'il s'agit d'un espace, il est redirigé vers la gauche ( <
); le programme halt ( @
), output ( .
) et redirection droite ( >
) sont tous ignorés en utilisant #
; mais le rejet est exécuté pour supprimer l'espace de la pile. Enfin, il est redirigé vers le haut pour commencer la prochaine exécution ( ^
).
:","`#^_
Si ce n'était pas un espace, le même processus est utilisé pour se diviser s'il est dans [+, *]
ou en [-, \]
allant à droite et en haut respectivement.
>~ "*"`#v_&*>
^ >&+
Car [+, *]
il est de nouveau divisé pour déterminer s'il s'agit d'un +
ou d'un *
. S'il +
est dirigé vers le bas, le nombre suivant est input ( &
) et ils sont ajoutés ( +
), le contrôle se retourne et est redirigé vers le chemin principal pour le caractère suivant. Si *
alors il entre ( &
) et multiplie ( *
), il s'enroule directement.
/& _ #`&# "-"$# -#<
Car [-, \]
cela commence à droite en direction de gauche. Les #
sautent le caractère après eux pour que le chemin initial soit "-"`_
qui détermine simplement si c'est -
ou /
. Si c'est le cas, il /
continue à gauche pour entrer ( &
) et diviser ( /
). Si c'est le cas, il se -
dirige vers la droite, en ignorant à nouveau les caractères afin qu'il s'exécute, &"-"$-
ce qui entraîne l'entrée du nombre ( &
), le -
caractère étant poussé sur la pile, puis rejeté ( "-"$
) et la soustraction calculée ( -
). Le contrôle est ensuite redirigé vers le chemin principal.