Một câu hỏi trên mỗi dòng


30

Mục tiêu của bạn là tạo ra một chương trình tự in vô thời hạn, với một dòng mới sau mỗi chương trình. Do đó, nếu chương trình của bạn là một lớp lót, nó sẽ được lặp lại trên mỗi dòng đầu ra.

Thí dụ

Chương trình:

A

Đầu ra:

A
A
A
...

Quy tắc

  • Nó phải là một chương trình hoàn chỉnh, không phải là một đoạn hoặc chức năng.
  • Chương trình sẽ lặp mãi mãi mà không xảy ra lỗi giới hạn stack-overflow hoặc đệ quy.
  • Đầu ra là thiết bị xuất chuẩn hoặc thay thế gần nhất.
  • Không có đầu vào chương trình được chấp nhận.
  • Các lỗ hổng tiêu chuẩn không được phép, chẳng hạn như mở tệp của chương trình hoặc truy cập tài nguyên bên ngoài. Các chương trình trống không được phép là một lỗ hổng tiêu chuẩn.
  • Nếu mã chương trình của bạn kết thúc bằng một dòng mới, thì đây không được tính là dòng mới cần thiết giữa các quines và bạn phải in một dòng khác.
  • - Mã ngắn nhất sẽ thắng!

Tiêu đề trông giống như chỉ các chương trình một dòng đủ điều kiện?
Paŭlo Ebermann

@ PaŭloEbermann Sau đó đọc mô tả vấn đề. Đó là một tiêu đề dí dỏm vì nó có vần điệu. Dưới đây là ví dụ về chương trình nhiều dòng hợp lệ: codegolf.stackexchange.com/a/57985/34718 . Bạn không thể mong đợi để biết mọi thứ về một thách thức bằng cách chỉ đọc tiêu đề.
mbomb007

@ PaŭloEbermann Chỉ là while(1)println(your_code);
Matthew Roh

Câu trả lời:


19

Phân hạch, 7 byte

'!+!NR"

Một sửa đổi khá đơn giản của quine Phân hạch ngắn nhất mà tôi đã tìm thấy cho đến nay : Tôi chỉ đơn giản là sử dụng không phá hủy !thay vì Ovà thêm một Ndòng mới.

