Kecurangan Cyclic Quine

19

Konsep

Tulis program yang mengeluarkan kode dalam bahasa pemrogramannya. Kode itu, ketika dieksekusi, harus menampilkan program aslinya.

Aturan

  • Karena ini adalah quine kecurangan, Anda dapat membaca kode sumber asli.
  • Program keluaran pertama harus dalam bahasa yang sama dengan program aslinya.
  • Anda tidak dapat membuat quine biasa. Kedua program harus berbeda.
  • Celah standar berlaku.
  • Ini sehingga jawaban terpendek menang, namun tidak akan dipilih.
dkudriavtsev
sumber
Saya masih belum sepenuhnya yakin apa yang dimaksud dengan semi quine.
Conor O'Brien
@ ConorO'Brien Ini mengeluarkan program yang menampilkan program aslinya
dkudriavtsev
1
Saya melihat. Kata-katanya sangat kabur.
Conor O'Brien
2
Mengapa jawaban terpendek tidak dipilih? Apakah ini Katalog?
ATaco
1
Sebagai catatan, saya menyebutnya quine mutual (tantangan itu membutuhkan bahasa yang berbeda ).
Martin Ender

Jawaban:

28

Bash + coreutils, 11 byte

tr xy yx<$0

Ini mencetak

tr yx xy<$0

Cobalah online!

Pada gilirannya, itu akan dicetak

tr xy yx<$0
Dennis
sumber
1
Bukan cheat dan dalam bahasa yang sama.
denson
8
Saya pikir trperintah ini diarahkan ke $0mana kode sumbernya sendiri. Jadi itu "curang".
Roman Gräf
21

Siput, 0 byte



Program kedua adalah

1

Program pertama menghitung jumlah kecocokan dari pola kosong pada input kosong (yang benar-benar memiliki area 0, tetapi polanya selalu berjalan setidaknya sekali sebagai retasan untuk memungkinkan program memutuskan apa yang ingin mereka cetak pada input kosong). Program kedua dimulai dengan kuantifier (seperti {1}dalam regex), yang menyebabkan kesalahan parse. Karena program tidak berhasil parse, STDOUT adalah string kosong.

feersum
sumber
Saya pikir mungkin ada bahasa yang melakukan ini (yaitu program nol berhasil dengan hasil kosong, tetapi hasil itu tidak melakukan apa pun sebagai program). Saya mencoba HOMESPRING tetapi tidak bisa membuat penerjemah bekerja. Sepertinya Anda menemukan bahasa lain tempat kerjanya. (Apakah Anda memiliki tautan ke juru bahasa?)
20

7 , 2 byte

7 menggunakan set karakter 3-bit, tetapi mengambil input yang dikemas ke dalam byte (dan menurut meta, bahasa dengan set karakter sub-byte dihitung menggunakan byte untuk file pada disk ). Berikut adalah xxddump program:

00000000: 4cf4                                     L.

Saat memberikan file ini ke 7 interpreter, itu akan menampilkan program berikut:

00000000: 4fa6 7f                                  O..

yang kemudian akan menampilkan program aslinya lagi.

Jadi apa yang terjadi di sini? Tidak ada pembacaan sumber yang terlibat (sebenarnya, saya tidak berpikir itu mungkin untuk membaca sumber dalam 7), meskipun bisa dibilang program ini curang dengan cara lain; biarkan aku tahu apa yang kamu pikirkan. Begini cara program bekerja. (Perhatikan bahwa setiap perintah 7 memiliki dua varian, beberapa di antaranya tidak memiliki nama dan tidak dapat muncul dalam program asli. Ada dua belas perintah total, dalam enam pasangan. Saya menggunakan huruf tebal untuk perintah aktif, nonbold untuk pasif perintah, dan dalam kasus di mana perintah aktif tidak memiliki nama, saya memberinya nama yang sama dengan perintah pasif yang sesuai dan bergantung pada huruf tebal untuk membedakan. Dalam kasus di mana keduanya bernama, misalnya 7yang merupakan varian aktif dari1 , setiap perintah mendapatkan namanya sendiri dan huruf tebal hanya penyorotan sintaks.)

