Tugas Anda sederhana: menulis program (atau fungsi) yang tidak mengambil input dan output (atau mengembalikan) kode sumbernya. Tangkapannya adalah ketika program tersebut dibungkus dengan "quotes"
(karakter Unicode 34), ia harus kembali mengeluarkan kode sumbernya (sekarang dikutip).
Aturan standar untuk quines berlaku. Ini adalah kode-golf , jadi program terpendek (dalam byte) menang.
!
..."
? Beberapa bahasa mendukung dua atau tiga karakter kutipan.Jawaban:
Noodel ,
97 byteVersi ini bekerja dengan cara yang sama seperti yang lain, hanya saja saya lupa bahwa Noodel memiliki cara untuk menjalankan blok kode sekali dan saya membuat bahasa ...
Ḷ1ḥ-Ð1ḥ@€
Cobalah:)
Bagaimana itu bekerja
Penawaran-Keamanan
Menempatkan
"
karakter sebelum dan sesudah program berfungsi karena Noodel memiliki serangkaian karakter yang didedikasikan untuk apa yang saya sebut printables . Ini segera diurai sebagai string literal ketika ditempatkan sendiri dan memungkinkan untuk dengan mudah mencetak sesuatu ke layar. Jadi tidak seperti kebanyakan bahasa, Noodel melihat set ASCII normal yang dianggap layak cetak sebagai literal string langsung (kecuali untuk ruang dan umpan baris) di dalamnya mengutip kode hanya dilihat sebagai mendorong string."Cobalah:)"
Cuplikan
sumber
e
itu valid. Pertanyaannya tidak menanyakan karakter yang dikodekan sebagai byte 34, tetapi untuk karakter Unicode 34. Tidak masalah pengkodean yang Anda gunakan, hanya ada satu:"
"
? (Maaf, hanya berusaha memastikan saya mengerti apa yang Anda katakan) Juga, haruskah saya menghapus semua teks dalam jawaban yang mengacu pada penggunaane
?"
berhasil, saya hanya menghapus diskusi dan hanya menggunakan"
.Python
23,181152130124122 byteCobalah online! TIO dilengkapi dengan header dan footer yang secara otomatis menguji validitas quine. Anda dapat menghapusnya untuk menjalankan quine.
Kode ini berfungsi dengan menggunakan string triple-dikutip dalam Python.
""" """
sama dengan' '
dan"""" """
sama dengan'" '
.Kode memang digunakan
exec
, tetapi tidak untuk cara "non-quiney" dalam mengeksekusi data sebagai kode, hanya untuk mengatur variabel dari dalam ekspresi. Iniexec
juga dikodekan dengan benar dalam data.Pernyataan pertama membandingkan string, mungkin dengan kutipan yang diawali, untuk
" "
, dan menetapkan variabel yangoct
sesuai. (Variabelnya bisa saja berupa builtin pendek.)Sisa kode kemudian mengimplementasikan quine Python tradisional menggunakan
%r
pemformatan string, dengan beberapa kode tambahan yang menghapus tanda kutip tambahan jikaoct
tidak berubah.Versi alternatif menggunakan "cheaty"
exec
hadir di 126 byte dengan kode yang kurang diulang:Cobalah online!
sumber
StandardML ,
182 176108 byteVersi tanpa tanda kutip: Cobalah di codingground.
Versi kutipan : Cobalah di codingground.
Perhatikan bahwa outputnya terlihat seperti ini
karena kode deklarasi ditafsirkan oleh deklarasi (masing-masing
;
berakhir deklarasi) dan menunjukkan nilai dan jenis deklarasi masing-masing.Latar Belakang
Di SML ada quine dari formulir
<code>"<code in quotes>"
:dan satu dalam bentuk
"<code in quotes>"<code>
:Keduanya mengandalkan fakta bahwa
<code>
-part tidak mengandung tanda kutip dan dengan demikian dapat dikutip tanpa perlunya melarikan diri dari apa pun, yang"
dibutuhkan untuk menampilkan quine diberikan olehstr(chr 34)
.Mereka juga sangat bergantung pada pengidentifikasi implisit
it
yang digunakan ketika tidak ada pengidentifikasi eksplisit yang diberikan dalam deklarasi.Di quine pertama
str(chr 34);
mengikatit
string yang berisi"
,fn x=>
memulai fungsi anonim mengambil satu argumenx
, lalu menggabungkanx^it^x^it
dan mencetak string yang dihasilkan. Fungsi anonim ini langsung diterapkan ke string yang berisi kode program, sehingga rangkumanx^it^x^it
menghasilkan<code>"<code>"
.Quine kedua dimulai dengan hanya kode program sebagai string
";str(chr 34)^it;print(it^it)";
yang terikatit
. Kemudianstr(chr 34)^it;
merangkai kutipan ke awal string dan sekali lagi tidak ada pengidentifikasi eksplisit yang diberikan, string yang dihasilkan"<code>
terikatit
. Akhirnyaprint(it^it)
menyatukan string dengan menghasilkan sendiri"<code>"<code>
yang kemudian dicetak.Penjelasan
Sunting: Tidak lagi up to date dengan versi 108-byte, namun orang mungkin memahaminya juga setelah membaca penjelasan ini.
Quine kutipan-aman menggabungkan kedua pendekatan di atas dan itu sendiri dari bentuk
"<code>"<code>
. Menempatkan ini lagi dalam hasil""<code>"<code>"
kuotasi, jadi kami mendapatkan string kosong dan kemudian quine dari bentuk lainnya.Itu berarti program diberikan sumbernya sendiri dalam bentuk
"<code>
oleh pengenalit
, atauit
adil"
dan kita diberi sumber kita sendiri<code>
sebagai argumen dan dengan demikian harus menjadi fungsi yang menangani argumen semacam itu.Untuk mengidentifikasi dalam kasus apa kita berada, kita memeriksa apakah ukurannya
it
lebih besar dari 1. Jika tidak makait
adalah"
dan kita berada dalam kasus kedua, sehinggaelse
-part mengembalikan fungsi anonimfn x=>print(it^it^x^it^x^it)
yang kemudian dipanggil karena diikuti oleh sumber sebagai string . Perhatikan kunciit^it^
yang diperlukan untuk string kosong di awal program.Jika
size it
lebih besar dari 1 kita berada dithen
-part dan hanya performprint(it^it)
, kan? Tidak cukup, karena saya lalai memberi tahu Anda bahwa SML sangat diketik yang berarti bahwa conditionalif <cond> then <exp_1> else <exp_2>
harus selalu memiliki tipe yang sama yang lagi berarti bahwa ekspresi<exp_1>
dan<exp_2>
perlu memiliki tipe yang sama. Kita sudah tahu tipeelse
bagiannya: Fungsi anonim yang mengambil string dan kemudian panggilanprint
memiliki tipestring -> <return type of print>
, danprint
memiliki tipestring -> unit
(unit
dalam beberapa hal mirip denganvoid
dalam bahasa lain), jadi jenis yang dihasilkan adalah lagistring -> unit
.Jadi jika
then
bagian itu hanyaprint(it^it)
yang memiliki tipeunit
, kita akan mendapatkan kesalahan tipe ketidakcocokan. Jadi bagaimanafn _=>print(it^it)
? (_
Adalah wildcard untuk argumen yang tidak digunakan) Fungsi anonim ini sendiri memiliki tipe di'a -> unit
mana'a
berdiri untuk tipe arbitrer, jadi dalam konteks kondisional kami yang memberlakukanstring -> unit
tipe ini akan bekerja. (Variabel tipe'a
akan dipakai dengan tipestring
.) Namun, dalam hal ini kami tidak akan mencetak apa-apa karena fungsi anonim tidak pernah dipanggil! Ingat, ketika kita masuk ke dalamthen
-part kode keseluruhan"<code>"<code>
, jadi<code>
-part mengevaluasi ke suatu fungsi tetapi, karena tidak ada yang datang setelah itu, itu tidak dipanggil.Sebaliknya, kita menggunakan sequentialisation yang memiliki bentuk
(<exp_1>; ...; <exp_n>)
di mana<exp_1>
untuk<exp_n-1>
dapat memiliki jenis sewenang-wenang dan jenis dari<exp_n>
menyediakan jenis seluruh sequentialisation. Dari sudut pandang fungsional, nilai<exp_1>
to<exp_n-1>
hanya dibuang, namun SML juga mendukung konstruksi imperatif sehingga ekspresi mungkin memiliki efek samping. Singkatnya, kita ambil(print(it^it);print)
sebagaithen
-bagian, dengan demikian mencetak terlebih dahulu dan kemudian mengembalikan fungsiprint
yang memiliki tipe yang benar.sumber
V ,
27, 23 byteCobalah online!
Karena ini mengandung beberapa karakter yang tidak dapat dicetak, berikut ini adalah versi yang dapat dibaca:
dan ini hexdump:
Jadi hal pertama yang perlu kita lakukan adalah menentukan apakah karakter pertama adalah kutipan.
éP
menyisipkan karakter 'P', tetapi"éP
adalah NOOP. Setelah itu, kami menjalankan sedikit modifikasi pada quine extendedable standar, yaitu:Kami akan melakukannya dengan sedikit berbeda. Pertama, kita perlu memasukkan teks "éP" awal. Jadi kita lakukan
Di sinilah percabangan terjadi. Teks saat ini di buffer adalah
Kecuali kita membungkusnya dengan tanda kutip, dalam hal itu 'P' tidak akan pernah dimasukkan, dan buffernya adalah:
Karena kita masih merekam, kita dapat melakukan apa pun yang kita inginkan di sini, dan itu akan ditambahkan ke buffer ketika itu
"qp
terjadi. Jadi dari sini cukup mudah untuk menghapus tanda kutip:sumber
JavaScript (ES6),
239237 byteBerhati-hatilah untuk mencoba setiap versi di lingkungan yang baru (mis., Tab browser baru)
Harus ada setidaknya satu cara untuk menyederhanakan ini ...
sumber