Pyth é uma linguagem de golfe baseada em Python. Ele usa notação de prefixo, com cada comando tendo uma aridade diferente (número de argumentos que aceita).
Sua tarefa é escrever um verificador de sintaxe para uma linguagem do tipo Pyth (inexistente), Pith.
Sintaxe da medula
O Pith possui apenas 8 comandos de caractere único:
01234()"
01234
cada um tem uma aridade do número correspondente e, portanto, espera muitos argumentos depois dele. Por exemplo,
400010
é um programa Pith correto porque 4
é seguido por quatro argumentos 0
0
0
e 10
, o último dos quais é 1
seguido pelo argumento único 0
. Para visualizar isso, podemos olhar para a seguinte árvore:
R
|
4
|
-------------
| | | |
0 0 0 1
|
0
onde R
é o nó raiz. Uma maneira alternativa de pensar sobre isso é que cada número se refere ao número de filhos que o nó correspondente possui na árvore acima.
Aqui está outro programa Pith válido, com mais de um comando base:
210010
correspondente a
R
|
-------------
| |
2 1
| |
--------- 0
| |
1 0
|
0
Por outro lado,
3120102100
não é um programa Pith correto, porque a inicial 3
possui apenas dois argumentos, que podemos ver observando a árvore abaixo:
R
|
3
|
------------------------ ??
| |
1 2
| |
2 ------
| | |
------ 1 0
| | |
0 1 0
|
0
Em seguida, (
inicia um ilimitado e )
termina um ilimitado. Um ilimitado recebe qualquer número de argumentos (avidamente) e conta como um único argumento para qualquer comando pai. Quaisquer limites ainda abertos até o final do programa são fechados automaticamente. Um )
comando não é um erro se não houver limites ilimitados - ele simplesmente não faz nada. *
Por exemplo, o programa Pith
)31(0)0(201000100
corresponde à árvore
R
|
3
|
------------------------------
| | |
1 0 (
| |
( -----------------------------
| | | | | |
0 2 0 0 1 0
| |
------- 0
| |
0 1
|
0
Os limites ilimitados são ()
válidos , assim como um programa Pith válido.
Um programa Pith inválido com um limite é
12(010
já que o 2
único recebe um argumento (o ilimitado).
Finalmente, "
inicia e termina uma string, que é sempre 0 arity e conta como um único argumento, por exemplo
2"010""44)()4"
que é apenas uma 2
passagem de dois argumentos de string "010"
e "44)()4"
. Como sem limites, as seqüências de caracteres também podem estar vazias, e quaisquer seqüências de caracteres não fechadas no final do programa são fechadas automaticamente.
* Esta parte é diferente do Pyth original, que realmente faz algo em um caso como 1)
, encerrando a aridade 1 e gerando um erro.
Entrada / saída
A entrada será uma única seqüência de caracteres não vazia que consiste apenas nos caracteres 01234()"
. Opcionalmente, você pode assumir que uma nova linha à direita adicional esteja sempre presente. Você pode escrever uma função ou um programa completo para esse desafio.
Você deve gerar um valor verdadeiro se a entrada for Pith sintaticamente válida ou um valor falso, caso contrário. Os valores de verdade e falsidade devem ser fixos, para que você não possa produzir 1
para um programa válido e 2
para outro.
Pontuação
Isso é código-golfe, então o código com o menor número de bytes vence.
Casos de teste
Verdade:
0
)
(
"
()
""
10
400010
210010
("")00
3"""""
(0)))0)1)0
2(2(2(0)0)0)0
2"010""44)()4"
)31(0)0(201000100
())2)1))0"3())"))
3("4321("301(0)21100"4")"123"00)40"121"31000""01010
Falsy:
1
1(310
(1)0)
12(010
4"00010"
3120102100
20(2((0)(0)))
2(2(2(0)0)0)01)
4(0102)00)00000
2"00"("00"2(""))
())2)1))0"3())"))
(o que deve ser verdade, eu acho).
()210""
com um monte de não-ops)
[( [2 [0] [1 [0] ] ] [0] [1 [0]] [0] ]
? O que você tem possui ramificações de 2, 0, 0, 1 e 0 - o segundo não deve estar lá.