Écrivez un programme qui accepte une chaîne de longueur impaire contenant uniquement les caractères .
et :
. À l'aide d'une pile initialement vide , générez un nombre à partir de cette chaîne comme suit:
Pour chaque caractère c de la chaîne (de gauche à droite) ...
- Si c est
.
et que la pile contient moins de 2 éléments, appuyez sur 1 sur la pile. - Si c est
.
et que la pile a 2 éléments ou plus, sortez les deux premières valeurs de la pile et poussez leur somme sur la pile. - Si c est
:
et que la pile contient moins de 2 éléments, appuyez sur 2 sur la pile. - Si c est
:
et que la pile contient 2 éléments ou plus, sortez les deux valeurs supérieures de la pile et poussez leur produit sur la pile.
Le nombre résultant est la valeur en haut de la pile. Votre programme doit imprimer ce numéro sur stdout (avec un retour à la ligne facultatif).
(Une petite analyse montre qu'il ne reste qu'un seul nombre, sauf si la chaîne a une longueur égale, c'est pourquoi nous les ignorons. En fait, la pile n'a jamais plus de 2 éléments.)
Par exemple, le nombre de ::...:.:.
est 9:
2 1 2 2 /______ stack just after the character below is handled
2 2 4 4 5 5 7 7 9 \
: : . . . : . : . <-- string, one character at a time
Pour vérifier la santé mentale, voici les numéros de toutes les chaînes de longueur 1, 3 et 5:
. 1
: 2
... 2
..: 1
.:. 3
.:: 2
:.. 3
:.: 2
::. 4
::: 4
..... 3
....: 2
...:. 4
...:: 4
..:.. 2
..:.: 1
..::. 3
..::: 2
.:... 4
.:..: 3
.:.:. 5
.:.:: 6
.::.. 3
.::.: 2
.:::. 4
.:::: 4
:.... 4
:...: 3
:..:. 5
:..:: 6
:.:.. 3
:.:.: 2
:.::. 4
:.::: 4
::... 5
::..: 4
::.:. 6
::.:: 8
:::.. 5
:::.: 4
::::. 6
::::: 8
Le programme le plus court en octets gagne. Tiebreaker est un post antérieur.
- Vous pouvez supposer que l'entrée est toujours valide, c'est-à-dire une chaîne contenant uniquement
.
et:
dont la longueur est impaire. - Au lieu d'écrire un programme, vous pouvez écrire une fonction qui prend une chaîne valide et imprime ou renvoie le nombre généré.