Sebuah Quine di Setiap Baris

30

Tujuan Anda adalah membuat program yang mencetak sendiri tanpa batas, dengan baris baru setelah masing-masing. Dengan demikian, jika program Anda adalah satu-liner, itu akan diulang pada setiap baris output.

Contoh

Program:

A

Keluaran:

A
A
A
...

Aturan

  • Itu harus berupa program yang lengkap, bukan cuplikan atau fungsi.
  • Program harus berulang selamanya tanpa stack-overflow atau kesalahan batas rekursi.
  • Output adalah ke stdout atau alternatif terdekat.
  • Tidak ada input program yang diterima.
  • Celah standar tidak diizinkan, seperti membuka file program atau mengakses sumber daya eksternal. Program kosong tidak diizinkan sebagai celah standar.
  • Jika kode program Anda berakhir dengan baris baru tambahan, ini tidak dihitung sebagai baris baru yang diperlukan di antara quine, dan Anda harus mencetak yang lain.
  • - Kode terpendek menang!
mbomb007
sumber
Judulnya terlihat seperti hanya program satu-baris yang memenuhi syarat?
Paŭlo Ebermann
@ PaŭloEbermann Lalu bacalah deskripsi masalahnya. Itu judul yang lucu karena berima. Berikut adalah contoh program multi-line yang valid: codegolf.stackexchange.com/a/57985/34718 . Anda tidak bisa berharap mengetahui segalanya tentang tantangan dengan hanya membaca judulnya.
mbomb007
@ PaŭloEbermann Hanya saja while(1)println(your_code);
Matius Roh

Jawaban:

19

Fission, 7 byte

'!+!NR"

Modifikasi yang agak sederhana dari quine Fisi terpendek yang saya temukan sejauh ini : Saya hanya menggunakan non-destruktif !alih - alih Odan menambahkan Nbaris baru.

