Напишіть програму, яка містить рядок непарної довжини, що містить лише символи .
та :
. За допомогою спочатку порожнього стека генеруйте число з цього рядка наступним чином:
Для кожного символу c у рядку (йде зліва направо) ...
- Якщо c є,
.
а стек має менше 2 елементів, натисніть 1 на стеку. - Якщо c є,
.
а стек має 2 або більше елементів, висуньте два верхніх значення зі стека та натисніть їх суму на стек. - Якщо c є,
:
а стек має менше 2 елементів, натисніть 2 на стек. - Якщо c є,
:
а стек містить 2 або більше елементів, висуньте два верхніх значення зі стека та висуньте їх добуток на стек.
Отримане число - це значення у верхній частині стека. Ваша програма повинна надрукувати цей номер у stdout (з необов'язковим останнім рядком).
(Невеликий аналіз показує, що залишається лише одне число, якщо рядок не має рівну довжину, тому ми ігноруємо їх. Насправді, стек ніколи не має більше двох елементів.)
Наприклад, число для ::...:.:.
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
В якості перевірки обгрунтованості наведено номери для всіх рядків довжиною 1, 3 та 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
Виграє найкоротша програма в байтах. Tiebreaker - це раніше повідомлення.
- Ви можете припустити, що введення завжди дійсне, тобто рядок, що містить тільки
.
і:
довжина якої непарна. - Замість того, щоб писати програму, ви можете написати функцію, яка займає дійсний рядок і друкує або повертає згенероване число.