Scrivi un programma che accetta una stringa di lunghezza dispari contenente solo i caratteri .
e :
. Con l'aiuto di uno stack inizialmente vuoto , generare un numero da questa stringa come segue:
Per ogni carattere c nella stringa (che va da sinistra a destra) ...
- Se c è
.
e la pila ha meno di 2 elementi, premi 1 sulla pila. - Se c è
.
e la pila ha 2 o più elementi, fai uscire i due valori più alti dalla pila e metti la loro somma sulla pila. - Se c è
:
e la pila ha meno di 2 elementi, premi 2 sulla pila. - Se c è
:
e la pila ha 2 o più elementi, fai uscire i due valori più alti dalla pila e spingi il loro prodotto sulla pila.
Il numero risultante è il valore nella parte superiore della pila. Il tuo programma dovrebbe stampare questo numero su stdout (con una nuova riga finale opzionale).
(Una piccola analisi mostra che è rimasto solo un numero a meno che la stringa non abbia una lunghezza pari, motivo per cui li stiamo ignorando. In effetti, lo stack non ha mai più di 2 elementi.)
Ad esempio, il numero per ::...:.:.
è 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
Come controllo di integrità, ecco i numeri per tutte le stringhe di lunghezza 1, 3 e 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
Vince il programma più breve in byte. Tiebreaker è post precedente.
- Si può presumere che l'input sia sempre valido, ovvero una stringa contenente solo
.
e la:
cui lunghezza è dispari. - Invece di scrivere un programma, è possibile scrivere una funzione che accetta una stringa valida e stampa o restituisce il numero generato.