Kutipan Aman-Kutipan


17

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 , jadi program terpendek (dalam byte) menang.


8
@ATaco berpikir kreatif. Kode dalam tanda kutip biasanya tidak dieksekusi, tetapi ketika seluruh program dikelilingi dengan tanda kutip bagian-bagian tersebut dieksekusi.
Pavel

1
Hmm, Poin bagus.
ATaco

Ini mungkin bekerja dengan BF pada implementasi yang mendukung !...
Buah Esolanging

1
Harus Anda gunakan "? Beberapa bahasa mendukung dua atau tiga karakter kutipan.
Neil

1
@tkellehe Meta: Apa yang dianggap sebagai quine yang tepat? Sejauh yang saya mengerti quine 1-byte Anda, itu melanggar persyaratan kode / data yang dirumuskan dalam posting dengan suara tertinggi.
Laikoni

Jawaban:


4

Noodel , 9 7 byte

Versi 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

ḷḥ-Ðḥ@ḅ # Single statement that builds itself as a string.
ḷ       # Loop the following block of code unconditionally.
 ḥ-     # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
   Ð    # Push the stack as an array to stdout (since is an array it is done by reference).
    ḥ@  # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
      ḅ # Break out of the given loop. (The stack is now ["ḷ", "ḥ-Ðḥ@ḅ"]).

        # The top of the stack is popped off and displayed which modifies the array to produce {["ḷ"], "ḥ-Ðḥ@ḅ"} in stdout.

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.

"ḷḥ-Ðḥ@ḅ"

"         # Pushes on the string literal "\"" onto the stack.

 ḷḥ-Ðḥ@ḅ  # Same execution as before, simply builds the Quine for this loop.
 ḷ        # Loop the following block of code unconditionally.
  ḥ-      # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
    Ð     # Push the stack as an array to stdout (since is an array it is done by reference).
     ḥ@   # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
       ḅ  # Break out of the given loop. (The stack is now ["\"", "ḷ", "ḥ-Ðḥ@ḅ"]).

        " # Pushes on the string literal "\"" onto the stack.

          # The top of the stack is popped off and displayed which modifies the array to produce {["\"", "ḷ", "ḥ-Ðḥ@ḅ"], "\""} in stdout.

"Cobalah:)"


Cuplikan

<div id="noodel" code='ḷḥ-Ðḥ@ḅ' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


<div id="noodel" code='"ḷḥ-Ðḥ@ḅ"' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


Saya tidak berpikir menggunakan eitu valid. Pertanyaannya tidak menanyakan karakter yang dikodekan sebagai byte 34, tetapi untuk karakter Unicode 34. Tidak masalah pengkodean yang Anda gunakan, hanya ada satu:"
Dennis

@ Dennis, saya menebak apa yang Anda katakan adalah referensi ke karakter Unicode 34 hanya untuk memastikan semua orang menggunakan hal yang sama "? (Maaf, hanya berusaha memastikan saya mengerti apa yang Anda katakan) Juga, haruskah saya menghapus semua teks dalam jawaban yang mengacu pada penggunaan e?
tkellehe

1
Ya, ada ribuan penyandian, tetapi hanya satu set karakter Unicode. Sejak "berhasil, saya hanya menghapus diskusi dan hanya menggunakan ".
Dennis

11

Python 2 3, 181 152 130 124 122 byte

""" """>" "or exec("oct=0");p='"""" """>" "or exec("oct=0");p=%r;a=oct==0;print(p[a:~a]%%p)#".';a=oct==0;print(p[a:~a]%p)#

Cobalah 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. Ini execjuga dikodekan dengan benar dalam data.

Pernyataan pertama membandingkan string, mungkin dengan kutipan yang diawali, untuk " ", dan menetapkan variabel yang octsesuai. (Variabelnya bisa saja berupa builtin pendek.)

Sisa kode kemudian mengimplementasikan quine Python tradisional menggunakan %rpemformatan string, dengan beberapa kode tambahan yang menghapus tanda kutip tambahan jika octtidak berubah.

Versi alternatif menggunakan "cheaty" exechadir di 126 byte dengan kode yang kurang diulang:

""" """>" "and exec("oct=0");s='"""" """>" "and exec("oct=0");s=%r;p=%r;exec(p)#".';p='a=oct!=0;print(s[a:~a]%(s,p))';exec(p)#

Cobalah online!


7

StandardML , 182 176 108 byte

";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))

Versi tanpa tanda kutip: Cobalah di codingground.
Versi kutipan : Cobalah di codingground.

Perhatikan bahwa outputnya terlihat seperti ini

> val it = "{some string}" : string
> val it = "{some string}" : string
{output to stdout}> val it = fn : string -> unit

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>":

str(chr 34);(fn x=>print(x^it^x^it))"str(chr 34);(fn x=>print(x^it^x^it))" 

dan satu dalam bentuk "<code in quotes>"<code>:

";str(chr 34)^it;print(it^it)";str(chr 34)^it;print(it^it)

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 oleh str(chr 34).

Mereka juga sangat bergantung pada pengidentifikasi implisit ityang digunakan ketika tidak ada pengidentifikasi eksplisit yang diberikan dalam deklarasi.

Di quine pertama str(chr 34);mengikat itstring yang berisi ", fn x=>memulai fungsi anonim mengambil satu argumen x, lalu menggabungkan x^it^x^itdan mencetak string yang dihasilkan. Fungsi anonim ini langsung diterapkan ke string yang berisi kode program, sehingga rangkuman x^it^x^itmenghasilkan <code>"<code>".

