Napisz program, który przyjmuje ciąg nieparzystej długości zawierający tylko znaki .
i :
. Za pomocą początkowo pustego stosu wygeneruj liczbę z tego ciągu w następujący sposób:
Dla każdego znaku c w ciągu (od lewej do prawej) ...
- Jeśli c jest,
.
a stos zawiera mniej niż 2 elementy, wciśnij 1 na stosie. - Jeśli c jest,
.
a stos zawiera 2 lub więcej elementów, usuń dwie górne wartości ze stosu i wypchnij ich sumę na stos. - Jeśli c jest,
:
a stos zawiera mniej niż 2 elementy, wciśnij 2 na stosie. - Jeśli c jest,
:
a stos zawiera 2 lub więcej elementów, usuń dwie najwyższe wartości ze stosu i wepchnij ich produkt na stos.
Wynikowa liczba to wartość na górze stosu. Twój program powinien wydrukować ten numer na standardowe wyjście (z opcjonalnym końcowym znakiem nowej linii).
(Mała analiza pokazuje, że pozostała tylko jedna liczba, chyba że łańcuch ma równą długość, dlatego je ignorujemy. W rzeczywistości stos nigdy nie ma więcej niż 2 elementy.)
Na przykład liczba ::...:.:.
to 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
Jako kontrolę poczytalności, oto liczby dla wszystkich ciągów długości 1, 3 i 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
Najkrótszy program w bajtach wygrywa. Tiebreaker jest wcześniejszym postem.
- Możesz założyć, że dane wejściowe są zawsze prawidłowe, tzn. Ciąg zawierający tylko
.
i:
którego długość jest nieparzysta. - Zamiast pisać program, możesz napisać funkcję, która pobiera prawidłowy ciąg i wypisuje lub zwraca wygenerowaną liczbę.