Schreiben Sie das kürzeste Programm, das Sie können, in jeder Sprache, aus der eine kontextfreie Grammatik und die Anzahl der zu produzierenden Sätze gelesen werden stdin
, und generieren Sie so viele zufällige Sätze aus der Grammatik.
Eingang
Die Eingabe erfolgt im folgenden Format:
n <START>
{"<A>":["as<A>df","0<A>","<B><C>","A<A>", ...], "<B>":["1<C>1","\<<T>>",...], ...}
n
ist die Anzahl der zu generierenden Sätze. <START>
ist die Kennung des nicht terminalen Startsymbols.
Die Grammatik ist im {} enthalten und wie folgt formatiert:
- Regeln haben die Form
"<S>":[productions]
.<S>
ist die Kennung des Nichtterminals.- Regeln werden durch Kommas getrennt.
- Die rechte Seite einer Regel ist eine Zeichenfolge in doppelten Anführungszeichen, deren erstes und letztes Zeichen "<" bzw. ">" sind. Das verbleibende Zeichen sollte in
[A-Z]
(Alpha in Großbuchstaben) sein.
productions
ist eine durch Kommas getrennte Liste von Zeichenfolgen in doppelten Anführungszeichen, die Produktionen darstellen. Alle Zeichen, einschließlich Leerzeichen, in der Regel sind Terminalsymbole, mit Ausnahme derjenigen, die in spitzen Klammern ("<"
und">"
) eingeschlossen sind. Dies sind nicht-Terminalsymbole und befinden sich auf der linken Seite einer anderen Regel. Eine offene Winkelhalterung kann ausgeblendet werden, es ist jedoch nicht erforderlich, einer geschlossenen Winkelhalterung zu entkommen.- Produktionen enthalten keine Zeilenumbrüche oder die Zeilenumbruchsequenz.
Ausgabe
Sie sollten jeden generierten Satz stdout
mit einem nachgestellten Zeilenumbruch drucken.
Testfälle
5 Sätze ausgewogener Klammern:
5 <S>
{"<S>":["<S><S>", "(<S>)", ""]}
Beispielergebnis:
(())()
()
()()()
(())(()())((((()))()()))
4 postfix arithmetische Ausdrücke (beachten Sie, dass Leerzeichen innerhalb von Zeichenfolgen von Bedeutung sind, Leerzeichen an anderer Stelle nicht):
4 <S>
{"<S>":["<N>", "<S> <S> <O>"], "<O>":["+","-","*","/"], "<N>":["<D><N>", "<D>"],
"<D>":["1","2","3","4","5","6","7","8","9","0"]}
Beispielergebnis:
1535235 76451 +
973812
312 734 99 3 + / *
1 1 1 1 1 + - * +
\<<T>>
an?
\<<T>>
erzeugt \<1>
, würde das Muster erzeugen , was a <1>
als endgültige Ausgabe erzeugen würde . Ja, Sprachen mit JSON-Unterstützung hätten einen kleinen Vorteil (obwohl die eckigen Klammern einen Schraubenschlüssel hineinwerfen sollten), aber dies gleicht zumindest die Wettbewerbsbedingungen für Sprachen aus, die nicht "Perl" heißen.