Vì vậy, tất cả trong tất cả, đây là cách nó hoạt động: dòng điều khiển bắt đầu từ Rmột nguyên tử phải. "bật chế độ chuỗi, có nghĩa là mọi thứ cho đến khi bản tiếp theo "được in: trong trường hợp này '!+!NR. Điều đó để lại "và dòng mới sẽ được in. '!đặt khối lượng của nguyên tử lên 33, +tăng nó lên 34 (mã ký tự của ") và !in trích dẫn. Nin một dòng mới, và Rbây giờ là không có trong trường hợp này, vì vậy vòng lặp bắt đầu lại.

Giải pháp 7 byte sau đây cũng hoạt động:

"NR'!+!

9

> <> , 16 byte

'ard3*o50l2)?.~~

Truyền thống> <> quine sử dụng quá nhiều os, vì vậy chúng tôi sử dụng một vòng lặp để in. Trước mỗi lần nhảy, chúng ta sẽ đẩy 5 và 0 (tọa độ của nơi để nhảy tới), sau đó chúng ta sẽ nhảy với .nếu vẫn còn thứ gì đó để in hoặc bật hai giá trị trên cùng ~~.

(Hoàn nguyên về phiên bản 16 vì tôi quên quy tắc tràn ngăn xếp.)


Một thay thế là "ar00go50l2)?.[, phải không?
mbomb007

3
@ mbomb007 Tôi đoán, nhưng tôi thích hơn d3*gđọc mã nguồn của riêng bạn
Sp3000

8

CJam, 13 byte

{_o"_g
"o1}_g

Trình thông dịch trực tuyến không in bất cứ thứ gì trước khi chương trình kết thúc, vì vậy bạn sẽ phải kiểm tra điều này trong trình thông dịch Java.

Giải trình

Cuối cùng, một quine CJam tổng quát mà không kết thúc _~.

{_o"_g
"o1}

Điều này chỉ đơn giản là đẩy một khối. _gnhân đôi khối và thực hiện nó nhiều lần trong khi đỉnh của ngăn xếp là trung thực (loại bỏ điều kiện).

Bây giờ bên trong khối, bản sao khác của khối vẫn còn trên ngăn xếp. Chúng tôi sao chép và in nó với _ovà sau đó chúng tôi in _gtheo sau là một dòng mới (dòng mới bổ sung cần thiết giữa các quines) với "_g\n"o. Cuối cùng, chúng tôi đẩy một 1ngăn xếp lên vòng lặp để lặp lại, vì thật không may, các khối không phải là sự thật (hoặc giả) trong CJam.


7

Con trăn 2, 39

Không phải là một nhiệm vụ rất thú vị trong Python vì việc thêm vòng lặp while vào một câu hỏi bình thường.

c='while 2:print"c=%r;exec c"%c';exec c

Điều này không thổi tung ngăn xếp?
Jesan Fafon

1
@JesanFafon Không, nếu bạn đã thử, bạn sẽ thấy rằng nó không. Không có đệ quy.
frageum

6

Perl 5.10+, 40 37 byte

$_=q{say"\$_=q{$_};eval"while 1};eval

hoặc (cũng 37 byte)

$_=q{{say"\$_=q{$_};eval";redo}};eval

Gọi với cờ dòng -M5.010hoặc -Elệnh, vd

$ perl -E '$_=q{say"\$_=q{$_};eval"while 1};eval'
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
...

Cảm ơn Ilmari Karonen vì đã loại bỏ 3 byte khỏi giải pháp ban đầu của tôi, đó là:

eval while$_=q{say"eval while\$_=q{$_}"}

Điều này, cũng như các giải pháp 37 byte ngắn hơn ở trên, đều là các biến thể đơn giản của câu hỏi sau, lần đầu tiên tôi thấy trong một trong những bài viết khác của Ilmari :

$_=q{say"\$_=q{$_};eval"};eval

Vì tất cả những gì tôi thêm vào trong giải pháp ban đầu của mình là một whilevòng lặp, anh ấy thực sự xứng đáng với phần lớn tín dụng. :-)


Đẹp, và cảm ơn cho tín dụng. :-) Quine ban đầu là thiết kế của riêng tôi, mặc dù người khác có thể đã độc lập phát hiện ra nó trước đó. BTW, $_=q{say"\$_=q{$_};eval"while 1};evalhoặc $_=q{{say"\$_=q{$_};eval";redo}};evalsẽ ngắn hơn một vài byte. ( $_=q{say"\$_=q{$_};eval";eval};evalthậm chí còn ngắn hơn nữa, nhưng tôi nghi ngờ nó cuối cùng sẽ hết ngăn xếp.)
Ilmari Karonen

Tôi đã hy vọng bạn sẽ xuất hiện! Cảm ơn bạn cho các giải pháp ngắn hơn, tôi hình dung bạn sẽ đưa ra một cái gì đó tốt hơn; Nhưng tôi đã bị thổi bay bởi điều này khi tôi thấy nó trong câu trả lời tôi liên kết, tôi phải tự mình thử nó. :) Thành thật mà nói, tôi vẫn chưa hoàn toàn quấn đầu, nhưng câu trả lời bổ sung cho tôi nhiều hơn để xem xét. Tôi không chắc chắn nếu bạn bắt nguồn từ điều này bởi vì tôi thấy bạn được ghi nhận với câu hỏi Perl không gian lận ngắn nhất từng có (?!) Trên trang này , nhưng không có sự quy kết nào cho câu hỏi này (sử dụng printthay vì say).
ThisSuitIsBlackNot

btw, cái cuối cùng thực sự segfault sau khi chạy một lúc. Cảm ơn một lần nữa, @Ilmari!
ThisSuitIsBlackNot

Trên thực tế, tôi lấy lại phần nào đó - tôi chắc chắn không phải là người đầu tiên phát minh ra câu hỏi đó và vì tôi chắc chắn đã nhìn thấy nó trước đây (tôi đã đăng bài mà tôi yêu cầu một số tín dụng cho cùng một chủ đề), rất có khả năng rằng tôi vô thức nhớ nó từ chủ đề đó, hoặc từ một nơi khác.
Ilmari Karonen

Được rồi, tôi đã để lại nguồn gốc không xác định. Bất kể, cảm ơn bạn cho 3 byte và cảm ơn bạn cho cảm hứng ban đầu.
ThisSuitIsBlackNot

5

Brainf tự sửa đổi *** (SMBF) , 14 byte

Dòng mới theo dõi \ncần phải là một dòng mới, Unix, dòng mới (mã ASCII 10).

[<[<]>[.>]<.]\n

Giải trình:

Mã di chuyển con trỏ sang bên trái của mã nguồn, sau đó in tất cả, bao gồm cả dòng mới (hai lần b / c của quy tắc). Vòng lặp tiếp tục.


