Escreva um programa que tenha uma sequência de comprimento ímpar contendo apenas os caracteres .
e :
. Com o auxílio de uma pilha inicialmente vazia , gere um número a partir desta sequência da seguinte maneira:
Para cada caractere c na string (da esquerda para a direita) ...
- Se c for
.
e a pilha tiver menos de 2 elementos, pressione 1 na pilha. - Se c for
.
e a pilha tiver 2 ou mais elementos, retire os dois principais valores da pilha e empurre sua soma para a pilha. - Se c for
:
e a pilha tiver menos de 2 elementos, pressione 2 na pilha. - Se c for
:
e a pilha tiver 2 ou mais elementos, retire os dois principais valores da pilha e empurre o produto para a pilha.
O número resultante é o valor no topo da pilha. Seu programa deve imprimir esse número em stdout (com uma nova linha à direita opcional).
(Uma pequena análise mostra que resta apenas um número, a menos que a string tenha um comprimento uniforme, e é por isso que estamos ignorando-os. Na verdade, a pilha nunca possui mais de 2 elementos.)
Por exemplo, o número para ::...:.:.
é 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
Como verificação de integridade, eis os números para todas as cadeias de comprimento 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
O programa mais curto em bytes vence. O desempatador é um post anterior.
- Você pode assumir que a entrada é sempre válida, ou seja, uma string contendo apenas
.
e:
cujo comprimento é ímpar. - Em vez de escrever um programa, você pode escrever uma função que recebe uma sequência válida e imprime ou retorna o número gerado.