Escreva o programa mais curto possível em qualquer idioma que leia uma gramática livre de contexto e o número de frases a serem produzidas stdin
e gere muitas frases aleatórias a partir da gramática.
Entrada
A entrada virá no seguinte formato:
n <START>
{"<A>":["as<A>df","0<A>","<B><C>","A<A>", ...], "<B>":["1<C>1","\<<T>>",...], ...}
n
é o número de frases a serem geradas. <START>
é o identificador do símbolo não terminal inicial.
A gramática está entre {} e está formatada da seguinte maneira:
- As regras são da forma
"<S>":[productions]
.<S>
é o identificador do não-terminal.- As regras são delimitadas por vírgulas.
- O lado direito de uma regra é uma sequência de aspas duplas cujos primeiro e último caracteres são "<" e ">", respectivamente. O caractere restante deve estar em
[A-Z]
(letra maiúscula alfa).
productions
é uma lista delimitada por vírgula de seqüências de caracteres com aspas duplas, representando produções. Todos os caracteres, incluindo o espaço em branco, na regra são símbolos terminais, exceto aqueles que estão entre colchetes angulares ("<"
e">"
), que são símbolos não terminais e serão o lado esquerdo de outra regra. Um suporte de ângulo aberto pode ser escapado, mas não há necessidade de escapar de um suporte de ângulo fechado.- As produções não conterão novas linhas ou a sequência de escape da nova linha.
Resultado
Você deve imprimir cada frase gerada stdout
com uma nova linha à direita.
Casos de teste
5 conjuntos de parênteses balanceados:
5 <S>
{"<S>":["<S><S>", "(<S>)", ""]}
Resultado de exemplo:
(())()
()
()()()
(())(()())((((()))()()))
4 expressões aritméticas postfix (observe que o espaço em branco nas cadeias é significativo, o espaço em outro lugar não é):
4 <S>
{"<S>":["<N>", "<S> <S> <O>"], "<O>":["+","-","*","/"], "<N>":["<D><N>", "<D>"],
"<D>":["1","2","3","4","5","6","7","8","9","0"]}
Resultado de exemplo:
1535235 76451 +
973812
312 734 99 3 + / *
1 1 1 1 1 + - * +
\<<T>>
indica?
\<<T>>
produziria \<1>
, o que produziria a <1>
como saída final. Sim, os idiomas com suporte a JSON teriam uma pequena vantagem (embora os colchetes angulares escapados devessem ser uma chave nisso), mas pelo menos nivela o campo de jogo para os idiomas não nomeados "Perl".