Jadi semuanya, inilah cara kerjanya: kontrol aliran dimulai Rdengan atom yang berjalan dengan benar. "matikan mode string, yang berarti segalanya sampai yang berikutnya "dicetak: dalam hal ini '!+!NR. Yang meninggalkan "dan baris baru untuk dicetak. '!mengatur massa atom menjadi 33, +menambahnya menjadi 34 (kode karakter ") dan !mencetak kutipan. Nmencetak baris baru, dan Rsekarang menjadi no-op dalam kasus ini, sehingga loop dimulai kembali.

Solusi 7-byte berikut juga berfungsi:

"NR'!+!
Martin Ender
sumber
9

> <> , 16 byte

'ard3*o50l2)?.~~

Quine> <> tradisional menggunakan terlalu banyak o, jadi kami menggunakan loop untuk mencetak. Sebelum setiap lompatan, kita mendorong 5 dan 0 (koordinat tempat lompat ke), setelah itu kita lompat dengan .apakah masih ada sesuatu untuk dicetak, atau muncul dua nilai teratas dengan ~~.

(Dikembalikan ke versi 16 karena saya lupa tentang aturan stack overflow.)

Sp3000
sumber
Alternatifnya adalah "ar00go50l2)?.[, bukan?
mbomb007
3
@ mbomb007 Saya kira, tapi saya lebih suka d3*karena gmembaca kode sumber Anda sendiri
Sp3000
8

CJam, 13 byte

{_o"_g
"o1}_g

Juru bahasa online tidak mencetak apa pun sebelum program berakhir, jadi Anda harus mengujinya di Java interpreter.

Penjelasan

Akhirnya quine CJam umum yang tidak berakhir pada _~.

{_o"_g
"o1}

Ini hanya mendorong satu blok. _gmenduplikasi blok dan menjalankannya berulang kali sementara bagian atas tumpukan benar (membuang kondisi).

Sekarang di dalam blok, salinan lain dari blok itu masih ada di tumpukan. Kami menduplikat dan mencetaknya dengan _odan kemudian kami mencetak _gdiikuti oleh baris baru (baris tambahan yang diperlukan antara quines) dengan "_g\n"o. Akhirnya kita dorong a 1ke stack untuk mengulangi loop, karena sayangnya, blok tidak benar (atau salah) di CJam.

Martin Ender
sumber
7

Python 2, 39

Bukan tugas yang sangat menarik dalam Python karena itu sepele untuk menambahkan loop sementara ke quine normal.

c='while 2:print"c=%r;exec c"%c';exec c
feersum
sumber
Bukankah ini meniup tumpukan?
Jesan Fafon
1
@JesanFafon Tidak, jika Anda mencobanya, Anda akan melihat bahwa itu tidak. Tidak ada rekursi.
feersum
6

Perl 5.10+, 40 37 byte

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

atau (juga 37 byte)

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

Meminta dengan -M5.010atau -Ebaris bendera perintah, misalnya

$ 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
...

Terima kasih kepada Ilmari Karonen karena mencukur 3 byte dari solusi asli saya, yaitu:

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

Ini, serta solusi 37-byte yang lebih pendek di atas, adalah semua variasi sederhana dari quine berikut, yang pertama kali saya lihat di salah satu postingan Ilmari lainnya :

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

Karena semua yang saya tambahkan dalam solusi asli saya adalah satu whilelingkaran, dia benar-benar layak mendapatkan sebagian besar kredit. :-)

IniSuitIsBlackNot
sumber
Bagus, dan terima kasih atas penghargaannya. :-) Quine asli adalah desain saya sendiri, meskipun orang lain mungkin telah menemukannya secara independen sebelumnya. BTW, $_=q{say"\$_=q{$_};eval"while 1};evalatau $_=q{{say"\$_=q{$_};eval";redo}};evalakan lebih pendek beberapa byte. ( $_=q{say"\$_=q{$_};eval";eval};evalAkan lebih pendek lagi, tapi saya curiga akhirnya akan kehabisan tumpukan.)
Ilmari Karonen
Saya berharap Anda akan muncul! Terima kasih atas solusi yang lebih singkat, saya pikir Anda akan menemukan sesuatu yang lebih baik; tetapi saya sangat terpesona oleh hal ini ketika saya melihatnya di jawaban yang saya tautkan, saya hanya harus mencobanya sendiri. :) Sejujurnya, saya masih belum membungkus kepala saya dengan quines, tetapi jawaban tambahan memberi saya lebih banyak untuk dilihat. Saya tidak yakin apakah Anda berasal ini karena saya melihat Anda dikreditkan dengan quine Perl yang tidak curang (?!) di halaman ini , tetapi tidak ada atribusi untuk quine ini (menggunakan printalih-alih say).
ThisSuitIsBlackNot
btw, yang terakhir memang tidak segfault setelah berjalan untuk sementara waktu. Terima kasih lagi, @Ilmari!
ThisSuitIsBlackNot
Sebenarnya, saya mengambilnya kembali - saya jelas bukan yang pertama menemukan quine itu , dan karena saya pasti pernah melihatnya sebelumnya (saya memposting yang saya klaim kredit untuk di utas yang sama), kemungkinan besar bahwa aku secara tidak sadar mengingatnya dari utas itu, atau dari tempat lain.
Ilmari Karonen
Baiklah, saya telah meninggalkan asal tidak ditentukan. Apapun, terima kasih untuk 3 byte dan terima kasih atas inspirasi aslinya.
ThisSuitIsBlackNot
5

Brainf *** (SMBF) modifikasi diri , 14 byte

Baris tambahan \nharus berupa literal, Unix, baris baru (kode ASCII 10).

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

Penjelasan:

Kode memindahkan pointer ke paling kiri kode sumbernya, lalu mencetak semuanya, termasuk baris baru (dua kali b / c dari aturan). Lingkaran berlanjut.

