Trình tự phát triển Quine


18

Bạn phải viết một chuỗi gồm 10 chương trình p1 p2 ... p10thỏa mãn các thuộc tính sau:

  • pKin pK+1cho K1-9
  • p10 in p10
  • Khi các Kchương trình đầu tiên được nối, chương trình kết quả sẽ p1...pKin ra p1...pK.
  • Mỗi chương trình pKphải có kích thước byte lớn hơn chương trình trước pK-1.
  • Tất cả các chương trình phải trong cùng một ngôn ngữ.
  • Các hàm quining tích hợp (ví dụ: Qtrong nhiều ngôn ngữ) được cho phép.

Điểm của bạn là tổng số byte của 10 chương trình. Vì chỉ có mười chương trình, bạn phải làm cho mã của mình càng ngắn càng tốt. Chúc may mắn.


"Mỗi chương trình pK phải có kích thước byte lớn hơn chương trình pK-1 trước đó" - huh, tại sao yêu cầu kỳ lạ này?
nicael

6
@nicael Vì đó là một chuỗi quine đang phát triển .
Conor O'Brien

Tại sao p10 tự in mà không phải p11? Điều đó làm cho vấn đề khó khăn hơn một chút.
SuperJedi224

@ SuperJedi224 Vì đơn giản là không có p11.
Conor O'Brien

Thử thách này sẽ thú vị hơn rất nhiều nếu các chức năng khai thác tích hợp đã bị cấm.
Dennis

Câu trả lời:


15

Nghiêm túc, 245 byte:

Tất cả mười chương trình được nối lại:

Q9ucQc8<WX#dXεj0WX.Q9ucQc8<WX#dXεj0WX.
Q9ucQc8<WX#dXεj0WX.

Q9ucQc8<WX#dXεj0WX.


Q9ucQc8<WX#dXεj0WX.



Q9ucQc8<WX#dXεj0WX.




Q9ucQc8<WX#dXεj0WX.





Q9ucQc8<WX#dXεj0WX.






Q9ucQc8<WX#dXεj0WX.







Q9ucQc8<WX#dXεj0WX.









Có những ký tự vô hình trở nên hữu hình khi được thực thi, một thuộc tính lạ của byte 7F. Các dòng mới trên mỗi chương trình là rất quan trọng. Trong thực tế, Nghiêm túc tự động thêm các dòng mới vào đầu ra của nó cho dù bạn có muốn hay không. Điều này chỉ đếm số lượng dòng mới trong đầu ra, và ngay khi số đó vượt quá 8, nó sẽ xóa ký tự cuối cùng của đầu ra. Như vậy, p1..pKsẽ in p1..pKcho tất cả K> 4.

Q                                  Push source code.
 9uc                               Push \n
    Qc                             Push the number of times it appears in source code.
      8<                           Check if it appears more than 8 times.
        WX     0WX                 If so, run the included code.
          #dX                      Convert string to list, dequeue and discard a newline.
             εj                    Join list back into string.
                  .                Print and halt. (Invisible byte here.)

1
Hấp dẫn! Nó thực sự có thể.
Conor O'Brien

7
Tôi có thể giải thích leik wat mỗi char duz
Seadrus

3
Cần lưu ý rằng điều này sử dụng tính năng tích hợp sẵn Qđể đẩy mã nguồn của chương trình.
Martin Ender

(Và lưu ý thêm rằng tổng chiều dài sẽ ở đâu đó trong vùng lân cận dài hơn 150 byte mà không cần tích hợp sẵn.)
quintopia

Chức năng quining tích hợp được phép cho thử thách này.
Conor O'Brien

9

JavaScript (ES6), 985

function f(x){x<0||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(0);
 function f(x){x<1||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(1);
  function f(x){x<2||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(2);
   function f(x){x<3||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(3);
    function f(x){x<4||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(4);
     function f(x){x<5||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(5);
      function f(x){x<6||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(6);
       function f(x){x<7||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(7);
        function f(x){x<8||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(8);
         function f(x){x<9||x>8||f.a||x++;alert(f.a=' '.repeat(x)+`${f}f(${x});`.replace(/\d/,x))}f(9);

Tôi đã hiểu sai các quy tắc trước đó, vì vậy câu trả lời trước đây của tôi là không chính xác.

Cái này sử dụng chức năng cẩu thay vì cẩu thay đổi, vì vậy nó không phụ thuộc vào chương trình 10. Trên thực tế, tôi nghĩ rằng đó là một nguyên tắc cho bất kỳ sự kết hợp nào của hai hoặc nhiều chương trình được nối.

Tuyên bố miễn trừ trách nhiệm: bây giờ thực sự muộn, vì vậy mọi thứ ở trên có thể hoàn toàn sai.


Tôi không nghĩ bạn cần alertvì đầu ra chức năng.
Mama Fun Roll

Ồ tôi hiểu rồi, đừng bận tâm.
Mama Fun Roll

Bạn có thể lấy ra dấu chấm phẩy, tiết kiệm cho bạn 20 byte. (Đảm bảo cũng cập nhật chuỗi mẫu bên trong.)
Mama Fun Roll

1
@ Tôi nghĩ rằng dấu chấm phẩy là cần thiết cho việc ghép nối, vì tôi thực sự không bao gồm các dòng mới.
grc

Không bao giờ nữa, sau đó.
Mama Fun Roll

9

Javascript ES6, 1935 byte

Mười chương trình:

a=_=>{t=`a=${a};a()`;setTimeout(_=>alert(t.length>200?t:";".repeat(82)+'a=_=>{/*  */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\\s)+g,"$0$1"):u)};a();'))};a()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*  */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*   */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*    */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*     */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*      */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*       */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*        */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*         */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a=_=>{/*          */u=";".repeat(82)+"a="+a+";a();";this.t?t+=u:alert(u.length<198?u.replace((\s)+g,"$0$1"):u)};a();

4
Thật là đẹp khi nhìn vào.
Conor O'Brien

4
Tất cả những dấu chấm phẩy thừa đó chỉ để đảm bảo rằng chương trình 2 dài hơn chương trình 1 ...
SuperJedi224

Bạn có thể sử dụng regex (\S)+và thay thế $0$1để lưu một số byte không?
Martin Ender

@ MartinBüttner Có lẽ, tôi sẽ thử vào chiều nay
SuperJedi224

2

2, 214 ký tự / 334 byte

ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
 ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
  ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
   ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
    ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
     ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
      ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
       ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
        ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)
         ℹ)đ ⬭ď9)?ℹ):⬭+ℹ)

Try it here (Firefox only).

Giải trình

ℹ)                // quine function: get source code
  đ ⬭ď9)          // are there 9 spaces in a row anywhere in the source?
        ?ℹ):      // if so, pass the source itself to implicit output
            ⬭+ℹ) // otherwise, add a leading space to the source and pass to implicit output

Chương trình đếm các tìm kiếm cho 9 khoảng trắng liên tiếp, là số lượng khoảng trắng hàng đầu trong chương trình thứ 10. Nếu nó tìm thấy sự trùng khớp, thì mã nguồn được xuất ra; mặt khác, mã nguồn, được dẫn bởi một khoảng trắng, được xuất ra.


Bạn đang sử dụng mã hóa nào? Có vẻ là 284 byte trên bảng mã ISO 8859-1. Đã thử nghiệm tại đây
Downgoat

Tôi đang sử dụng UTF-8.
Mama Fun Roll

Tôi quên rằng đó là ESmin 2, vì vậy tôi đã đọc số char là "2.214 chars": P
Conor O'Brien
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.