231 7 23 Program asli, dibongkar menjadi oktal
231 Dorong 237 ke tumpukan
    23 Dorong 23 ke tumpukan
             (implisit) menambahkan salinan bagian atas tumpukan ke program
      2       Duplikat atas tumpukan (saat ini 23 )
        3      Keluaran atas tumpukan, pop elemen tumpukan kedua

Pada titik ini, 7 penerjemah melihat bahwa bagian atas tumpukan berisi perintah ( 2dan 3) yang tidak dapat diwakili, sehingga lolos dari bagian atas tumpukan, menghasilkan 723(yang mana). Output perintah pertama memilih format output; dalam hal ini, formatnya 7, "format output dengan cara yang sama seperti program". Jadi perintah mendapatkan output dikemas dalam byte. Kemudian program berlanjut:

231 7 23 23
             (implisit) menambahkan salinan bagian atas tumpukan ke program
        2     Duplikat atas tumpukan (saat ini 237 )
          3    Keluaran atas tumpukan, pop elemen tumpukan kedua
           7   Dorong elemen kosong ke tumpukan

Pada titik ini, tidak ada yang lain selain elemen stack kosong pada stack, sehingga program keluar. Kami output 23sebelumnya. Jika kita melarikan diri 237(dan kita harus, karena itu berisi perintah yang tidak terwakili), kita dapatkan 7231. Itu mendapatkan output secara langsung, membuat output akhir dari program 237231(diformat dengan cara yang sama seperti program, yaitu dikemas dalam byte). Itu 4fa67f. (Dapat dicatat bahwa 1sepenuhnya tidak ada gunanya dalam hal mempengaruhi output; satu-satunya alasan di sana adalah untuk membuat dua program berbeda.)

Menjalankan 237231menghasilkan hampir dengan cara yang persis sama; perbedaannya adalah bahwa sia-sia 1berjalan tepat setelah cetakan pertama (dan elemen kosong akan dihapus secara implisit saat kedua akhir program saat ini tercapai). Sekali lagi, 231akhirnya keluaran itu sendiri, 23akhirnya keluaran itu sendiri didahului oleh 7, dan kita dapatkan 231723, program aslinya.

Pengamat mungkin mencatat bahwa kedua program, meskipun memiliki panjang yang sama dalam oktal "asli" bahasa, adalah panjang yang berbeda pada disk. Itu karena program 7 dapat diisi dengan angka 1 bit sewenang-wenang, dan format yang dikemas membuang lapisan tambahan. Begini cara encoding terjadi:

2  3  1  7  2  3
010011001111010011(1...)
4   c   f   4   padding

Dengan kata lain, dua byte, 4C F4cukup untuk mewakili program, jadi hanya itu yang saya gunakan.


sumber
11

Python 3, 297 279 251 243 225 218 208 180 126 111 byte

Tidak curang:

A=''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))

Ini mencetak:

B=''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))

yang, ketika dijalankan, mencetak program asli.

L3viathan
sumber
Wow! Keren! Saya tidak akan pernah memikirkan itu.
dkudriavtsev
8

Batch, 14 byte

@echo @type %0

Yang mana dijalankan sebagai cyclicquine.batoutput

@type cyclicquine.bat

Yang ketika dijalankan menghasilkan file batch asli.

Neil
sumber
8

RProgN , 4 Bytes.

Masyarakat tampaknya menganggap hal semacam ini sebagai selingkuh curang , yang dengan demikian memenuhi kriteria.

1
2

Dengan baris baru yang tertinggal.

Ini mencetak

2
1

Dengan baris baru tambahan, yang mencetak kode pertama.

RProgN mencetak tumpukan yang muncul, jadi dari atas ke bawah.

Cobalah online!