Ý bạn là, nó phải \rthế nào?
Ismael Miguel

@IsmaelMiguel Số \nlà một dòng mới và là mã ASCII 10, do đó, một kết xuất hex của mã nguồn sẽ có giá trị 0Acho byte đó. code.cside.com/3rdpage/us/newLine.html
mbomb007

1
@IsmaelMiguel Không đúng. Khi bạn nhập mã, bạn thực sự nhấn phím enter cho một dòng mới. \nthường được tính là 2 ký tự và 2 byte trong mã của bạn. Tôi đã gõ nó theo cách này để dễ đọc, vì định dạng không hoạt động tốt để hiển thị một dòng trống ở cuối mã nguồn của tôi. Và vì vậy tôi phải xác định rằng đó là MỘT byte chứ không phải hai.
mbomb007

2
\nluôn luôn là một ký tự đơn, được gọi là linefeed . Một newline , tuy nhiên, là một chuỗi nền tảng phụ thuộc vào các byte.
Dennis

2
@Dennis Có lẽ vậy, nhưng tôi không quan tâm. Tôi không gọi /là "Solidus" và tôi không biết ai làm thế. "Dòng mới" bắt đầu bằng một n, và đó là ký tự thoát, vì vậy đó là những gì tôi gọi nó. Nó gần với "line feed" hơn là "trở về vận chuyển".
mbomb007

3

PowerShell, 143 byte

$d='$d={0}{1}{0}{2}while(1){3}Write($d -f [char]39,$d,"`n",[char]123,[char]125){4}'
while(1){Write($d -f [char]39,$d,"`n",[char]123,[char]125)}

Dựa off the Rosetta Mã PowerShell Quine , tôi khá tự tin này không phải là ngắn nhất có thể. Định dạng thay thế chuỗi trong PowerShell rất hữu ích cho việc này, bởi vì các dấu phân cách tương tự cho vị trí đặt thay thế {}cũng phân định các khối mã while{}, vì vậy chúng tôi phải sử dụng phương thức [char]truyền, làm mờ mã bó.


3

Dưới tải, 25 byte

Lần đầu tiên tôi đã thử một cái gì đó như thế này và tôi không chắc chắn nếu tuân theo tất cả các quy tắc vì nó là một vài dòng. Dòng mới là một chút đau đớn.

(::a~*S:a~*^
)::a~*S:a~*^

1
@ mbomb007 Đầu ra trên mỗi lần lặp là hai dòng của chương trình. Tôi đã thử nghiệm nó ở đây
MickyT

3

Befunge , 30 20 byte

<,+55,*2+98_ #!,#:<"

