cấp độ Ouroboros Quine


11

Phiên bản 128 ngôn ngữ này (một chương trình tạo ra một chương trình bằng ngôn ngữ khác, tạo ra một chương trình bằng một ngôn ngữ khác, (125 ngôn ngữ sau), tạo ra chương trình gốc) khá ấn tượng. Nhưng thật không may, nó có một số lần lặp tĩnh.

Viết chương trình xuất ra chương trình (không nhất thiết phải bằng ngôn ngữ khác, nhưng có thể), chương trình này tạo ra chương trình, tạo ra chương trình, v.v., sau n lần lặp, sẽ xuất chương trình gốc lần đầu tiên (nghĩa là không có trung gian chương trình nên giống như bản gốc, vì nếu không thì một quine bỏ qua đầu vào của nó sẽ hoạt động), trong đó n là một số nguyên không âm được cung cấp làm đầu vào. Đầu vào không thể chỉ là một số trong mã nguồn gốc (ví dụ: đặt x = <the value of n>ở đầu chương trình của bạn), nó phải là một trong những điều sau đây:

  1. Truyền qua làm đối số dòng lệnh
  2. Đọc từ đầu vào tiêu chuẩn
  3. Truyền qua làm đối số cho hàm, trả về / xuất chương trình mới.

Đối với các giai đoạn trung gian trong ouroboros, chương trình của bạn có thể là chương trình hoạt động đầy đủ hoặc chức năng không có đối số, khi được gọi, sẽ trả về / xuất ra kế tiếp.

Bạn không thể đọc từ chính tệp nguồn hoặc sử dụng bất kỳ nội dung giống như quine nào (tôi không nghĩ có bất kỳ thứ gì sẽ làm điều này, nhưng có thể có)

Để rõ ràng, nếu n = 0, chương trình nên xuất mã nguồn riêng của nó.

Nếu n = 1, chương trình sẽ xuất ra một chương trình khác, đầu ra mã nguồn gốc.

Và như thế...

Ít byte nhất sẽ thắng!

Biên tập:

Tôi nên viết "Đối với các giai đoạn trung gian trong ouroboros, chương trình của bạn có thể là chương trình hoạt động đầy đủ, không có đầu vào hoặc chức năng không có đối số". Nếu chương trình của bạn xuất ra cái tiếp theo trong chuỗi, sau đó đợi đầu vào, điều đó tốt, nhưng chương trình của bạn không cần giá trị ban đầu là n.



Chúng ta có thể 1 chỉ số n không? Vì vậy, n = 1 có nghĩa là mã nguồn in, n = 2 có nghĩa là mã in sẽ in mã nguồn, v.v.
Dữ liệu hết hạn vào

1
Các phiên bản lặp vẫn sẽ có đầu vào ban đầu? Vì vậy, giả sử đầu vào đầu tiên của tôi là 3 và tôi chạy chương trình đầu ra. Vẫn sẽ có một đầu vào 3, hoặc không có đầu vào nào cả? Nếu không có đầu vào, tôi đoán chúng ta cần xử lý trong trường hợp một cái gì đó giống như getInput()được sử dụng mà không có bất kỳ đầu vào nào được cung cấp. Hoặc chúng ta có thể nói đầu vào một cái gì đó ngẫu nhiên không được sử dụng cho các lần lặp lại sau, để ngăn ngừa lỗi cho getInput()? Aka là câu trả lời Python hiện tại hợp lệ?
Kevin Cruijssen

Tôi nghi ngờ rằng những gì chúng tôi được yêu cầu là, đưa ra một số nguyên n, đưa ra một chương trình là "chương trình ban đầu" của một nphép lặp ouroboros và câu trả lời của chúng tôi không nên được tính là một trong những nlần lặp. Điều này có đúng không?
Erik the Outgolfer

@KevinCruijssen Có lẽ tôi nên rõ ràng hơn về điều đó. Các giai đoạn trung gian không thể có đầu vào dưới mọi hình thức. Tôi đoán nếu chương trình xuất ra cái tiếp theo và sau đó đợi đầu vào, điều đó sẽ ổn.
Leo Tenenbaum

