Na linguagem de programação esotérica Curly, os programas consistem apenas de chaves {}
e ponto e vírgula ;
. Apesar desse humilde conjunto de ferramentas, o Curly possui literais que podem representar qualquer número inteiro não negativo. No entanto, o formato é um pouco difícil para os não iniciados, então vamos escrever um código para fazer a conversão para nós.
Formato dos números
Os números encaracolados são estruturados de acordo com as seguintes regras:
- Adicionar um ponto e vírgula adiciona um ao número.
- Um número entre chaves é multiplicado por quatro.
- Os grupos de chaves podem ser aninhados, mas não concatenados. O aparelho deve corresponder corretamente.
- Ponto e vírgula fora de um conjunto de chaves deve vir depois, não antes.
- Para evitar ambiguidade na análise, um número deve sempre começar com uma chave.
Alguns exemplos:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Observe que a regra 5 significa que os números de 0 a 3 devem começar com um par vazio de chaves.)
E alguns exemplos inválidos:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Aqui está uma gramática BNF para números encaracolados:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Números como {;;;;}
(mais de três pontos e vírgulas seguidas) ou {{};}
(grupos de chaves vazias desnecessários) são chamados de números Curly incorretos . Eles obedecem à gramática acima e podem ser avaliados da maneira usual, mas também são capazes de representações mais curtas (para os exemplos acima {{;}}
e {;}
respectivamente).
O desafio
Escreva um programa ou função que insira / receba uma string. Se a string for um número inteiro decimal não negativo, produza / retorne a representação Curly apropriada (ou seja, a mais curta possível) para esse número inteiro. Se a sequência for um número Curly, produza / retorne sua representação decimal.
A entrada pode ser recebida via STDIN, argumento de linha de comando ou parâmetro de função. Ele deve ser uma string; ou seja, você não pode escrever uma função que aceite seqüências de caracteres para números encaracolados, mas números inteiros para números decimais.
A saída pode ser impressa em STDOUT ou retornada da função. Uma função pode retornar um número inteiro quando apropriado ou retornar seqüências de caracteres em todas as situações.
Seu programa não tem que lidar com má entrada (números Curly que quebram as regras de formatação, números de ponto flutuante, inteiros negativos, texto aleatório), e é não necessário para lidar com números Curly impróprias (mas veja abaixo). A entrada consistirá apenas em caracteres ASCII imprimíveis.
Pontuação
O código mais curto em bytes vence. Se o seu programa pode fazer ambos do seguinte:
- lidar corretamente com números Curly incorretos e
- quando receber um número encaracolado, ignore os caracteres extras que não sejam
{};
subtraia 10% da sua pontuação. (A entrada inteira nunca terá caracteres estranhos, mesmo para o bônus.)
Casos de teste
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Para o bônus:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Nota: O Curly ainda não está implementado. Mas se essa pergunta for bem, posso desenvolvê-la ainda mais.