コンテキストフリーの文法stdin
と生成する文の数を読み取り、文法からその数のランダムな文を生成する任意の言語でできる限り短いプログラムを記述します。
入力
入力は次の形式になります。
n <START>
{"<A>":["as<A>df","0<A>","<B><C>","A<A>", ...], "<B>":["1<C>1","\<<T>>",...], ...}
n
生成する文の数です。 <START>
開始の非終端記号の識別子です。
文法は{}で囲まれ、次のようにフォーマットされます。
- ルールは次の形式
"<S>":[productions]
です。<S>
非端末の識別子です。- ルールはコンマで区切られます。
- ルールの右側は、二重引用符で囲まれた文字列で、最初と最後の文字はそれぞれ「<」と「>」です。残りの文字は
[A-Z]
(大文字のアルファ)である必要があります。
productions
プロダクションを表す、二重引用符で囲まれた文字列のカンマ区切りのリストです。ルールを構成する空白文字を含むすべての文字は、終端記号です。ただし、山かっこ("<"
と">"
)で囲まれている文字は、非終端記号であり、別のルールの左側になります。開き山かっこはエスケープできますが、終わり山かっこをエスケープする必要はありません。- プロダクションには、改行または改行エスケープシーケンスは含まれません。
出力
生成された各文をstdout
末尾に改行を付けて印刷する必要があります。
テストケース
5組の括弧の組み合わせ:
5 <S>
{"<S>":["<S><S>", "(<S>)", ""]}
結果の例:
(())()
()
()()()
(())(()())((((()))()()))
4後置算術式(文字列内の空白は重要であり、他の場所では空白は重要ではないことに注意してください):
4 <S>
{"<S>":["<N>", "<S> <S> <O>"], "<O>":["+","-","*","/"], "<N>":["<D><N>", "<D>"],
"<D>":["1","2","3","4","5","6","7","8","9","0"]}
結果の例:
1535235 76451 +
973812
312 734 99 3 + / *
1 1 1 1 1 + - * +
2
サンプルの入出力がありますか?(正確な出力はすべての場合で異なりますが、参考のためです)。
—
Dogbert、2011
良い挑戦ですが、入力フォーマットは想像以上に複雑だと思います。また、入力形式が主にJSONに基づいているように見えても、JavaScriptおよび言語に組み込みのJSON解析機能が不当な利点をもたらすことにはなりません。また、バックスラッシュは何を
—
Joey Adams、
\<<T>>
示していますか?
バックスラッシュは開き角括弧をエスケープするため、Tが "1"を生成した場合、パターン
—
Hoa Long Tam、
\<<T>>
はを生成し、最終出力として\<1>
を生成し<1>
ます。はい、JSONをサポートする言語には多少の利点があります(ただし、エスケープされた山かっこでレンチを使用する必要があります)が、少なくとも "Perl"という名前のない言語の場合は、平等になります。
ルールと例は、入力の空白の量に関して完全に一貫しているようには見えません。
—
Peter Taylor
@ピーター:文字列の外側の空白は重要ではありません。文字列内の空白です。
—
ホアロングタム