Câu trả lời:


5

05AB1E , 28 byte

-4 byte + sửa nhờ Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ì

Hãy thử trực tuyến!


Giải trình

Điều này hoạt động bằng cách nối thêm số còn lại để in ra phía trước mã, có nghĩa là nó được thêm vào ngăn xếp giống như cách nhập liệu. Trong trường hợp cơ sở của đầu vào là "0", nó sẽ không nối 0 ở mặt trước.


dlà không âm ( >=0) thay vì dương ( >0). Vấn đề là để kiểm tra dmà không bật nó, bạn cần sao chép nó trước, nhưng sau đó nó cũng cần được loại bỏ khi lặp 0"quinsting", nếu không nó sẽ xuất ra bản sao 0. :(
Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ìcho 28 byte có lẽ (vẫn còn khá gần với cách tiếp cận dự định của bạn)? (Tôi sợ phiên bản hiện tại của bạn cho các 0"34çìD«s<Ddiì"34çìD«s<Ddiìkết quả lặp lại -1từ sự nổi Ddậy ..)
Kevin Cruijssen

4

Bùa mê , 39 byte

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

Hãy thử trực tuyến!

Sẽ ngắn hơn 4 byte so với 05AB1E khi sử dụng cùng một chiến thuật nếu các đầu vào có giá trị nhỏ hơn hoặc bằng 10. Nhưng khi chúng ta cần hỗ trợ các giá trị lớn tùy ý, nó sẽ phức tạp hơn.

Giá trị số của nđược đặt ở phía trước và được phân tích cú pháp dưới dạng số liên tục bằng chữ ´. "3X4+kSqlà mã quine cơ bản. Nếu không có giá trị nào xuất hiện ở phía trước, chiều dài ngăn xếp sẽ chỉ là 1 (quine) nếu không thì hãy l1=d*?xác định cách xử lý mọi thứ từ đó.

  • Nếu có một giá trị, hãy S:1-}'LA2+-}chạy: hoán đổi giá trị lên trên cùng, trừ đi 1, sao chép nó, để lại một bản sao ở dưới cùng của ngăn xếp, lấy Nhật ký 10 của giá trị đó nhân với 100 (kết quả là độ dài ký tự của giá trị, cộng với 1 cho ´), loại bỏ nhiều ký tự khỏi cuối chuỗi (tự cắt ngắn một cách hiệu quả ở cuối, cả khi không cần thiết vì nó có giá trị sai). Clà một byte ngắn hơn 2+và kết quả trong cùng một giá trị.

  • Nếu không có giá trị, hãy đọc một từ đầu vào.

Bất kể: :0)2*?trùng lặp và so sánh với số không.

  • Nếu đẩy không bằng không ´.

  • Nếu bằng 0, bật giá trị. Chúng ta có thể gian lận bằng cách sử dụng !thay vì 2?và lưu một byte bởi vì khi ´cố gắng thực thi byte đầu tiên, nó thấy không phải là số và ngay lập tức thoát khỏi chế độ số ở cùng một vị trí.

In toàn bộ ngăn xếp từ trên xuống dưới.


3

Java 10, 145 byte

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

Hãy thử trực tuyếnxem kết quả đầu ra của một số lần lặp .

Giải trình:

giải thích :

  • var schứa mã nguồn chưa được định dạng
  • %s được sử dụng để đặt Chuỗi này vào chính nó với s.format(...)
  • %c, %1$c34được sử dụng để định dạng dấu ngoặc kép
  • s.format(s,34,s) đặt tất cả lại với nhau

Phần thử thách:

Hàm lambda đầu tiên lấy longđầu vào làm tham số.

  • Điều này được đặt trong biến Long N=n;trong lần lặp đầu tiên. Hoặc trong Long N=%s;các lần lặp lại tiếp theo.
  • Kiểm tra ternary N>0?N-1+"L":"n"sẽ điền vào %sgiá trị này N-1, được nối thêm Lvì nó dài và để chuyển đổi nó thành Chuỗi cho %s, nếu Nlớn hơn 1. Nếu Nlà 0 (đầu vào ban đầu là 0hoặc đây là lần lặp cuối cùng của câu hỏi- ' vòng lặp '), nó sẽ điền vào đây %svới nthay thế ban đầu .

