Escriba el programa más corto que pueda en cualquier idioma que lea una gramática libre de contexto y el número de oraciones para producir stdin
, y genere tantas oraciones aleatorias de la gramática.
Entrada
La entrada vendrá en el siguiente formato:
n <START>
{"<A>":["as<A>df","0<A>","<B><C>","A<A>", ...], "<B>":["1<C>1","\<<T>>",...], ...}
n
es el número de oraciones a generar. <START>
es el identificador del símbolo no terminal inicial.
La gramática está encerrada en {} y tiene el siguiente formato:
- Las reglas son de la forma
"<S>":[productions]
.<S>
es el identificador del no terminal.- Las reglas están delimitadas con comas.
- El lado derecho de una regla es una cadena entre comillas dobles cuyos primeros y últimos caracteres son "<" y ">", respectivamente. El carácter restante debe estar en
[A-Z]
(mayúscula alfa).
productions
es una lista delimitada por comas de cadenas entre comillas dobles, que representan producciones. Todos los caracteres, incluido el espacio en blanco, en la regla son símbolos terminales, excepto los que están encerrados entre paréntesis angulares ("<"
y">"
), que son símbolos no terminales y serán el lado izquierdo de otra regla. Se puede escapar un soporte de ángulo abierto, pero no hay necesidad de escapar de un soporte de ángulo cerrado.- Las producciones no contendrán nuevas líneas o la secuencia de escape de nueva línea.
Salida
Debe imprimir cada oración generada stdout
con una nueva línea final.
Casos de prueba
5 conjuntos de paréntesis equilibrados:
5 <S>
{"<S>":["<S><S>", "(<S>)", ""]}
Resultado de ejemplo:
(())()
()
()()()
(())(()())((((()))()()))
4 expresiones aritméticas postfix (tenga en cuenta que el espacio en blanco dentro de las cadenas es significativo, el espacio en blanco en otro lugar no lo es):
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 ejemplo:
1535235 76451 +
973812
312 734 99 3 + / *
1 1 1 1 1 + - * +
\<<T>>
?
\<<T>>
produciría \<1>
, lo que produciría a <1>
como salida final. Sí, los idiomas con soporte JSON tendrían una ligera ventaja (aunque los corchetes de escape deberían arrojar una llave en eso), pero al menos nivela el campo de juego para aquellos idiomas que no se llaman "Perl".