Haskell , 3 quines, 1119 bytes
Quine 1, 51 byte
IOPencetakan anonim langsung ke stdout.
putStr`mappend`print`id`"putStr`mappend`print`id`"
Cobalah online!
Quine 2, 265 byte
Fungsi ini fmengambil argumen dummy dan mengembalikan string.
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,90,52,82,89,52,51,51,94,84,24,24,39,34,34,106,95,102,110,0,94,50,89,0,90,52,82,82,82,106,95,102,110,0,48,24,24,39,35,106,95,102,110,0,40,24,24,39,37,37,84,24,24,45,37,37,84,24,24,90,84,50,94,52]
Cobalah online!
Quine 3, 803 bytes
Segala sesuatu setelah LANGUAGEpragma adalah fungsi anymous mengambil argumen dummy dan mengembalikan string.
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&'#'&'L'&'A'&'N'&'G'&'U'&'A'&'G'&'E'&' '&'C'&'P'&'P'&'#'&'-'&'}'&'('%'\\'&'q'&'('&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'z'&')'&'y'&'('&'#'&')'&'_'&'-'&'>'&'('&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'&'%'\''&':'&'q'&':'&'k'&':'&'q'&':'&'x'&')'&'#'&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'%'%'\''&':'&'q'&':'%'\''%'\\'%'\\'%'\''&':'&'k'&':'&'q'&':'&'x'&')'&'$'&'y'&'('&':'&')'&'#'&'y'&'('&':'&')'&'$'&' '%'\\'&'x'&'-'&'>'&'x'&')'&'z'&')'%'\''%'\\'%'\''%'\''&'_'&'_'&'T'&'I'&'M'&'E'&'_'&'_'&'('%'\\'&'('&'?'&')'&'v'&' '&'k'&' '&'x'&'-'&'>'&'v'&'$'&'k'&'?'&'x'&')'&'$'&' '%'\\'&'('&'&'&')'&'('&'%'&')'&'v'&'-'&'>'&'v'
Cobalah online!
Karakter
Quine 1:
"S`adeimnprtu
Quine 2:
!+,.0123456789;<=[]bcfghosw
Quine 3:
#$%&'()-:>?ACEGILMNPTU\_kqvxyz{}
Bagaimana itu bekerja
Quine 1
putStr`mappend`print`id`"putStr`mappend`print`id`"
Quine 1 adalah versi modifikasi dari Golf terbaru saya , Anda jawaban quine (dengan perbaikan oleh H.PWiz):
- Karena program penuh tidak diperlukan,
main=telah dihapus.
<>dan $telah digantikan oleh sinonim mappenddan dekat mereka id.
Ini membebaskan karakter vital =<>dan operator yang membantu $untuk quines lainnya.
Quine 2
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,......]
Quine 2 menggunakan metode yang agak mirip untuk memprogram 2 jawaban Mutual Exclusive Quines saya yang baru-baru ini , tetapi diadaptasi untuk quine sendiri secara langsung dan terutama untuk menghindari penggunaan literal karakter, yang diperlukan untuk quine 3. Kedua hal ini dicapai dengan bantuan showfungsi, yang oleh keberuntungan semata belum memiliki karakter yang digunakan.
Quine ini menggunakan tab bukan spasi, tapi saya telah menggunakan spasi di bawah ini untuk keterbacaan.
gadalah data quine, sebagai daftar bilangan bulat di akhir kode. Setiap angka mewakili karakter dari sisa kode.
- Angka-angka digeser oleh
9, sehingga tab itu 0. Ini membuat pengodean sedikit lebih pendek dengan memungkinkan huruf kecil untuk fungsi dan nama variabel agar sesuai dalam 2 digit.
b c=[[[show 9!!0,show 1!!0..]!!6..]!!c] adalah fungsi untuk mengubah angka menjadi karakter (sebenarnya string satu karakter).
[[show 9!!0,show 1!!0..]!!6..]adalah rentang karakter yang dimulai dengan karakter tab, yang diindeks menjadi !!c.
- Karakter tab itu sendiri diproduksi oleh pengindeksan ke rentang lain
[show 9!!0,show 1!!0..], dimulai dengan karakter digit '9'dan '1'dan melompat turun dalam langkah 8.
- Karakter digit diproduksi dengan mengindeks ke dalam
showstring digit yang sesuai.
f c=[b=<<g]!!0++show gadalah fungsi utama. cadalah argumen bodoh.
b=<<ggunakan =<<untuk mengonversi setiap angka gmenjadi karakternya. (Penggunaan =<<bukannya misalnya mapadalah mengapa bperlu membungkus karakter yang dikembalikan dalam daftar.)
show gmemberikan representasi string dari gdaftar, dan ++menyatukan string.
- Karena
=<<lebih diutamakan daripada ++, beberapa bracketing diperlukan. Untuk menghindari penggunaan ()(dicadangkan untuk quine 3), [...]!!0indeks ke dalam daftar dengan satu elemen.
Quine 3
Dengan desain quine lain, quine 3 masih memiliki akses ke tanda kurung, ekspresi lambda, literal karakter, dan konstruktor string / daftar :. Ini akan cukup untuk membangun fungsi yang menambahkan kode quine ke string.
Sayangnya, semua huruf kecil (kecuali kadang-kadang y) telah digunakan, tanpa meninggalkan fungsi alfanumerik bawaan yang berguna. Juga []""sudah pergi. Ini tidak meninggalkan cara normal untuk membangun string kosong untuk mulai berpura-pura kode.
Namun, hampir semua huruf besar masih tersedia, jadi LANGUAGEpragma untuk mendapatkan ekstensi bahasa dimungkinkan. Sekali lagi oleh keberuntungan belaka, CPP(memungkinkan C preprocessor) adalah satu-satunya ekstensi bahasa bernama hanya dengan huruf besar. Dan makro CPP sering memiliki nama huruf besar.
Jadi untuk mendapatkan string kosong yang esensial, quine memungkinkan CPP, menggunakan __TIME__makro untuk mendapatkan string konstan dari bentuk "??:??:??"(mudah dijamin selalu memiliki panjang yang sama), dan kecocokan pola di atasnya.
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&......
Setelah pragma bahasa, quine terdiri dari ekspresi lambda yang mengikat parameternya ke empat argumen ini (meninggalkan parameter dummy akhir _untuk diterapkan kemudian):
qterikat '\'', memberikan karakter kutipan tunggal;
_:_:_:_:_:_:_:_:zterikat __TIME__, alias string seperti "??:??:??", sehingga membuat zstring kosong;
yterikat pada (\(?)v k x->v$k?x), kombinator lambda yang digunakan untuk membantu mengubah data quine dari kiri terkait ("foldl") ke kanan terkait ("foldr") formulir;
- Operator
(#)terikat \(&)(%)v->v&'{'&'-'&..., data quine itu sendiri.
Data quine diberikan dalam bentuk pengkodean Gereja, ekspresi lambda dengan parameter (&)(%)v.
- Dengan menerapkan ekspresi pada nilai-nilai tertentu untuk instantiate
(&), (%)dan v, pengkodean ini dapat digunakan baik untuk membangun kode inti quine atau untuk membangun kembali representasi data quine itu sendiri.
- Dengan aturan fixity default Haskell,
&dan %menjadi operator asosiatif kiri di dalam lambda. Dengan demikian parameter karakter digabungkan dengan awal yang vdimulai dari kiri.
- Untuk sebagian besar karakter
k, ada yang sesuai &'k'.
- Ketika
kadalah 'atau \, yang perlu melarikan diri dalam karakter literal, pengkodean adalah bukan %'\k'.
Karena pengkodean data adalah asosiatif kiri, tetapi string dibangun dengan cara asosiatif yang tepat, kombinator y = (\(?)v k x->v$k?x)diperkenalkan untuk menjembatani ketidakcocokan.
y(...)dimaksudkan untuk membangun fungsi yang sesuai untuk digunakan sebagai data quine (&)dan (%)operator.
vadalah fungsi dari string ke string (data quine dimaksudkan vmenjadi contoh).
kadalah karakter, xstring, dan ?operator yang menggabungkannya menjadi string baru. (Untuk kode inti (?)=(:),. Untuk benar-benar merekonstruksi representasi data quine, ini lebih rumit.)
- Dengan demikian
y(?)v k = \x->v$k?xadalah fungsi lain dari string ke string.
Sebagai contoh bagaimana ini mengubah asosiatif, jika (&)=y(:):
(v&k1&k2&k3) x
= (((v&k1)&k2)&k3) x
= y(:)(y(:)(y(:)v k1)k2)k3 x
= y(:)(y(:)v k1)k2 (k3:x)
= y(:)v k1 (k2:(k3:x))
= v (k1:(k2:(k3:x)))
= v (k1:k2:k3:x)
Lebih umum, kapan (#)fungsi data quine dan f1,f2adalah fungsi menggabungkan karakter dengan string:
(y(f1)#y(f2)$v) x
= (...(y(f1)(y(f1)v '{') '-')...) x
= v(f1 '{' (f1 '-' (... x)))
menerapkan fungsi data quine dengan (&)=y(f1)dan (%)=y(f2), dan ini menggunakan yang ditentukan f1dan f2untuk menggabungkan karakter data quine dengan x, dan kemudian meneruskan string yang dihasilkan ke v.
Tubuh ekspresi lambda utama menyatukan semua ini:
(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z
'&':q:k:q:xuntuk karakter kprepends &'k'ke string x, sedangkan '%':q:'\\':k:q:xprepends %'\k', yang merupakan bentuk Quine data asli mereka.
- Dengan demikian
y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:xadalah parameter yang tepat untuk membangun kembali representasi data quine, diawali dengan final z(string kosong), dan kemudian diteruskan ke fungsi berikut.
y(:)#y(:) adalah parameter yang tepat untuk menambahkan kode inti quine ke string, tanpa modifikasi lainnya.
- Akhirnya
\x->xtidak dapat melakukan apa-apa dengan quine yang dibangun, yang dikembalikan.