Quine kedua dimulai dengan hanya kode program sebagai string ";str(chr 34)^it;print(it^it)";yang terikat it. Kemudian str(chr 34)^it;merangkai kutipan ke awal string dan sekali lagi tidak ada pengidentifikasi eksplisit yang diberikan, string yang dihasilkan "<code>terikat it. Akhirnya print(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 pengenal it, atau itadil "dan kita diberi sumber kita sendiri <code>sebagai argumen dan dengan demikian harus menjadi fungsi yang menangani argumen semacam itu.

(if size it>1then(print(it^it);fn _=>())else fn x=>print(it^it^x^it^x^it))

Untuk mengidentifikasi dalam kasus apa kita berada, kita memeriksa apakah ukurannya itlebih besar dari 1. Jika tidak maka itadalah "dan kita berada dalam kasus kedua, sehingga else-part mengembalikan fungsi anonim fn x=>print(it^it^x^it^x^it)yang kemudian dipanggil karena diikuti oleh sumber sebagai string . Perhatikan kunci it^it^yang diperlukan untuk string kosong di awal program.

Jika size itlebih besar dari 1 kita berada di then-part dan hanya perform print(it^it), kan? Tidak cukup, karena saya lalai memberi tahu Anda bahwa SML sangat diketik yang berarti bahwa conditional if <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 tipe elsebagiannya: Fungsi anonim yang mengambil string dan kemudian panggilan printmemiliki tipestring -> <return type of print> , dan printmemiliki tipe string -> unit( unitdalam beberapa hal mirip dengan voiddalam bahasa lain), jadi jenis yang dihasilkan adalah lagi string -> unit.

Jadi jika thenbagian itu hanya print(it^it)yang memiliki tipe unit, kita akan mendapatkan kesalahan tipe ketidakcocokan. Jadi bagaimana fn _=>print(it^it)? ( _Adalah wildcard untuk argumen yang tidak digunakan) Fungsi anonim ini sendiri memiliki tipe di 'a -> unitmana 'aberdiri untuk tipe arbitrer, jadi dalam konteks kondisional kami yang memberlakukan string -> unittipe ini akan bekerja. (Variabel tipe 'aakan dipakai dengan tipe string.) Namun, dalam hal ini kami tidak akan mencetak apa-apa karena fungsi anonim tidak pernah dipanggil! Ingat, ketika kita masuk ke dalam then-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)sebagai then-bagian, dengan demikian mencetak terlebih dahulu dan kemudian mengembalikan fungsi printyang memiliki tipe yang benar.


7

V , 27 , 23 byte

éPñi"éP241"qpá"lxx|xÿ

Cobalah online!

Karena ini mengandung beberapa karakter yang tidak dapat dicetak, berikut ini adalah versi yang dapat dibaca:

éPñi"éP<C-v>241<esc>"qpá"lxx|xÿ

dan ini hexdump:

00000000: e950 f169 22e9 5016 3234 311b 2271 70e1  .P.i".P.241."qp.
00000010: 226c 7878 7c78 ff                        "lxx|x.

Jadi hal pertama yang perlu kita lakukan adalah menentukan apakah karakter pertama adalah kutipan. éPmenyisipkan karakter 'P', tetapi "éPadalah NOOP. Setelah itu, kami menjalankan sedikit modifikasi pada quine extendedable standar, yaitu:

ñi<C-v>241<esc>"qpÿ

Kami akan melakukannya dengan sedikit berbeda. Pertama, kita perlu memasukkan teks "éP" awal. Jadi kita lakukan

ñ                        " Start recording into register 'q'
 i                       " Enter insert mode
  "éP<C-v>241<esc>       " Enter the following text: '"éPñ'
                  "qp    " Paste the text in register 'q'
                     á"  " Append a '"'

Di sinilah percabangan terjadi. Teks saat ini di buffer adalah

"éPñi"éP<C-v>241<esc>"qpá"P
Cursor is here ----------^

Kecuali kita membungkusnya dengan tanda kutip, dalam hal itu 'P' tidak akan pernah dimasukkan, dan buffernya adalah:

"éPñi"éP<C-v>241<esc>"qpá"
Cursor is here ----------^

Karena kita masih merekam, kita dapat melakukan apa pun yang kita inginkan di sini, dan itu akan ditambahkan ke buffer ketika itu "qpterjadi. Jadi dari sini cukup mudah untuk menghapus tanda kutip:

l           " Move one character to the right. If there is no character to the right, 
            " then this is effectively a "break" statement, stopping playback of the recording
 xx         " Delete two characters (the '"P')
   |        " Move to the first character on this line
    x       " Delete one character
     ÿ      " End the program

3

JavaScript (ES6), 239 237 byte

Set=``;eval(";a='Set=``;eval(~;a=1;S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);~)';S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);")

Berhati-hatilah untuk mencoba setiap versi di lingkungan yang baru (mis., Tab browser baru)

Harus ada setidaknya satu cara untuk menyederhanakan ini ...


1
Saya kira Anda bisa menggunakan array untuk menggantikan seperti: [x = "replace"]. Mungkin bisa memecahkan banyak hal, saya tidak terlalu berpengalaman dengan quines ...
Luke
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.