A Quine Rapuh

30

A Quine Rapuh

Quine rapuh adalah quine yang memenuhi properti setiap substring yang dibuat dengan menghapus satu karakter, ketika dievaluasi, menghasilkan kesalahan.

Sebagai contoh. Jika program Anda asdfadalah quine, maka agar rapuh, program berikut ini harus salah:

sdf
adf
asf
asd

Program Anda (dan semua substringnya) harus sepenuhnya deterministik, dan harus dalam bahasa yang sama. Suatu program yang jatuh ke dalam infinite loop (yaitu, gagal untuk mengakhiri), bahkan jika pada akhirnya tidak menghasilkan kesalahan dianggap "menghasilkan kesalahan" untuk keperluan tantangan ini.

Celah standar berlaku, termasuk pembatasan quine yang biasa (mis. Tidak bisa membaca kode sumber sendiri).

Misalnya, print("foo")tidak rapuh. Semua substring ini harus salah:

rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"

Yang tidak salah adalah:

print("oo")
print("fo")
print("fo")

Jadi tidak rapuh.

Catatan penting tentang quines

Dengan konsensus , segala kemungkinan quine harus memuaskan ini:

Harus dimungkinkan untuk mengidentifikasi bagian dari program yang mengkodekan bagian yang berbeda dari program. ("Berbeda" artinya kedua bagian muncul di posisi yang berbeda.)

Lebih lanjut, quine tidak boleh mengakses sumbernya sendiri, secara langsung atau tidak langsung.

Contoh

Karena saya menganggap fungsi JavaScript # toString sebagai "membaca kode sumbernya sendiri", saya tidak mengizinkannya. Namun, jika saya tidak melarangnya, ini adalah quine rapuh dalam JavaScript:

f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q

Penguji

Berikut adalah program yang, mengingat kode sumber program Anda, menghasilkan semua program yang harus salah.

let f = (s) =>
  [...Array(s.length).keys()].map(i =>
    s.slice(0, i) + s.slice(i + 1)).join("\n");

let update = () => {
  output.innerHTML = "";
  output.appendChild(document.createTextNode(f(input.value)));
};

input.addEventListener("change", update);

update();
#output {
  white-space: pre;
}

#input, #output {
  font-family: Consolas, monospace;
}
<input id="input" value="print('foo')">
<div id="output"></div>

Conor O'Brien
sumber
Apakah saya diizinkan HQ9 +?
Oliver Ni
1
@OliverNi No
Conor O'Brien
3
Ini membuat asumsi tentang fitur bahasa - tidak semua bahasa memiliki "kesalahan".
Mego
2
@Mego Infinite loop juga diperbolehkan alih-alih kesalahan. Setiap bahasa Turing-lengkap memiliki loop tak terbatas.
feersum
1
@Mego itu tidak relevan. Mengapa repot-repot mengangkat kasus umum jika hanya subset terbatas yang berlaku per masalah?
Conor O'Brien

Jawaban:

6

Burlesque ,32 28 25 byte

{3SHWD{Je!}.+{Sh}\msh}Je!

Coba di sini.

Jadi sebagian besar instruksi dalam Burlesque adalah 2 karakter. Dan jauh lebih mudah untuk menulis quine di Burlesque daripada di Marbelous. Je!atau ^^e!sarana _~dalam CJam.

jimmy23013
sumber
1
Tunggu ... jika ini bukan golf (dan sejauh ini adalah yang terpendek di sini), maka saya tidak bisa membayangkan apa itu golf! +1
Daniel
@Dappapp Masalahnya adalah Burlesque memiliki terlalu banyak instruksi, jadi sangat mungkin saya melewatkan sesuatu.
jimmy23013
11

Python 3, 45 byte

c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)

Beralih ke Python 3 agar baris baru dapat dengan mudah dihapus.

Saya mulai dengan struktur bodoh yang memiliki 2 variabel, bukan 1, tetapi beralih ke 1 variabel hanya membuatnya 4 byte lebih pendek.

- (4 + 3) byte oleh Dennis.

feersum
sumber
tidak tahu tentang penegasan. Kerja bagus
Destructible Lemon
2
Akan lebih bagus jika Anda menambahkan penjelasan.
Sarge Borsch
Menggabungkan execstruktur Anda dengan %trik saya , ada c='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)untuk 48 byte.
Dennis
1
c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)menghemat 3 byte lagi.
Dennis
7

Python, 91/92 67 byte

Ini sangat menyenangkan!

Sekarang saya tahu tentang menegaskan:

s='s=%r;assert len(s)==34;print(s%%s)';assert len(s)==34;print(s%s)

Jika char dari string dihapus, nyatakan kesalahan. Saya akan melakukan ini lebih cepat jika saya tahu fitur ini, tegas.

Lemon dirusak
sumber
2
Saya lupa tentang pertanyaan tambahan baris baru ... jika Anda menghitungnya, maka jawaban kami tidak valid karena dapat dihapus dengan aman.
feersum
7

Python 2, 51 50 46 byte

lambda s='lambda s=%r:s[22:]%%s%%s':s[22:]%s%s

Verifikasi di Ideone .

Dennis
sumber
Quine fungsi memang diizinkan.
Conor O'Brien
1
Hah? Saya belum pernah mendengar tentang fungsi diizinkan sebagai quines ... apakah ada contoh untuk ini?
feersum
@feersum Quine javascript kueri menghasilkan beberapa hasil.
Dennis
@feersum quine Mathematica standar juga berbasis fungsi (menggunakan #0).
Martin Ender
2
Saya baru saja melihat lagi dan sebagian besar JS atau Mathematica quines sebenarnya juga memanggil fungsi. Jadi akan lebih tepat untuk memanggil mereka REPL quines. Yang mengatakan, contoh yang diberikan oleh Conor dalam spesifikasi tantangan ini hanyalah sebuah fungsi, jadi saya kira setidaknya itu berlaku di sini.
Martin Ender
4

C #, 145 byte

_=>{var@s="_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";for(;79!=s.Length;){}System.Console.Write(s,s,'"');};

Saya belum pernah menulis quine di C # sebelumnya, tetapi skor yang lebih tinggi lebih baik di golf, bukan? :)

Infinite loop jika char dihapus dari string atau digit dari magic const 79. Menghapus char lainnya menghasilkan kesalahan kompilasi.

Tidak Disatukan:

/* Action<object> Quine = */ _ => // unused parameter
{
    // String of the function (well, mostly).
    // {0} placeholder for s, so the output contains the function and string.
    // {1} placeholder for " since it requires escaping.
    var@s = "_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";

    // Infinite loop if a char is removed from the above string or if the 7 or 9 is removed.
    for(;79!=s.Length;){}

    // Print the quine.
    System.Console.Write(s,s,'"');
};
susu
sumber
3

JavaScript, 90 byte

a="a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))";a[44]!=')'?x:console.log(a,uneval(''+a))

Bekerja di konsol Firefox 48, dan harus bekerja di lingkungan lain dengan unevaldan console.log. Rincian kesalahan:

a="                                             "; [  ]!=' '?x:           (a       (''+a))   // SyntaxError
   a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))  a 44    )                                  // ReferenceError from calling `x`
                                                               console.     ,uneval          // ReferenceError from calling `onsole.log`, `auneval`, etc.
                                                                       log                   // TypeError from calling `console.og`, etc.
Produksi ETH
sumber
Wow, tidak tahu tentang yang tidak penting. Juga, senang melihat Anda setidaknya kembali! : D
Conor O'Brien
@ ConorO'Brien Senang menjadi (setidaknya agak) kembali! Saya telah diposting beberapa lebih Quine-y jawaban menggunakan teknik ini.
ETHproduksi
2

Python 2, 59 byte

x='x=%r;1/(len(x)==30);print x%%x';1/(len(x)==30);print x%x

Ini melempar a ZeroDivisionErrorjika 0, 3, atau karakter dihapus dari string. Menghapus karakter yang berbeda akan menghasilkan a NameErroratau a SyntaxError.

Daniel
sumber
2

Pohon Pir , 50 byte

a="print('a='.repr(a).';eval(a)');#f+QF>";eval(a)

Cobalah online!

Bukan jawaban terpendek, tetapi jawaban yang cukup komprehensif; penghapusan karakter apa pun dari program ini menyebabkannya gagal melakukan checksum, sehingga penerjemah A Pear Tree bahkan tidak akan mencoba menjalankannya. (Misalnya, Anda mendapatkan kesalahan jika Anda menghapus trailing newline.) Ini ;#f+QF>digunakan untuk memastikan bahwa program secara keseluruhan memiliki CRC-32 dari 0 (dan f+QF>merupakan salah satu dari tiga kemungkinan string 5-byte yang dapat ditempatkan di komentar untuk mencapai itu ketika tinggal di ASCII; menggunakan ASCII penting di sini karena reprakan gagal untuk pulang pergi dengan benar kalau tidak).


sumber