Thông số kỹ thuật cho biết các đầu ra trung gian phải là một chương trình đầy đủ hoặc một chức năng không có đối số
Hiện thân của sự thiếu hiểu biết

@EmbodimentofIgnorance Tôi biết, đó là những gì tôi có. Hàm lambda đầu tiên có longtham số chức năng và các hàm lambda khác lấy tham số không sử dụngVoid , tôi cũng luôn sử dụng cho các thách thức nêu rõ không có đầu vào vì v->ngắn hơn 1 byte ()->.
Kevin Cruijssen

2

Haskell , 195 164 byte

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

Hãy thử trực tuyến!

Điều này sử dụng một kỹ thuật quine khá đơn giản. Chúng tôi sửa đổi nó với một biến ađược đặt thành một số. Nếu số đó bằng 0 (lúc bắt đầu), chúng tôi lấy đầu vào và đầu ra nguồn của chúng tôi ađược đặt thành số đầu vào. Nếu akhông bằng 0, chúng tôi xuất nguồn của chúng tôi với athiết lập thành một ít hơn. Cách này ađếm ngược về 0 trước khi xuất nguồn gốc.



2

R , 92 byte

f=function(n=-1){gsub("\\s","",paste("f=",sub("-?\\d+",n-1,paste(deparse(f),collapse=""))))}

Hãy thử trực tuyến!

Nếu deparsebị coi là gian lận, đây là một giải pháp thay thế:

R , 108 byte

function(n=-1){s="function(n=%d){s=%s%s%2$s;sprintf(s,n-1,intToUtf8(34),s)}";sprintf(s,n-1,intToUtf8(34),s)}

Hãy thử trực tuyến!


1

Perl 6 , 44 byte

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

Hãy thử trực tuyến!

Đưa đầu vào qua đầu vào tiêu chuẩn và trả về một chương trình trong đó điều duy nhất thay đổi là số đầu tiên. Mỗi chương trình tiếp theo sau đó sẽ xuất ra cùng một chương trình, ngoại trừ số đó giảm dần.


1

C # (Trình biên dịch tương tác Visual C #) , 112 byte

void f(int n=-1){var s="void f(int n={2}){{var s={0}{1}{0};Write(s,(char)34,s,n-1);}}";Write(s,(char)34,s,n-1);}

Đã lưu rất nhiều byte nhờ @NickKennedy!

Hãy thử trực tuyến!


Các đầu ra trung gian không phải là một chương trình đầy đủ cũng không phải là một hàm có một đối số duy nhất. Ngoài ra tôi nghĩ rằng bạn có một số ns nên được ls. Làm thế nào về tio.run/##Sy7WTS7O/P@/ Kẻ
Nick Kennedy

1

Python 3,8 (tiền phát hành) , 60 56 55 53 byte

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

Hãy thử trực tuyến!

-2 byte nhờ Jo King

Kể từ phiên bản 53 byte, cũng hoạt động trong Python 2 và Python 3.


Hàm trung gian dường như không phải là một chương trình đầy đủ hoặc một hàm không có đối số.
Nick Kennedy

Toán tử hải mã đó :=là một bổ sung đáng hoan nghênh cho Python, đó là điều chắc chắn.
mbomb007

"Đối với các giai đoạn trung gian trong ouroboros, chương trình của bạn có thể là chương trình hoạt động đầy đủ hoặc chức năng không có đối số , khi được gọi, sẽ trả về / xuất ra kế tiếp."
mbomb007

@NickKennedy Đã cập nhật để tuân thủ thông số kỹ thuật và được lưu ngẫu nhiên 4 byte.
âm bảy

1
53 byte mà không cần sử dụng:=
Jo King
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.