mbomb007
sumber
Maksudmu, itu harus \r?
Ismael Miguel
@IsmaelMiguel No. \nadalah baris baru, dan kode ASCII 10, jadi dump hex-kode sumber akan memiliki nilai 0Auntuk byte itu. code.cside.com/3rdpage/us/newLine.html
mbomb007
1
@ IsmaelMiguel Tidak benar. Saat Anda mengetik kode, Anda benar-benar menekan tombol enter untuk baris baru. \numumnya dihitung sebagai 2 karakter, dan 2 byte dalam kode Anda. Saya mengetik seperti ini agar mudah dibaca, karena pemformatan tidak berfungsi dengan baik untuk menunjukkan baris kosong di akhir kode sumber saya. Jadi saya harus menentukan bahwa itu SATU byte, bukan dua.
mbomb007
2
\nselalu merupakan karakter tunggal, disebut linefeed . Sebuah baris baru , bagaimanapun, adalah urutan byte bergantung pada platform.
Dennis
2
@ Dennis Mungkin begitu, tapi saya tidak peduli. Saya tidak menyebut /"Solidus", dan saya tidak tahu siapa yang tahu. "Newline" dimulai dengan n, dan itulah karakter pelarian, jadi saya menyebutnya. Ini lebih dekat ke "umpan baris" daripada "carriage return".
mbomb007
3

PowerShell, 143 Bytes

$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)}

Didasarkan pada quine Rosetta Code PowerShell , saya cukup yakin ini bukan yang sesingkat mungkin. Pemformatan penggantian string di PowerShell sangat menjengkelkan untuk ini, karena pembatas yang sama untuk tempat penggantian {}juga membatasi blok kode while{}, jadi kita harus menggunakan [char]casting, yang membengkokkan banyak kode.

AdmBorkBork
sumber
3

Underload, 25 byte

Pertama kali saya mencoba sesuatu seperti ini dan saya tidak yakin apakah mengikuti semua aturan karena beberapa baris. Baris baru itu agak menyakitkan.

(::a~*S:a~*^
)::a~*S:a~*^
MickyT
sumber
1
@ mbomb007 Output per iteration adalah dua baris program. Saya mengujinya di sini
MickyT
3

Befunge , 30 20 byte

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

