ランダムセンテンスジェネレーター


8

コンテキストフリーの文法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解析機能が不当な利点をもたらすことにはなりません。また、バックスラッシュは何を\<<T>>示していますか?
Joey Adams、

1
バックスラッシュは開き角括弧をエスケープするため、Tが "1"を生成した場合、パターン\<<T>>はを生成し、最終出力として\<1>を生成し<1>ます。はい、JSONをサポートする言語には多少の利点があります(ただし、エスケープされた山かっこでレンチを使用する必要があります)が、少なくとも "Perl"という名前のない言語の場合は、平等になります。
Hoa Long Tam、

ルールと例は、入力の空白の量に関して完全に一貫しているようには見えません。
Peter Taylor

@ピーター:文字列の外側の空白は重要ではありません。文字列内の空白です。
ホアロングタム

回答:


4

ちょっとJavaScriptをやる気がしました。また、「document.write」を書いたときに、内側が少し泣きました

<body>
    <script type='text/javascript'>
    function foo(){
        t=document.getElementById('ta').value.split("\n");
        eval('p='+t[1]);
        t[0]=t[0].split(' ');
        while(t[0][0]--) {
            s=t[0][1]
            while(x=s.match(/<\w+>/)) {
                ps=s;
                s=s.replace(x,p[x][Math.floor(Math.random()*p[x].length)]);
            }
            document.write(s+"<br>");
        }
    }
    </script>
    <textarea id='ta' cols='80'></textarea>
    <button onclick="foo()">go</button>
</body>

入力:

10 <A>
{"<A>":["a<A>b","c<A>d","<B>"],"<B>":["e<C>e"],"<C>":["z","<A>","<B>"]}

出力:

ccaaceeeeezeeeeedbbdd
accccceeeezeeeedddddb
aecezedeb
eaezebe
ccccaacezedbbdddd
eeeaaaceecacezedbdeedbbbeee
acaecaeaaeacccceeeeeeeaeeezeeebeeeeeeeddddbebbebdebdb
aaceezeedbb
aacezedbb
ceeaceecacaacezedbbdbdeedbeed

d=document;後で値を書き込んで再利用することで、これを少し短縮できると思います。また、文字数を指定することもできます。
Element118 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.