Kami memiliki banyak tantangan quine , tetapi banyak format quine serupa, mari kita buat beberapa varian di quine kami.
Tugas Anda adalah membuat pilihan program dalam bahasa yang sama (setidaknya 2), yang semuanya menghasilkan kode sumber mereka sendiri, namun, tidak satu pun dari program ini dapat membagikan karakter apa pun.
Misalnya, jika Anda membuat program menggunakan:
printf+qw(printf+qw(%s)x2)x2
Program Anda berikutnya tidak dapat mencakup:
%()+2finpqrstwx
dan seterusnya.
Aturan
- Anda dapat menggunakan karakter unicode, tetapi Anda masih harus mencetak dalam byte.
- Semua program harus memenuhi definisi komunitas tentang quine yang tepat . Ini berarti bahwa string kosong tidak dihitung sebagai quine yang valid, antara lain.
- Celah standar dilarang.
- Fungsi atau program lengkap diizinkan selama memenuhi definisi di atas.
- Simbol bahasa independen (termasuk Bahasa dan Kepal) dilarang.
- Sebagian besar program menang, dengan kode total terpendek sebagai tie breaker.
code-challenge
restricted-source
quine
Dom Hastings
sumber
sumber
Jawaban:
V ,
3, 5 quines, 46 byteCobalah online!
Hexdump:
Penjelasan:
Cobalah online!
Hexdump:
Penjelasan:
Cobalah online!
Hexdump:
Penjelasan:
Di sinilah mereka mulai menjadi funky ...
Cobalah online!
Hexdump:
Penjelasan:
Cobalah online!
Hexdump:
Penjelasan:
Jawaban ini dipenuhi dengan ilmu hitam. Quines 1 dan 4 bukanlah hal baru, tetapi 3 lainnya semuanya belum pernah ditemukan sebelumnya, jadi lebih dari setengah quine ini baru ditemukan hari ini.
sumber
normie :p
"REEEEEE--
Jelly ,
2 3 45 quines,14 18 81 65 59 56 326 265 247 229216 byte3 byte
Cobalah online!
Quine standar.
”Ṙ
adalah karakter satu karakter untukṘ
.Ṙ
mencetak representasi string ini kemudian string tersebutṘ
secara implisit dicetak.4 byte
Cobalah online!
⁾
memulai dua karakter string literal danḤ
menggandakan argumennya. Dengan input string,Ḥ
dipetakan ke setiap karakter. JadiḤ
bertindak pada⁾Ḥ
hasil string⁾⁾ḤḤ
, kode sumber.11 byte
Cobalah online!
Di sisi kanan,
“ȮṾṖƊ}
adalah string literal untukȮṾṖƊ}
. Karakter penutup string secara diam-diam ditambahkan di EOF.Di sebelah kiri string literal,
Ɗ
membungkusȮṾṖ
menjadi monad tunggal dan}
mengubahnya menjadi angka dua yang menggunakan argumen yang benar itu, string literal.Ȯ
mencetak string (ȮṾṖƊ}
),Ṿ
membuat representasi string dari string (“ȮṾṖƊ}”
) danṖ
menghapus”
karakter. String“ȮṾṖƊ}
dibiarkan setelah monad dan dicetak secara implisit.38 4936 byteCobalah online!
Pertama kali saya pernah menggunakan spasi di Jelly golf.
Daftar angka di awal menyimpan
ord
sisa karakter dalam kode. Setelah itu:270 198 180162 byteCobalah online!
Menggunakan angka dasar 250 dan indeks ke halaman kode Jelly. Disimpan 72 byte dengan mengubah algoritma. Sudah menggunakan setiap nomor untuk mengindeks ke halaman kode Jelly tetapi saya sekarang mengkonversi integer kembali ke basis 250 kemudian mengindeks ke halaman kode Jelly, pada dasarnya mengurangi separuh jumlah liter yang saya butuhkan di baris pertama. Ini juga mengurangi jumlah karakter unik yang diperlukan, tetapi saya tidak bisa memikirkan cara untuk membuat quines lagi.
Saya telah menggunakan
⁾“”
yang membuat string literal danỌ
danØJ
yang membuat string dari angka. Saya tidak bisa memikirkan cara lain untuk membuat string. Saya masih memiliki digit9
dan‘’
tersedia, jadi jika ada cara lain untuk membuat string dari angka, dimungkinkan untuk membuat quine lain.sumber
Haskell , 3 quines, 1119 bytes
Quine 1, 51 byte
IO
Pencetakan anonim langsung ke stdout.Cobalah online!
Quine 2, 265 byte
Fungsi ini
f
mengambil argumen dummy dan mengembalikan string.Cobalah online!
Quine 3, 803 bytes
Segala sesuatu setelah
LANGUAGE
pragma adalah fungsi anymous mengambil argumen dummy dan mengembalikan string.Cobalah online!
Karakter
Quine 1:
Quine 2:
Quine 3:
Bagaimana itu bekerja
Quine 1
Quine 1 adalah versi modifikasi dari Golf terbaru saya , Anda jawaban quine (dengan perbaikan oleh H.PWiz):
main=
telah dihapus.<>
dan$
telah digantikan oleh sinonimmappend
dan dekat merekaid
.Ini membebaskan karakter vital
=<>
dan operator yang membantu$
untuk quines lainnya.Quine 2
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.9
, sehingga tab itu0
. 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
.[show 9!!0,show 1!!0..]
, dimulai dengan karakter digit'9'
dan'1'
dan melompat turun dalam langkah 8.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 angkag
menjadi karakternya. (Penggunaan=<<
bukannya misalnyamap
adalah mengapab
perlu membungkus karakter yang dikembalikan dalam daftar.)show g
memberikan representasi string darig
daftar, dan++
menyatukan string.=<<
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.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 membuatz
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;(#)
terikat\(&)(%)v->v&'{'&'-'&...
, data quine itu sendiri.Data quine diberikan dalam bentuk pengkodean Gereja, ekspresi lambda dengan parameter
(&)(%)v
.(&)
,(%)
danv
, pengkodean ini dapat digunakan baik untuk membangun kode inti quine atau untuk membangun kembali representasi data quine itu sendiri.&
dan%
menjadi operator asosiatif kiri di dalam lambda. Dengan demikian parameter karakter digabungkan dengan awal yangv
dimulai dari kiri.k
, ada yang sesuai&'k'
.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 dimaksudkanv
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.)y(?)v k = \x->v$k?x
adalah fungsi lain dari string ke string.Sebagai contoh bagaimana ini mengubah asosiatif, jika
(&)=y(:)
:Lebih umum, kapan
(#)
fungsi data quine danf1,f2
adalah fungsi menggabungkan karakter dengan string:menerapkan fungsi data quine dengan
(&)=y(f1)
dan(%)=y(f2)
, dan ini menggunakan yang ditentukanf1
danf2
untuk menggabungkan karakter data quine denganx
, dan kemudian meneruskan string yang dihasilkan kev
.Tubuh ekspresi lambda utama menyatukan semua ini:
'&':q:k:q:x
untuk karakterk
prepends&'k'
ke stringx
, sedangkan'%':q:'\\':k:q:x
prepends%'\k'
, yang merupakan bentuk Quine data asli mereka.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 finalz
(string kosong), dan kemudian diteruskan ke fungsi berikut.y(:)#y(:)
adalah parameter yang tepat untuk menambahkan kode inti quine ke string, tanpa modifikasi lainnya.\x->x
tidak dapat melakukan apa-apa dengan quine yang dibangun, yang dikembalikan.sumber
Perl 6 , 3 quines, 274 bytes
Quine 1, 52 bytes
Cobalah online!
Quine 2, 102 byte
Cobalah online!
Quine 3, 120 byte
Cobalah online!
Verifikasi set byte yang berbeda
Ada banyak manuver untuk mendapatkan quine ketiga. Perl 6 memiliki 4 metode output (bahwa aku sadar),
say
,put
,print
danprintf
. Keduanyasay
danput
menampilkan baris baru, karena saya tidak dapat menggunakan keduanya.put
,print
,printf
Semuanya mengandungp
dant
. Kita dapat menyiasati ini sebagian dengan menggunakanEVAL
untuk menggunakan huruf besarPRINT
. Dari sana, saya tidak berpikir mungkin untuk mendapatkan 4 quines ... (walaupun mungkin sesuatu sepertishell "echo 'quine'"
mungkin bekerja)Kami kemudian dapat mengatasi masalah spasi dengan menggunakan berbagai jenis spasi putih untuk memisahkan operator, spasi, tab, dan baris baru.
Penjelasan:
Quine 1:
Quine 2:
Ini adalah quine dalam format
printf |(q[printf q[%s]]xx 2)
, yaitu memformat salinan string ke dalam dirinya sendiri. Namun kami tidak dapat menggunakans
karena itu digunakan dalam quine sebelumnyasay
. Jadi kami menggunakan string ATAU operator (~|
) pada@
dan!3
, untuk menghasilkan%s
bagian, tetapi kami tidak bisa melakukan itu baik untuk format string dan string yang akan dimasukkan, jadi kami harus melakukanZ~
dengan string tambahan dan string kosong, meskipun kita kemudian tidak dapat menggunakan,
untuk memisahkan keduanya, jadi kita kemudian lakukanXx qw[1 0]
untuk mengalikan string dengan 1 dan 0.Quine 3:
Ini adalah kueri EVAL yang mencoba yang terbaik untuk membuat semuanya huruf besar untuk menghindari konflik dengan quine lainnya. Ini melibatkan banyak dari
EVAL
s serta beberapalc
danuc
untuk mengkonversi antara kasus.sumber
MathGolf ,
4 56 quines, 193.535 byte9 byte
Cobalah online!
45 byte
Cobalah online!
49 byte
Cobalah online!
99 byte
Cobalah online!
4488 byte
Cobalah online!
188.845 byte
Saya tidak dapat benar-benar terhubung ke yang ini, jadi inilah program Perl 6 yang menghasilkan quine yang sebenarnya
Verifikasi perbedaan
Saya paling jelas bisa memeras quine lain dari ini, meskipun saya pikir saya sudah kehabisan cara untuk mendorong string langsung ke stack, jadi saya harus menggunakan metode asing. Metode yang lebih aneh pun masuk saat saya mencoba quine keenam. Dalam beberapa kasus quines bisa lebih pendek, tapi saya mengurangi byte yang digunakan sebagai persiapan.Oke, saya mungkin secara teknis dapat melakukan satu quine lagi, karena saya masih memiliki beberapa operator yang saya butuhkan (string push, string kenaikan, duplikasi, pemetaan, popping), itu adalah perulangan yang membatasi kita. Ini
{}
adalah satu-satunya operator yang dapat menunjukkan blok kode dengan panjang sewenang-wenang, dan saya benar-benar membutuhkannya di quine ke-6. Saya bisa menggunakan beberapa blok kode lain, tetapi terbatas, dan saya ragu bagian perulangan akan sesingkat itu, karena kita kehabisan operator yang mudah.Oke, beberapa penjelasan yang terlambat:
Semua quines memiliki struktur yang hampir sama:
Quine 1:
Ini pada dasarnya sama dengan yang saya posting di pertanyaan quine normal.
Quine 2
Quine 3:
Quine 4:
Quine 5:
Quine 6:
Alasan Quine ini begitu jauh lebih lama dari yang lain adalah bahwa incrementing string menggunakan representasi unicode, yang benar-benar menyebalkan untuk beberapa karakter dalam kode, terutama ketika kita mencoba untuk membuat karakter
⌂
dalam kode, yang mengembang kode oleh lebih dari 8000 karakter, yang kemudian mengembang bagian representasi dengan jumlah yang sangat besar.Quine terakhir ini akan berkurang secara signifikan jika MathGolf konsisten pada apakah string menggunakan halaman kode asli atau tidak.
sumber
chr/ord
salah satunya, saya harus membuat keduanya menggunakan halaman kode sebagai gantinya saya pikir.Python 2, 2 quines,
434353349446 byteIni sebagian besar hanya untuk melihat apakah saya bisa melakukannya dengan Python.
30 byte (termasuk baris tambahan):
dan 416 byte, tanpa baris baru:
(Golf 81 byte berkat Lynn tetapi menambahkan beban karena peduli tentang baris baru.)
Penjelasan
Yang pertama hanya standar pendek Python , tetapi dimodifikasi untuk tidak digunakan
_
. Karena ini adalah Python 2 juga tidak menggunakan(
atau)
.Yang kedua mengambil beberapa pemikiran. String panjang dikodekan menggunakan
hex
codec (sehingga menjamin bahwa itu hanya akan berisi0
-9
dana
-f
) dan diterjemahkan sebagaiIni menggunakan tipuan quine untuk mendapatkan kode sumbernya sendiri, kemudian menyandikannya menggunakan
hex_codec
, dan kemudian mencetaknya dikelilingiexec"".decode("hex")
, menggunakansys.stdout.write
untuk menghindari mencetak baris baru. Menjalankan kode ini menghasilkan quine kedua, yang merupakan cara saya membuatnya.Saya menduga bahwa lebih dari dua tidak mungkin dalam Python, meskipun saya ingin melihatnya jika saya salah!
Jika Anda tidak keberatan eval quines
Ørjan Johansen menyarankan yang berikut ini untuk quine kedua yang sudah disandikan
yang akan mencetak 30 + 248 = 278 byte untuk output berikut:
Penggunaan
exec
dengan cara ini tidak curang menurut aturan quine yang tepat PPCG tapi rasanya agak menipu saya (elegan dan pintar, tapi masih curang), karena beberapa karakter digunakan sebagai kode dan data. (Meskipun versi saya digunakanexec
, kode dan datanya terpisah.) Jadi saya akan mempertahankan skor saya di 446.sumber
"hex"
berfungsi sebagai gantinya"hex_codec"
, yang seharusnya menghemat beberapa byte!print '<tab>',
tidak menambahkan spasi pada akhirnya. Dengan ini, Anda dapat mengurangi byte dari saran Jo King: tio.run/…Japt ,
23 quines,106172 bytesYang pertama adalah versi verbose yang cukup dari jawaban quine char N saya .
Coba di sini .
Quine kedua adalah quine bagus ETHProduction yang lebih besar , yang merupakan quine standar yang baik untuk Japt.
Coba di sini .
Yang ketiga menggunakan
``
dan char-code XORing untuk menyimpan data.Coba di sini .
Sejak
()'
masih tersedia, itu mungkin mungkin untuk memeras satu Quine lagi.sumber
"'[+U+']+R+(Umd)¬"q mc
memberi Anda garis pertama untuk pembaruan cepat, jika itu bisa membantu.Gol> <> ,
23 quines,17 28 2726 byte6 byte
Cobalah online!
11 109 byteCobalah online!
11 byte
Cobalah online!
Gol> <> memiliki tiga cara untuk mencetak arang:
o
Pop satu nilai dan cetak sebagai charH
Pop segalanya, cetak sebagai char, dan berhentiS"..."
Cetak string literal tanpa memengaruhi tumpukan sama sekaliTetapi saya tidak dapat menemukan cara untuk menulis quine menggunakan
S"..."
sebagai satu-satunya metode output, jadi saya datang dengan dua di atas, menggunakan dua jenis string literal.Yang ketiga (oleh Jo King) menggunakan
p
perintah untuk membuat"
inS"
on the fly, yang pada gilirannya mencetak semuanya kecuali nol di akhir. KemudianEh
cetak angka nol dan keluar.Sekarang kita telah menggunakan semua perintah output DAN
p
perintah, saya percaya tidak mungkin untuk membuat quine lain (kecuali seseorang datang denganS"
quine tanpap
).sumber
S"..."
?Ruby , 2 quines, 27 + 44 = 71 byte
Cobalah online!
Cobalah online!
Saya terutama dibatasi oleh metode output, di sini. Ada beberapa cara memanipulasi string, tetapi terlepas dari
$><<
semua metode output yang dapat digunakan tampaknya terlalu banyak bersinggungan. Saya pikir mungkin ada jalan keluar denganeval
tetapi sulit harus bersarang manipulasi string dari berbagai jenis.sumber
Javascript ES6, 2 quines, 43 + 22 = 65 byte
Quine 1:
Quine 2:
sumber
g=z=>"g="+g
JS Quine yang valid?> <> , 2 quines, 8 + 16 = 24 byte
8 byte
Cobalah online!
Diambil dari jawaban ini .
16 byte
Cobalah online!
Ini didasarkan pada
'r3d*>o<
quine, kecualio
dan<
tidak dapat digunakan, jadi saya diganti<
dengan|
dan dibuat secara dinamiso
(111 = 8 * 13 + 7) dan menempatkannya di tempat ke-2>
.2 quines adalah batasnya
Sayangnya, kami dibatasi oleh jumlah perintah keluaran.
n
tidak berguna karena hanya menampilkan angka, jadio
harus dieksekusi di quine apa pun. Satu-satunya cara untuk membuat secara dinamiso
adalah denganp
. Jadi satu quine dapat digunakano
, dan yang lainnya dapat membuatnyap
, tetapi tidak ada quine ke-3.Dimungkinkan untuk memiliki quine ketiga meninggalkan kode sumber di stack jika itu diperhitungkan.
sumber
Java 10, 2 quines,
14481248 bytes13501122 byteCobalah online.
Setara dengan:
Penjelasan:
126 byte
System.console()
akan kembalinull
ketika tidak ada yang disediakan, jadi TIO mengembalikan aNullPointerException
dalam hal ini .Untuk membuktikannya sebagai quine yang berfungsi, gantilah
System.console()
denganSystem.out
: Coba online.Penjelasan:
Penjelasan umum:
Di Jawa quine biasanya dilakukan seperti ini:
String s
berisi kode sumber yang tidak diformat.%s
digunakan untuk memasukkan String ini ke dalam dirinya sendiri dengans.format(...)
.%c
,%1$c
dan34
digunakan untuk memformat tanda kutip ganda.s.format(s,34,s)
menempatkan semuanya bersama-sama.Dalam hal ini fungsi lambda quine terpendek di Java 10 adalah ini ( 82 byte ):
Cobalah online.
Karena satu-satunya cara untuk memiliki dua quine di Java menggunakan versi unicode
\uHEXA
, yang dikonversi ke karakter selama kompilasi, saya tidak dapat menggunakan karakter0123456789ABCDEF\u
dalam versi non-unicode. Jadi, versi non-unicode yang lebih kecil akan menggunakanSystem.console()
alih-alihreturn
atauSystem.out
(keduanya berisi 'u'), dan akan menggunakan'}'-'['
dan dua kali%c
alih-alih34
dan%1$c
.Beberapa hal yang perlu diperhatikan tentang versi unicode:
%04X
bukannya%04x
(untuk huruf heksadesimal bukan huruf kecil).92
,%c
dan%3$c
untuk memformat garis miring.\U
alih-alih huruf kecil\u
tidak diperbolehkan, jika tidak, saya hanya akan menggunakanreturn
versi non-unicode yang lebih pendek.sumber