Напишите программу, которая принимает строку нечетной длины, содержащую только символы .
и :
. С помощью изначально пустого стека сгенерируйте число из этой строки следующим образом:
Для каждого символа c в строке (идущего слева направо) ...
- Если c есть,
.
а в стеке менее 2 элементов, нажмите 1 в стеке. - Если с есть
.
и стек имеет 2 или более элементов, поп два значения из стека и подтолкнуть их сумму на стек. - Если c есть,
:
а в стеке менее 2 элементов, нажмите 2 в стеке. - Если с это
:
и стек имеет 2 или более элементов, поп два значения из стека и толкать их продукт в стек.
Полученное число является значением в верхней части стека. Ваша программа должна напечатать этот номер на стандартный вывод (с дополнительным завершающим переводом строки).
(Небольшой анализ показывает, что остается только одно число, если строка не имеет четной длины, поэтому мы игнорируем их. На самом деле в стеке никогда не бывает более 2 элементов.)
Например, число для ::...:.:.
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 - более ранний пост.
- Вы можете предполагать, что ввод всегда действителен, то есть строка, содержащая только
.
и:
длина которой нечетна. - Вместо написания программы вы можете написать функцию, которая принимает допустимую строку и печатает или возвращает сгенерированное число.