Variasi dari befunge quine populer yang mencetak baris baru dan muncul -1 pada tumpukan jika itu menyelesaikan garis.
Sayangnya, Befunge mendapat kata-kata kasar ketika melakukan sesuatu dalam satu baris. Saya mencoba untuk menghapus semua launchpads ( #) yang saya bisa, tetapi beberapa harus dibiarkan masuk untuk melewati perintah tertentu (seperti ,).

Perubahan:

30-20 -> mengubah quine dasar menjadi custom yang saya buat yang menggunakan input string. Dengan cara ini, percabangan jauh lebih mudah.

Tua:

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

Saya pikir ini tidak optimal, tetapi masih bisa diterima untuk saat ini.

Kevin W.
sumber
Anda dapat menggunakan instruksi get untuk mengambil spasi, dan menambahkan 2 padanya untuk satu byte lebih pendek dari 98+2/: <, + 55, + 2g1_ #!, #: <"
MildlyMilquetoast
Dan dorong kutipan dan baris pertama terlebih dahulu dan balikkan printer,-1g0:+5<>:#,_1"
Jo King
2

K, 30 byte

{f:$_f;{x}{`0:f,"[]\n";1}/1}[]
kirbyfan64sos
sumber
2

R, 34 byte

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

untuk memanggil dari baris perintah sebagai berikut:

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

> <>, 31 29 byte

Modifikasi sederhana dari quine> tradisional > .

"ar00gc0.0+efooooooooooooooo|

Untuk menjalankan, tempel di sini , klik 'Kirim', lalu 'Mulai' (berjalan tanpa animasi tidak berfungsi). Jangan ragu untuk meningkatkan kecepatan eksekusi.

mbomb007
sumber
"ar00gc0.0+feooooooooooooooo|lebih pendek dua byte.
cole
@Cole Terima kasih. Saya telah memikirkan cermin itu, tetapi lupa untuk mengubahnya setelah dilacak pada tantangan yang berbeda.
mbomb007
20 byte
Jo King
@JoKing Sudah ada lebih pendek> <> solusi .
mbomb007
2

Python 2, 48 byte

c='c=\'%s\';while 1:print c%c';while 1:print c%c
Penginisialisasi
sumber
2

GolfScript, 16 byte

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

Ini akhirnya tampak seperti entri CJam Martin Büttner . Fitur yang menarik adalah bahwa, ternyata, cara terpendek untuk menambahkan ".do"blok ketika dicetak adalah dengan menugaskannya ke terminator garis n. (Tentu saja, kita juga perlu memasukkan baris baru yang sebenarnya dalam string, untuk mengganti yang nbiasanya berisi.) String yang sama (menjadi benar dalam GolfScript) juga dibiarkan di tumpukan agar doloop terlepas, memastikan bahwa loop berjalan selamanya.

Ilmari Karonen
sumber
1

BASH, 76 byte

Tidak bisa menolak, terutama dengan PowerShell di sini :)

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

Spasi putih penting untuk salinan EXACT.

RK.
sumber
1

Javascript (ES6), 64

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

Atau (juga 64)

a="for(;;)console.log(`a=${JSON.stringify(a)};eval(a)`)";eval(a)
DankMemes
sumber
Bukankah alternatifnya menyebabkan stack overflow?
Patrick Roberts
Tidak. Tidak ada rekursi jadi tidak ada yang harus ditambahkan di stack.
DankMemes
Oke, saya baru saja menguji keduanya, Anda benar tentang solusi alternatif, tetapi solusi pertama Anda gagal dan saya tahu sebabnya. Menurut dokumentasi MDN pada fungsi panah , "Fungsi panah tidak mengekspos objek argumen ke kode mereka" sehingga Anda arguments.calleetidak ada dan melempar kesalahan.
Patrick Roberts
Menarik. Bagi saya di Firefox Developer Edition 42.0a2 (2015-09-13), keduanya berfungsi. Saya kira begitu standar sepenuhnya diadopsi, yang pertama akan berhenti bekerja.
DankMemes
Saya menguji mereka pada chrome terbaru karena saya mencoba untuk golf solusi pertama Anda dengan !alih - alih melampirkan tanda kurung dan meletakkan fungsi eksekusi setelah loop untuk menghindari kebutuhan untuk loop tubuh titik koma yang akan menghemat (saya pikir) 4 byte
Patrick Roberts
1

Mikroskrip , 22 byte

"f1{CqxCanx"f1{CqxCanx

Berdasarkan Quine dari artikel Esolangs: "fCqxah"fCqxah. Mengeksploitasi fakta bahwa bahasa secara otomatis menambahkan kawat gigi penutup sesuai kebutuhan, yang tanpanya ini akan menjadi dua byte lebih lama.

SuperJedi224
sumber
1

Batch, 10 (+ 4 untuk panjang nama file)

Tidak yakin apakah ini memenuhi syarat karena dua alasan:

  • Secara teknis, mungkin ada atau tidak ada efek samping tekstual dari shell perintah Windows, karena itu tergantung pada bagaimana hal itu dikonfigurasi.
  • Program ini memanggil dirinya dengan nama, dan saya tidak yakin apakah itu dilarang oleh aturan (khususnya aturan "tidak ada pembukaan file program"). Itu tidak membuka dirinya untuk keperluan membaca dan mencetak teks; itu hanya berjalan kembali sendiri. Lebih lanjut, struktur sistem file merupakan bagian integral dari skrip batch old-school (seringkali bahkan digunakan untuk menyimpan status program, dll). Karena itu, saya tidak yakin apakah ini melanggar aturan ke-5 atau tidak.

Kode (untuk program bernama q.bat):

echo on&&q
Ruslan
sumber
2
Saya mengerti saya akan mengizinkannya karena itu bukan yang terpendek, dan itu kreatif dan unik. Dan itu tidak membaca kode sumber, tetapi mengeksekusi sendiri.
mbomb007
1
Karena nama file tidak arbitrer, paling tidak Anda harus menambahkan nama file ke jumlah byte.
Martin Ender
1
Saya yakin Anda bisa menggunakannya echo on&&%0walaupun saya takut untuk mencobanya.
DankMemes
1
Pembaruan: echo on&&%0tidak berfungsi. %0ditampilkan sebagai diperluas dalam output, dan windows (7, 32 bit, berjalan dalam VM) mengakhiri semuanya dengan sangat cepat.
DankMemes
1
Saya pikir Anda dapat menghilangkan .batbagian
SuperJedi224
1

Ceylon , 210 208 byte

Tentu saja ini tidak akan memenangkan apa pun ...

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);}}

Asli:

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);}}

Saya memodifikasi Quine saya dari dua hari yang lalu dengan menambahkan while(true){...}loop, jadi saya datang dari 185 byte dari Quine polos ke 210 (saya tidak perlu lagi karakter baris baru). Tapi kemudian saya menemukan bahwa satu while(1<2){...}loop bahkan lebih pendek dua 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 tidak memiliki for(;;)loop seperti Java, dan kawat gigi juga diperlukan untuk loop ini.)

Paŭlo Ebermann
sumber
1

PowerShell, 132 107 Bytes

$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}

Didasarkan dari Rosetta Quine (Sama seperti @AdmBorkBork) meskipun tidak menggunakan format untuk penggantian string ... mungkin beralih ke loop untuk dan menggunakan format akan lebih baik?

Saya yakin jika AdmBorkBork kembali mereka akan mengalahkan ini banyak: P

EDIT Menemukan loop dan penggantian, semua berkat pendahulu saya :)

Usaha lama:

$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)}
Sinusoid
sumber
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));}}

Penjelasan:

Cobalah online (waktu habis setelah 60 detik).

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

:

  • String sberisi kode sumber yang tidak diformat.
  • %sdigunakan untuk memasukkan String ini ke dalam dirinya sendiri dengan s.format(...).
  • %c, %1$cdan 34digunakan untuk memformat tanda kutip ganda.
  • s.format(s,34,s) menempatkan semuanya bersama-sama

Bagian tantangan:

  • for(;;) digunakan untuk loop tanpa batas.
  • System.out.println(...) digunakan untuk mencetak dengan mengikuti baris baru
Kevin Cruijssen
sumber
1

Brachylog , 16 byte

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

Anda tidak dapat mencobanya secara online , tetapi saya telah memverifikasi bahwa itu berfungsi pada instalasi saya.

Brachylog , 18 byte

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

Cobalah online!

Diadaptasi dari versi alternatif quine ini , dengan hack backtracking saya awalnya dirancang untuk bogosort dari semua hal. Menghabiskan dua byte pada ~nkarena (cara biasa untuk mencetak dengan baris baru) menyentuh beberapa masalah aneh dengan pengkodean karakter pada TIO, dan baris baru yang sebenarnya dimasukkan ke dalam string literal akan dicetak ~ksebagai \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.

Karena w₁mengambil input sebagai daftar [string to be formatted, formatting arguments], membungkus string dalam daftar dengan gkemudian menyatukannya dengan dirinya sendiri jmemungkinkan untuk diformat dengan dirinya sendiri. Dan karena tidak ada input yang diberikan ke program, variabel input yang secara implisit hadir pada awal program dapat mengambil nilai apa pun, sehingga dapat dibatasi ke salah satu dari daftar tak terhingga banyaknya yang berisi "∋~kgjw₁⊥~n"sebagai elemen, membuat satu titik pilihan untuk mundur ke saat setelah mencetak sumbernya program hits .

String yang tidak terkait
sumber
1

Python 3.6, 48 43 byte.

-5 byte terima kasih kepada @ Jo King

x='while 1:print("x=%r;exec(x)"%x)';exec(x)
Divy
sumber
Anda dapat menggunakan %runtuk menghemat melarikan diri 'itu. 43 byte
Jo King
yang memberikan 41 untuk python 3.8: P
ASCII-only