Haskell , 3 quines, 1119 bytes
Quine 1, 51 byte
IO
Pencetakan anonim langsung ke stdout.
putStr`mappend`print`id`"putStr`mappend`print`id`"
Cobalah online!
Quine 2, 265 byte
Fungsi ini f
mengambil 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 LANGUAGE
pragma 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 mappend
dan 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 show
fungsi, 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.
g
adalah 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
show
string digit yang sesuai.
f c=[b=<<g]!!0++show g
adalah fungsi utama. c
adalah argumen bodoh.
b=<<g
gunakan =<<
untuk mengonversi setiap angka g
menjadi karakternya. (Penggunaan =<<
bukannya misalnya map
adalah mengapa b
perlu membungkus karakter yang dikembalikan dalam daftar.)
show g
memberikan representasi string dari g
daftar, dan ++
menyatukan string.
- Karena
=<<
lebih diutamakan daripada ++
, beberapa bracketing diperlukan. Untuk menghindari penggunaan ()
(dicadangkan untuk quine 3), [...]!!0
indeks 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 LANGUAGE
pragma 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):
q
terikat '\''
, memberikan karakter kutipan tunggal;
_:_:_:_:_:_:_:_:z
terikat __TIME__
, alias string seperti "??:??:??"
, sehingga membuat z
string kosong;
y
terikat 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 v
dimulai dari kiri.
- Untuk sebagian besar karakter
k
, ada yang sesuai &'k'
.
- Ketika
k
adalah '
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.
v
adalah fungsi dari string ke string (data quine dimaksudkan v
menjadi contoh).
k
adalah karakter, x
string, 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?x
adalah 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,f2
adalah 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 f1
dan f2
untuk 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:x
untuk karakter k
prepends &'k'
ke string x
, sedangkan '%':q:'\\':k:q:x
prepends %'\k'
, yang merupakan bentuk Quine data asli mereka.
- Dengan demikian
y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x
adalah 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->x
tidak dapat melakukan apa-apa dengan quine yang dibangun, yang dikembalikan.