Một biến thể của một quine befunge phổ biến in ra một dòng mới và bật -1 trên ngăn xếp nếu nó kết thúc dòng.
Thật không may, Befunge bị dài dòng khi làm mọi việc trong một dòng. Tôi đã cố gắng loại bỏ tất cả các launchpad ( #) mà tôi có thể, nhưng một số phải được bỏ lại để bỏ qua các lệnh nhất định (như ,).

Thay đổi:

30-20 -> đã thay đổi quine cơ sở thành tùy chỉnh mà tôi đã thực hiện sử dụng đầu vào chuỗi. Bằng cách này, việc phân nhánh dễ dàng hơn rất nhiều.

Cũ:

:0g,:93*`>0-10 #,+$#: #5 _1+>

Tôi không nghĩ rằng điều này là tối ưu, nhưng bây giờ nó có thể chấp nhận được.


Bạn có thể sử dụng một lệnh get để lấy một khoảng trắng và thêm 2 vào nó để có một byte ngắn hơn 98+2/: <, + 55, + 2g1_ # !, #: <"
MildlyMilquetoast

Và đẩy báo giá và dòng mới trước và đảo ngược máy in,-1g0:+5<>:#,_1"
Jo King


2

R, 34 byte

repeat{write(commandArgs()[5],'')}

để gọi từ dòng lệnh như sau:

Rscript -e "repeat{write(commandArgs()[5],'')}"

2

> <>, 31 29 byte

Một sửa đổi đơn giản của truyền thống > <> quine .

"ar00gc0.0+efooooooooooooooo|

Để chạy, dán nó vào đây , nhấp vào 'Gửi', sau đó 'Bắt ​​đầu' (chạy mà không có hoạt hình không hoạt động). Hãy tăng tốc độ thực hiện.


"ar00gc0.0+feooooooooooooooo|ngắn hơn hai byte.
cole

@Cole Cảm ơn. Tôi đã nghĩ về chiếc gương, nhưng quên thay đổi nó sau khi bị theo dõi bên cạnh trong một thử thách khác.
mbomb007


@JoKing Đã có một giải pháp > <> ngắn hơn .
mbomb007


2

GolfScript, 16 byte

{.".do
":n\p}.do

Điều này cuối cùng trông rất giống với mục nhập CJam của Martin Büttner . Một tính năng thú vị là, hóa ra, cách ngắn nhất để nối ".do"vào khối khi nó được in là gán nó cho bộ kết thúc dòng n. (Tất nhiên, chúng ta cũng cần bao gồm một dòng mới thực sự trong chuỗi, để thay thế một dòng nthông thường chứa.) Chuỗi tương tự (là sự thật trong GolfScript) cũng được để lại trên ngăn xếp để dovòng lặp bật ra, đảm bảo rằng vòng lặp chạy mãi


1

BASH, 76 byte

Không thể cưỡng lại, đặc biệt là với PowerShell tại đây :)

while true;do
a ()
{
    echo while true\;do
    declare -f a
    echo a\;done
}
a;done

Khoảng trắng rất quan trọng đối với bản sao CHÍNH XÁC.


1

Javascript (ES6), 64

for(;;(_=>console.log(`for(;;(_=>${arguments.callee})());`))());

Cách khác (cũng 64)

a="for(;;)console.log(`a=${JSON.stringify(a)};eval(a)`)";eval(a)

Sẽ không thay thế gây ra một tràn ngăn xếp?
Patrick Roberts

Không. Không có đệ quy vì vậy không có gì nên thêm vào ngăn xếp.
DankMeme

Được rồi, tôi vừa thử nghiệm cả hai, bạn đã đúng về giải pháp thay thế, nhưng giải pháp đầu tiên của bạn thất bại và tôi đã tìm ra lý do tại sao. Theo tài liệu MDN về các hàm mũi tên , "Các hàm mũi tên không để lộ đối tượng đối với mã của chúng" để bạn arguments.calleekhông tồn tại và gây ra lỗi.
Patrick Roberts

Hấp dẫn. Đối với tôi trong Firefox Developer Edition 42.0a2 (2015-09-13), cả hai đều hoạt động. Tôi đoán một khi tiêu chuẩn được thông qua đầy đủ, cái đầu tiên sẽ ngừng hoạt động.
DankMeme

Tôi đã thử nghiệm chúng trên chrome mới nhất kể từ khi tôi thử chơi giải pháp đầu tiên của bạn !thay vì đặt dấu ngoặc đơn và đặt chức năng thực thi sau vòng lặp for để tránh sự cần thiết của thân dấu chấm phẩy vòng lặp sẽ tiết kiệm (tôi nghĩ) 4 byte
Patrick Roberts

1

Kính hiển vi , 22 byte

"f1{CqxCanx"f1{CqxCanx

Dựa trên quine từ bài viết của Esolangs : "fCqxah"fCqxah. Khai thác thực tế là ngôn ngữ tự động bổ sung đóng dấu ngoặc khi cần, mà không có điều này sẽ dài hơn hai byte.


1

Batch, 10 (+ 4 cho chiều dài tên tệp)

Không chắc chắn nếu điều này đủ điều kiện vì hai lý do:

  • Về mặt kỹ thuật, có thể có hoặc không có tác dụng phụ văn bản từ trình vỏ lệnh Windows, vì điều đó phụ thuộc vào cách cấu hình.
  • Chương trình này tự gọi bằng tên và tôi không chắc liệu điều đó có bị cấm bởi các quy tắc hay không (cụ thể là quy tắc "không mở tệp chương trình"). Nó không tự mở cho mục đích đọc và in ra văn bản; nó chỉ đơn giản là chạy lại chính nó. Hơn nữa, cấu trúc hệ thống tệp là một phần không thể thiếu của các tập lệnh bó trường cũ (đôi khi thậm chí còn được sử dụng để lưu trữ trạng thái chương trình, v.v.). Như vậy, tôi không chắc liệu điều này có vi phạm quy tắc thứ 5 hay không.

Mã (cho một chương trình có tên q.bat):

echo on&&q

2
Tôi nhận được tôi sẽ cho phép nó vì nó không phải là ngắn nhất, và nó sáng tạo và độc đáo. Và nó không đọc mã nguồn, mà là tự thực thi.
mbomb007

1
Vì tên tệp không phải là tùy ý, ít nhất bạn nên thêm tên tệp vào số byte.
Martin Ender

1
Tôi tin rằng bạn có thể sử dụng echo on&&%0mặc dù tôi sợ thử nó.
DankMeme

1
Cập nhật: echo on&&%0không hoạt động. %0được hiển thị dưới dạng mở rộng ở đầu ra và các cửa sổ (7, 32 bit, chạy trong VM) chấm dứt toàn bộ mọi thứ khá nhanh.
DankMeme

1
Tôi nghĩ bạn có thể bỏ qua .batphần này
SuperJedi224

1

Ceylon , 210 208 byte

Tất nhiên điều này sẽ không giành được bất cứ điều gì ...

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

Nguyên:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

Tôi đã sửa đổi Quine của mình từ hai ngày trước bằng cách thêm while(true){...}vòng lặp, vì vậy tôi đến từ 185 byte của Quine đơn giản thành 210 (Tôi không cần ký tự dòng mới nữa). Nhưng sau đó tôi thấy rằng một while(1<2){...}vòng lặp thậm chí còn ngắn hơn hai byte:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

(Ceylon không có for(;;)vòng lặp như Java và cũng cần niềng răng cho vòng lặp này.)


1

PowerShell, 132 107 byte

$a='$a={0}{1}{0};for(){2}$a-f[char]39,$a,[char]123,[char]125{3}';for(){$a-f[char]39,$a,[char]123,[char]125}

Dựa trên Rosetta Quine (Giống như @AdmBorkBork) mặc dù không sử dụng định dạng để thay thế chuỗi ... có thể chuyển sang vòng lặp for và sử dụng định dạng sẽ là tốt nhất?

Tôi chắc chắn nếu admBorkBork quay lại, họ sẽ đánh bại điều này rất nhiều: P

EDIT Tìm ra vòng lặp for và thay thế, tất cả là nhờ người tiền nhiệm của tôi :)

Cố gắng cũ:

$a='$a=;for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}';for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}


1

Java 10, 194 byte

interface M{static void main(String[]a){for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";;)System.out.println(s.format(s,34,s));}}

Giải trình:

Dùng thử trực tuyến (thời gian chờ sau 60 giây).

interface M{                    // Class
  static void main(String[]a){  //  Mandatory main-method
    for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";
                                //   Unformatted source code
        ;)                      //   Loop indefinitely
       System.out.println(      //    Print with trailing new-line:
         s.format(s,34,s));}}   //     The formatted source code

-part:

  • Chuỗi schứa mã nguồn chưa được định dạng.
  • %sđược sử dụng để nhập 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 nháy kép.
  • s.format(s,34,s) đặt tất cả lại với nhau

Phần thử thách:

  • for(;;) được sử dụng để lặp vô thời hạn.
  • System.out.println(...) được sử dụng để in với dòng mới





1

Brachylog , 16 byte

∋"∋~kgjẉ₁⊥"gjẉ₁⊥

Bạn không thể thử trực tuyến , nhưng tôi đã xác minh rằng nó hoạt động trên cài đặt của tôi.

Brachylog , 18 byte

∋"∋~kgjw₁⊥~n"gjw₁⊥

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

Chuyển thể từ phiên bản thay thế của quine này , với một bản hack backtracking ban đầu tôi đã nghĩ ra cho bogosort của tất cả mọi thứ. Chi tiêu hai byte ~n(phương tiện thông thường để in với dòng mới) gặp một số vấn đề kỳ lạ với mã hóa ký tự trên TIO và một dòng mới thực sự được chèn vào chuỗi ký tự được in qua ~knhư \n.

               w      Print
 "∋~kgjw₁⊥~n"         "∋~kgjw₁⊥~n"
∋                     which is an element of
                      the (unused and unconstrained) input
                ₁     formatted
          ~n          (so that the ~n is replaced with a newline)
             gj       with itself
   ~k                 (so that the ~k is replaced with the string in quotes),
                 ⊥    then try again.

Kể từ khi w₁ lấy đầu vào là một danh sách [string to be formatted, formatting arguments], gói một chuỗi trong danh sách và gsau đó nối nó với chính nó jcho phép nó được định dạng với chính nó. Và vì không có đầu vào nào được cung cấp cho chương trình, biến đầu vào được hiển thị ngầm ở đầu chương trình có thể nhận bất kỳ giá trị nào, do đó, nó có thể bị ràng buộc với một trong vô số danh sách có chứa "∋~kgjw₁⊥~n"như một phần tử, tạo ra một điểm lựa chọn được quay lại khi sau khi in nguồn của nó, chương trình chạm .



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.