ATaco
sumber
Ada diskusi obrolan beberapa waktu lalu yang menyiratkan bahwa 1\n1\ndalam RProgN akan menjadi quine yang tidak curang, karena masing-masing 1s saling mencetak (dan itu hanya akan dianggap curang jika masing-masing 1 dicetak sendiri). Semua ini benar-benar menyiratkan bahwa menipu dalam quines kadang-kadang sulit untuk didefinisikan. (Namun, jawaban ini benar cara baik, karena pertanyaan tidak benar-benar membutuhkan yang Quine untuk menipu, hanya memungkinkan itu.)
Juga, Meskipun saya enggan mengatakan, dalam RProgN 1\nsecara teknis quine yang valid, karena 1tidak konstan, tetapi panggilan ke fungsi yang mendorong 1ke stack.
ATaco
Ada beberapa definisi quine yang layak digunakan. Itu tidak valid oleh setidaknya satu, tetapi mungkin valid oleh beberapa yang lain.
@ ais523 Anda telah memicu rasa ingin tahu saya, Anda menentukan RProgN, namun saya tidak berpikir bahwa bahasa kecil saya mendapat banyak perhatian (atau apa pun). Apakah obrolan tentang RProgN khususnya, atau bahasa dengan sintaksis yang sama?
ATaco
Itu sekitar 7 , yang juga memiliki kecenderungan untuk mencetak segmen program "mundur". Saya memperkirakan dari pendapat yang diberikan di sana.
6

Jolf, 6 byte

1q_a_q

Saat dijalankan, ini menghasilkan:

q_a_q1

Yang pada gilirannya menghasilkan 1q_a_q.

Coba di sini!

Penjelasan

1q_a_q
1       the digit one (ignored)
 q      the source code (ignored)
     q  the source code
    _   reversed
   a    and outputted
 _      and reversed (ignored)

q_a_q1
q       the source code (ignored)
     1  the digit one (ignored)
    q   the source code
   _    reversed
  a     and outputted
 _      and reversed (ignored)
Conor O'Brien
sumber
5

JavaScript (ES6), 69 60 59 byte

(_0=_=>console.log(`(_0=${_0})()`.replace(/0/g,n=>+!+n)))()

Output:

(_1=_=>console.log(`(_1=${_1})()`.replace(/1/g,n=>+!+n)))()

-1 byte (@ETHProductions): gunakan 0 pada regex alih-alih \ d

Darrylyeo
sumber
Coba n=>1-nalih-alih n=>+!+n.
Conor O'Brien
@Conner O'Brien Sayangnya 1akhirnya akan diganti oleh regex.
darrylyeo
@ ETHproductions Heh, aku seharusnya memikirkan itu.
darrylyeo
3

Bash + Sed, 15 byte

Gagasan yang sama dengan Jawaban Dennis .

sed y/xz/zx/ $0
Tidak Ada Di Sini
sumber
3

Bash, Cat, and Rev, 19 16 byte

rev $0 # 0$  ver

-3 Terima kasih kepada @izabera

Tidak Ada Di Sini
sumber
Bukankah ini Bash, Tacdan `Rev?
Conor O'Brien
rev $0 # 0$<space><space>veruntuk beberapa alasan saya tidak dapat memberikan dua spasi dalam komentar
izabera
Oh, bagus @izabera
NoOneIsHere
@ ConorO'Brien Tidak, tac rev-ed adalah cat.
NoOneIsHere
@SeeOneRhino Oh .... Begitu
Conor O'Brien
1

> <>, 16 byte

"$r00gol?!;50.01

Coba di sini!

Keluaran

"$r00gol?!;50.10

Ini adalah modifikasi dari yang disediakan di sini . Saya tidak yakin apakah itu curang, itu membaca codebox dan mengeluarkannya.

redstarcoder
sumber
1
Anda dapat mengubah 00g menjadi: 2- dan itu akan menjaga jumlah byte yang sama tanpa membaca kotak kode.
Teal pelican
@Tealpelican, terima kasih! Tujuannya agar dianggap "curang": hlm. (Dan saya tidak sepenuhnya mengerti aturan itu)
redstarcoder