Chain Quine Bidirectional

9

PPCG belum memiliki cukup quines ...

Tantangan:

Tugas Anda adalah membuat program "A0". Ketika program ini dijalankan tanpa input, tidak menghasilkan apa-apa. Ketika program ini dijalankan dengan input, output "A1". Ketika "A1" dijalankan tanpa input, output "A0". Ketika "A1" dijalankan dengan input, output "A2". Cukup banyak, "A (k)" akan menampilkan "A (k-1)" saat dijalankan tanpa input, dan akan menampilkan "A (k + 1)" saat dijalankan dengan input.

Detail

Saya percaya tantangan ini cukup sederhana; tidak ada aturan lain kok. Omong-omong, setiap program harus mengandung setidaknya 1 byte. Anda dapat berasumsi bahwa input hanya akan terdiri dari karakter ASCII, dan Anda dapat mengabaikan spasi jika Anda inginkan, tetapi Anda mungkin tidak menentukan input tertentu. Outputnya bisa berupa STDOUT atau STDERR, tetapi semua program Anda harus di-output ke yang sama. Yang lain juga dapat berisi teks (jadi Anda dapat output ke STDOUT dan kemudian keluar dengan kesalahan) Terima kasih kepada @Dennis karena menunjukkannya.

Semua program harus dalam bahasa yang sama, dan setiap program harus unik dari yang lain.

Skor sama dengan panjang program "A0". Karena ini adalah tantangan kode-golf, skor terendah akan menang!

HyperNeutrino
sumber
Saya sedih untuk memprediksi bahwa sebagian besar pengiriman akan memiliki A (k) dan A (k + 1) berbeda dengan satu karakter yang ditambahkan ke string yang sedang berkembang :(
Sparr
@Sparr Sayangnya, mungkin itulah yang akan terjadi. :( Oh well, saya tidak tahu bagaimana membuat aturan yang jelas terhadap hal itu.
HyperNeutrino
Anda hanya dapat menampilkan salah satu dari dua hal yang saya tidak yakin jika saya menafsirkannya dengan benar. Jika kita mencetak output yang diinginkan ke STDOUT, apakah STDERR harus kosong? Karena itu diperbolehkan untuk keluar dengan kesalahan.
Dennis
Haruskah semua program berbeda? Pertanyaannya tidak mengatakan itu.
4
Juga, bolehkah saya menyarankan judul yang sedikit lebih ekspresif seperti "Rantai Dua Arah Bidirectional"? "super meta quine" tidak mengatakan banyak hal selain program yang mencetak program lain dan akan membuat lebih sulit untuk mencari tantangan ini di masa depan.
Martin Ender

Jawaban:

1

Pip , 28 byte

V Y"I#qSti0+i?`V Y`.RPyRtiu"

Cobalah online!

Penjelasan

Ini adalah versi modifikasi dari quine Pip terpendek yang diketahui V Y"`V Y`.RPy". Quine itu bekerja dengan mendefinisikan string, menariknya ke dalam yvariabel, dan kemudian mengevaluasinya. Ketika dievaluasi, string mengambil repr dari y(sehingga membungkus nilai ydalam tanda kutip ganda) dan menyatukan pola literal `V Y`ke depannya.

Strategi kami adalah memasukkan sebuah ke 0dalam program, lalu ganti 0dengan 10jika ada input, atau ganti 10dengan 0jika tidak ada input. (Dengan demikian, A ( k ) akan berisi angka yang terdiri dari k 1 diikuti oleh 0.) 0dan 10nyaman karena ada variabel bawaan ( idan t, masing-masing) dengan nilai-nilai tersebut, sehingga kami dapat merujuknya tanpa menggunakan angka aktual .

Jadi alih-alih RPy, kami ingin RP yRitjika ada input dan RP yRtijika tidak. Kita dapat menggabungkan dua kasus dengan menukar nilai tdan ijika ada input ( I#q Sti), lalu lakukan RP yRti. (Kita harus menguji #q, panjang input, karena input suka 0adalah falsey.)

Sekarang kita hanya perlu mendapatkan literal 0dalam kode dan menangani kasus khusus A0 yang tidak menghasilkan output. Keduanya dapat diselesaikan dengan menguji 0+idan mengembalikan ujika itu salah:

  • Untuk setiap k > 0, angka dalam A ( k ) akan menjadi nol dan karenanya benar (misalnya 110+i).
  • Untuk k = 0, angka dalam A ( k ) akan menjadi nol:
    • Jika ada input, idan tditukar dan i10. 0+imasih benar.
    • Jika tidak ada input, imasih 0 dan 0+ifalsey. Alih-alih inti quine, kita output u, yang merupakan variabel bawaan untuk nil. Mencetak nil tidak menghasilkan keluaran.
DLosc
sumber
Kerja bagus! Bekerja seperti pesona.
HyperNeutrino
1

Python 2, 93 byte

Ada linefeed baris tambahan.

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

Coba dengan input | Cobalah tanpa masukan

Ini dimodifikasi dari jawaban saya pada pertanyaan serupa.

Jika ada input, maka akan bertambah p. Sehingga program yang dihasilkan akan p=2+..., p=3+..., dll

mbomb007
sumber
Ini tidak mengenali 0 sebagai input
fəˈnɛtɪk
@LliwTelracs Input harus dikelilingi tanda kutip (harus menyengat). Lihat hyperlink dalam jawabannya.
mbomb007
Seperti apa adanya, program Anda bekerja dengan string dan semua angka selain 0.
fəˈnɛtɪk
1
@LliwTelracs Baiklah jangan coba-coba menggunakan angka. Menurut konsensus, saya dapat menggunakan input()dan membutuhkan input untuk dikelilingi oleh tanda kutip, daripada menggunakan raw_input(). Jika Anda ingin memasukkan nol, gunakan "0".
mbomb007
Solusi bagus! Saya mengharapkan sebagian besar jawaban panjangnya tak terbatas (secara teknis ini tidak tetapi tidak dalam arti yang sama). Kerja bagus!
HyperNeutrino