Trình tạo câu ngẫu nhiên


8

Viết chương trình ngắn nhất bạn có thể bằng bất kỳ ngôn ngữ nào đọc ngữ pháp không ngữ cảnh và số lượng câu cần tạo stdinvà tạo ra nhiều câu ngẫu nhiên từ ngữ pháp.

Đầu vào

Đầu vào sẽ có định dạng sau:

n <START>
{"<A>":["as<A>df","0<A>","<B><C>","A<A>", ...], "<B>":["1<C>1","\<<T>>",...], ...}

nlà số câu cần tạo. <START>là định danh của biểu tượng nonterminal bắt đầu.

Ngữ pháp được đặt trong {} và được định dạng như sau:

  • Các quy tắc có hình thức "<S>":[productions]. <S>là định danh của nonterminal.
    • Các quy tắc được phân định bằng dấu phẩy.
    • Phía bên phải của quy tắc là một chuỗi trích dẫn kép có các ký tự đầu tiên và cuối cùng lần lượt là "<" và ">". Ký tự còn lại phải ở trong [A-Z](chữ in hoa alpha).
  • productionslà một danh sách được phân tách bằng dấu phẩy của các chuỗi trích dẫn kép, đại diện cho sản phẩm. Tất cả các ký tự, bao gồm cả khoảng trắng, trong quy tắc là các ký hiệu đầu cuối, ngoại trừ các ký tự được đặt trong dấu ngoặc nhọn ( "<"">"), là các ký hiệu không đầu cuối và sẽ là phía bên trái của quy tắc khác. Một khung góc mở có thể được thoát, nhưng không cần phải thoát khỏi một khung góc đóng.
    • Sản xuất sẽ không chứa dòng mới hoặc trình tự thoát dòng mới.

Đầu ra

Bạn nên in từng câu được tạo ra stdoutvới một dòng mới.

Các trường hợp kiểm tra
5 bộ dấu ngoặc đơn cân bằng:

5 <S>
{"<S>":["<S><S>", "(<S>)", ""]}

Kết quả ví dụ:

(())()
()
()()()

(())(()())((((()))()()))

4 biểu thức số học postfix (lưu ý khoảng trắng trong chuỗi là đáng kể, khoảng trắng ở nơi khác thì không):

4 <S>
{"<S>":["<N>", "<S> <S> <O>"], "<O>":["+","-","*","/"], "<N>":["<D><N>", "<D>"],
 "<D>":["1","2","3","4","5","6","7","8","9","0"]}

Kết quả ví dụ:

1535235 76451 +
973812
312 734 99 3 + / *
1 1 1 1 1 + - * +

2
Chúng tôi có thể có một số mẫu đầu vào / đầu ra? (Tôi biết đầu ra chính xác sẽ khác nhau trong mọi trường hợp, nhưng chỉ để tham khảo).
Dogbert

Thử thách tốt, nhưng tôi nghĩ định dạng đầu vào phức tạp hơn mức có thể. Ngoài ra, xem cách định dạng đầu vào dường như chủ yếu dựa trên JSON, sẽ không mang lại cho JavaScript và các ngôn ngữ có phân tích cú pháp JSON tích hợp. Ngoài ra, dấu gạch chéo ngược trong dấu \<<T>>hiệu gì?
Joey Adams

1
Dấu gạch chéo ngược thoát khỏi dấu ngoặc mở, vì vậy nếu T tạo ra "1", thì mẫu \<<T>>đó sẽ tạo ra \<1>, nó sẽ tạo ra một <1>đầu ra cuối cùng. Đúng, các ngôn ngữ có hỗ trợ JSON sẽ có một lợi thế nhỏ, (mặc dù các dấu ngoặc góc thoát sẽ ném cờ lê vào đó), nhưng ít nhất nó sẽ san bằng sân chơi cho những ngôn ngữ không được đặt tên là "Perl".
Hoa Long Tâm

Các quy tắc và ví dụ dường như không hoàn toàn nhất quán về số lượng khoảng trắng trong đầu vào.
Peter Taylor

@Peter: Khoảng trắng bên ngoài chuỗi là không đáng kể; khoảng trắng trong chuỗi là.
Hoa Long Tâm

Câu trả lời:


4

Tôi cảm thấy như làm một chút JavaScript. Ngoài ra, tôi đã khóc một chút ở bên trong khi tôi viết "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>

Đầu vào:

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

Đầu ra:

ccaaceeeeezeeeeedbbdd
accccceeeezeeeedddddb
aecezedeb
eaezebe
ccccaacezedbbdddd
eeeaaaceecacezedbdeedbbbeee
acaecaeaaeacccceeeeeeeaeeezeeebeeeeeeeddddbebbebdebdb
aaceezeedbb
aacezedbb
ceeaceecacaacezedbbdbdeedbeed

Tôi nghĩ bạn có thể rút ngắn điều này một chút bằng cách viết d=document;và sử dụng lại giá trị sau đó. Ngoài ra, bạn có thể muốn cung cấp số lượng nhân vật.
Element118
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.