Tantangan
Buat dua program, A dan B, yang keduanya merupakan program kucing dalam bahasa yang sama. Ketika digabungkan, AB (juga dalam bahasa yang sama) harus berupa quine.
Misalnya, anggap hello
dan world
keduanya adalah program kucing dalam bahasa XYZ. Jika helloworld
quine dalam bahasa tersebut, maka solusi Anda valid.
Bagi Anda yang tidak terbiasa dengan kucing dan quines, program kucing adalah yang mencetak persis apa yang diberikan kepadanya melalui stdin dan quine adalah program yang mencetak kode sumbernya sendiri.
Penilaian dan Aturan
- Hitungan byte total dari program AB gabungan adalah skor Anda. Karena ini golf kode, skor terendah akan menang.
- Celah standar dilarang
- Input harus diambil dari stdin dan output harus pergi ke stdout.
- Program kucing tidak perlu mengambil argumen; mereka hanya perlu menyalin stdin ke stdout.
- Quine harus bekerja ketika program tidak diberi input, tetapi tidak harus bekerja dengan benar (tetapi mungkin) untuk input lainnya.
- Quine tidak perlu diakhiri, asalkan mencetak persis kode sumbernya sekali, tidak lebih.
- Quine harus berukuran setidaknya satu byte.
- A dan B dapat berupa program yang sama.
- BA tidak perlu menjadi quine atau bahkan program yang valid.
AB
tidak boleh kosong, karena banyak bahasa memiliki 0-byte cat yang memungkinkan quine 0-byte.Jawaban:
V , 2 + 2 == 4 byte
Coba quine!
Coba kucingnya!
A adalah
2i
B juga
2i
Bagaimana cara kerjanya?
Pertama, beberapa penjelasan tentang cara kerja V. Satu hal penting yang memungkinkan jawaban ini adalah bahwa di V, program kosong adalah program kucing. Ini bukan kasus khusus, ini melekat pada bagaimana V beroperasi. Pada startup, semua input dimuat ke dalam "buffer", setiap perintah memodifikasi buffer di suatu tempat, dan kemudian ketika program selesai, buffer dicetak secara implisit. Ini berarti bahwa setiap string NOP juga merupakan program kucing.
The
i
sarana perintah masuk insert modus , yang berarti setiap karakter menyusuli
akan ditambahkan ke dalam buffer. Dengan nomor sebelumnya, teks itu akan digandakan n kali.Ini berarti bahwa untuk program kucing, tidak ada yang akan ditambahkan ke buffer, dan itu akan dicetak saat dibaca. Dengan kata lain:
Tetapi untuk quine, ada teks setelah
i
:Nakal tidak menjawab
V , 0 byte
Cobalah online!
A adalah program kosong.
B juga merupakan program kosong.
: P
sumber
Ruby, 71 byte
Dapat dipecah menjadi kucing sebagai berikut:
dan
Kedua kucing identik kecuali 2 yang memimpin, yang merupakan no-op di ketiga program. Ini
<<2
adalah herestring, artinya segala sesuatu yang dimulai pada baris berikutnya sampai 2 terminasi pada barisnya sendiri adalah string, yang kita gabungkan dengan sendirinya (*2
) dan menambahkan trailing 2. Pada kucing, herestring terbentuk dengan baik tetapi kosong, jadi ekspresi reguler tidak akan cocok dengan itu dan kami akan jatuh ke$<.read
ekspresi dan output STDOUT. Namun, setelah kami melakukan concat pada kucing, string tidak akan berhenti sampai baris ketiga, jadi regex cocok dan kami melakukan hubungan pendek dan mengeluarkan quine.sumber
Pyth,
29 byte (5 + 24)27 byte (5 + 22)Itu tadi menyenangkan.
Coba quine di sini.
Coba kucing pertama di sini.
Coba kucing kedua di sini
Penjelasan
sumber
C # (Visual C # Compiler) , 551 byte
A: 95 byte
Cobalah online!
B: 438 + 18 byte
Cobalah online!
A + B: 533 + 18 byte
Cobalah online!
A dan B menerima input sebagai argumen baris perintah. A + B mengabaikan input apa pun. 18 byte pada B dan A + B ditambahkan untuk
/p:StartupObject=B
opsi yang dikirim ke MSBuild. Ini hanya benar-benar diperlukan pada A + B, tetapi sepertinya curang untuk tidak juga memilikinya di B. Dengan cara ini, bendera kompiler untuk A + B adalah bendera kompiler untuk A (tidak ada) ditambah bendera kompiler untuk B.Penjelasan
Program A sangat mudah. Kelas A berisi variabel statis (tidak terpakai)
i
diinisialisasi ke2
, dan mencetak argumen pertamanya ketika dijalankan. Pada//
akhirnya adalah penting untuk kode A + B, tetapi tidak melakukan apa pun dalam A itu sendiri.Program B aneh dalam isolasi, tetapi pada dasarnya sama. Itu menciptakan Kelas A yang berisi variabel statis
i
diinisialisasi ke0
, dan kemudian menjalankan metode Utama Kelas B, yang melakukan hal yang sama dengan Program A karenaA.i
kurang dari 1, dan kembali sebelum hal-hal aneh. Baris baru tidak diperlukan di sini, tetapi penting untuk A + B.Ketika digabungkan,
//
dari Program A mengomentari deklarasi Kelas A dari Program B, tetapi karena baris baru, Kelas B baik-baik saja, yang memungkinkanA.i
untuk merujuk pada2
nilai dari Program A sebagai gantinya. Bendera Kompiler membuat Program dijalankan B. Utama () karena A. Utama () juga ada. Hasilnya adalah bahwa Program A + B tidak menampilkan argumennya, tetapi sebaliknya menuju ke segmen B.Main (), yang pada dasarnya hanyalah standar C # quine .sumber
Haskell , 116 + 20 =
187175174136 byteBanyak byte yang disimpan sejak Ørjan Johansen menunjukkan kepada saya
interact
Kucing 1
Cobalah online!
Kucing 2
Cobalah online!
Quine
Cobalah online!
Prinsip dasar yang bekerja di sini adalah bahwa ketika kita menambahkan kucing kedua ke kucing pertama kita mengubah nama fungsi yang berinteraksi dengan kita dari
a
menjadiidmain
. Karenainteract id
kucing, kami inginidmain
saya fungsi yang mengembalikan quine. Solusi yang jelas akan digunakanconst
, namun karena kita dapat menganggap inputnya adalah(++)
karya kosong juga. Dari sini kami menemukan kode sumber melalui sarana standar cantik, kami memiliki variabelg
yang menyandikan sumber dan kami menggunakan pembungkus khusus untuk mencetaknya dalam bentuk string dan bentuk kode. Ada sedikit pengecualian bahwa kita perlu meletakkan encoder kita di depan karena kita sudah harus mengakhirinyainteract id
. Ini berarti tambahang=
tidak dikodekan dan harus ditangani secara manual. Kucing kita berikutnya cukup standar kecuali kita harus membuatnya menjadi kode yang valid ketika ditempelkan ke ujung kucing lain sehingga kita membutuhkan kedua kucing itu sebagai contoh penjaga pola.Strategi Alternatif, 43 + 105 =
186148Kucing 1
Cobalah online!
Kucing 2
Cobalah online!
Quine
Cobalah online!
sumber
getContents
+putStr
denganinteract id
. Cobalah online! (Quine tidak lagi berfungsi dengan input non-kosong, yang memungkinkan menggunakan(++ ...)
bagian untukidmain
.)interact
, saya kira itu karena saya jarang melakukan hal-hal IO dengan Haskell. Saya telah mengedit pos.Python 3, 286 byte
Golf Python pertamaku dan quine pertamaku! Tidak terlalu elegan, tetapi berhasil.
Program A (238 byte)
(tidak ada baris baru)
Program B (48 byte)
(tidak ada baris baru)
Cobalah secara Online
Ucapan Terima Kasih
sumber
end=open...
dan menggunakan%r
daripada%s
tidak harus melakukan baris baru dan kutipan%r
. Tidak yakin apa yang Anda maksud tentang baris baru.%s
memformat baris baru, Anda bisa melakukan literal\n
. Anda juga dapat menggunakan;
untuk memecah pernyataan alih-alih\n
(kecualiif
kebutuhan harus sesuai keinginannya).%
dapat lolos dalam string dengan melakukan%%
. Satu-satunya argumen yang diperlukan untuk memformat string adalah string itu sendiri, segala sesuatu yang lain dapat dikupaslocals()
untuk menyimpan 2 byte.C ++ (dentang) , 313 + 102 = 415 byte
Program A (berakhir di baris baru):
Program B (tidak berakhir di baris baru):
Tidak terlalu licik, dan seperti biasa C ++ tidak terlalu bagus untuk quining. Saya tidak akan terkejut jika ada cara untuk mencukur byte di sana-sini dengan ide yang sama. Tangkapan kecil adalah mengubah perilaku sesuatu setelah itu telah ditetapkan, dan penginisialisasi variabel dinamis dengan efek samping melakukan trik. (Bisakah ini dilakukan di C tanpa ekstensi kompiler?)
Cobalah online: A , B , AB
(Satu-satunya masalah portabilitas yang saya ketahui adalah bahwa program ini mengasumsikan
<cstdio>
menempatkan nama baik di namespace global dan jugastd
.)sumber
Befunge-98 (FBBI) , 8 + 15 = 23 byte
A + B: (hanya berfungsi tanpa input)
Cobalah online!
SEBUAH:
Cobalah online!
B:
Cobalah online!
sumber
Python 3 , 100 + 37 = 137 byte
Program A:
Cobalah online!
Program B:
Cobalah online!
Jadikan Quine AB
Cobalah online!
Hanya berfungsi ketika input kosong, jika tidak maka input akan ditambahkan ke output.
sumber
Attache , 15 + 126 = 141 byte
SEBUAH:
Cobalah online!
B:
Cobalah online!
A + B:
Cobalah online!
Penjelasan
Setiap program kucing mengkodekan
AllInput[]|Echo
, yang merupakan program kucing sederhana. B adalah fase quine utama; sendirian, itu adalah fungsi vektor (melalui unary@
) yang disebut tanpa input (disebut sebagai|Call
). Dengan demikian, kondisional pertamaIf[_,A,B]
dijalankanB
, yang sederhanaAllInput[]|Echo
.Ketika A + B dieksekusi, unary
@
menjadi biner@
karenaEcho
bergabung dengan lambda:Ini berarti lambda dieksekusi sebelumnya
Echo
. Kembali ke persyaratan, fungsi ini sekarang memiliki semua STDIN sebagai argumen. Jadi,If[_,A,B]
jalankanA
, yang merupakan kerangka standar quine.sumber
Stax , 16 + 12 = 28 byte
Kucing 1:
Jalankan dan debug itu
Kucing 2:
Jalankan dan debug itu
Quine:
Jalankan dan debug itu
sumber
Kucing 1:
Lua , 41 byte
Cobalah online!
Kucing 2:
Lua , 70 byte
Cobalah online!
Quine:
Lua , 111 byte
Cobalah online!
io.input(arg[0])
di Cat 2 mengatur file saat ini sebagai input standar, dan sebagai hasilnya, kucing mencetak kode sumbersumber
> <> , 12 +3 = 15 byte
Program A:
Cobalah online!
Dan Program B:
Cobalah online!
Jadikan Program AB:
Cobalah online!
sumber
JavaScript (Node.js) , 199 byte
Cobalah online!
Cat A, 57 byte
Cobalah online!
Cat B, 142 byte
Cobalah online!
sumber