Tulis Metaquine


19

Metaquine adalah program yang bukan quine, tetapi yang outputnya, ketika dijalankan sebagai program dalam bahasa yang sama, adalah quine.

Tujuan dari tantangan ini adalah untuk menulis metaquine. Ini adalah , sehingga kode terpendek menang, dengan jawaban paling awal digunakan sebagai tiebreak. Perhatikan bahwa hanya program lengkap yang dapat diterima, karena definisi quine.

Aturan untuk Quines

Hanya quine sejati yang diterima. Artinya, Anda perlu mencetak seluruh kode sumber kata demi kata ke STDOUT, tanpa :

  • membaca kode sumber Anda, secara langsung atau tidak langsung.
  • mengandalkan lingkungan REPL yang hanya mengevaluasi dan mencetak setiap ekspresi yang Anda berikan.
  • mengandalkan fitur bahasa yang hanya mencetak sumber dalam kasus tertentu.
  • menggunakan pesan kesalahan atau STDERR untuk menulis semua atau sebagian quine. (Anda dapat menulis sesuatu ke STDERR atau menghasilkan peringatan / kesalahan non-fatal selama STDOUT adalah quine yang valid dan pesan kesalahan bukan bagian dari itu.)
  • kode sumber yang murni terdiri dari literal (apakah itu string literal, literal numerik, dll.) dan / atau NOP.

Setiap output yang tidak dapat ditekan (seperti pemberitahuan hak cipta, pesan startup / shutdown, atau feed garis trailing) dapat diabaikan dalam output demi validitas quine.

Contoh

Mengabaikan aturan yang melarang program literal saja dan quining bawaan, ini akan menjadi metaquine di Seriously:

"Q"

Program ini terdiri dari string tunggal literal "Q", yang dicetak secara implisit pada output. Ketika output ( Q) dijalankan, itu adalah quine ( Qadalah fungsi quine bawaan).


2
Apakah aturan literal / komentar / NOP berlaku untuk output (yaitu quine sebenarnya) dari metaquote juga? Jika tidak ex. Tadalah jawaban Pyth 1 byte yang mudah.
Gagang Pintu

@ Doorknob Ya, saya akan klarifikasi.
Mego

8
Saya tidak benar-benar melihat di mana titik sulit dari tantangan ini. Bukankah strategi "mencetak string yang berisi quine terpendek yang diketahui" cukup dijamin untuk menang untuk setiap bahasa?
Fatalkan

1
@Fatalize Yah saya kira pertanyaan yang menarik adalah, dapatkah itu dilakukan dalam jumlah yang sama atau lebih sedikit byte dari quine itu sendiri.
Martin Ender

3
@Fatalize. Bukankah mungkin Anda bisa menulis metaquine pendek yang mencetak quine yang panjang tapi valid?
Rhyzomatic

Jawaban:


15

CJam, 6 byte

"_p"_p

Cetakan

"_p"
_p

yang merupakan quine terpendek yang tepat di CJam.

Uji di sini.

Penjelasan

Kedua program bekerja persis sama, karena linefeed di dalam quine yang tepat adalah no-op dan hanya disertakan karena lebih mahal untuk menghapusnya dari output. Cara kerja program:

"_p"  e# Push this string.
_     e# Duplicate it.
p     e# Print a string representation of the top of the stack (i.e. the string with
      e# quotes) followed by a linefeed.
      e# The other copy is then printed automatically at the end of the program, without
      e# stringifying it.

Catatan Samping

Bekerja sama di GolfScript sebagai

".p".p

yang mencetak

".p"
.p

dengan linefeed line, yang pada gilirannya adalah salah satu quines yang paling pendek diketahui.


10

Pyth, 12 11 10 9 byte

Merobohkan satu byte lagi berkat @ Pietu1998.

jN B".[9N

Ini mencetak

.[9N".[9N

yang merupakan quine di Pyth. Anda dapat mencobanya di sini .


Apakah output merupakan rekor baru untuk quine Pyth terpendek? Saya tidak percaya saya pernah melihatnya sebelumnya.
ETHproduk

Saya tidak dapat menemukannya di tempat lain. Saya datang dengan mencoba mendapatkan metaquine.
Rhyzomatic

1
Mungkin Anda harus mempostingnya sebagai jawaban untuk tantangan quine yang asli :)
ETHproduk

2
Anda bisa mendapatkan ini hingga 9 dengan menggunakan jN B".[9Natau .[9N"jN B. ( jN B"jN Badalah quine sejati lainnya di 9: fungsi identitas dwipecah belah dan bergabung dengan ".)
PurkkaKoodari

@ Pietu1998 Terima kasih! Saya tahu pasti ada cara untuk mendapatkannya ke 9. Apakah ada quines di Pyth yang lebih pendek dari 9 byte?
Rhyzomatic



4

Python 2, 29 byte

_="_=%r;print _%%_";print _%_

Ternyata quine python pendek yang terkenal dengan mudah diubah menjadi metaquine :)

Dan, karena kita tidak perlu khawatir tentang mencocokkan baris baru, metaquine sebenarnya lebih pendek!


mengalahkan saya untuk itu, lagi :( Saya memikirkan pembungkus, tapi milikmu lebih baik
Erik the Outgolfer

3

Japt, 15 13 byte

Q+"+Q ³s7J" ²

Uji secara online!

Output program ini

"+Q ³s7J"+Q ³s7J

yang merupakan quine terpendek yang diketahui di Japt.

Bagaimana itu bekerja

Q+"..." // Take a quotation mark plus this string.  "+Q ³s7J
²       // Repeat it twice.                         "+Q ³s7J"+Q ³s7J
        // Implicit output

Versi yang tidak bersaing, 11 byte

Q+"+Q ²é" ²

Saya baru saja menambahkan é , perintah "rotate". Begitu

"+Q ²é"+Q ²é

sekarang menjadi quine yang valid.


1

Ruby, 25 23

puts"puts <<2*2,2
"*2,2

Menghasilkan quine Ruby HEREdoc klasik

puts <<2*2,2
puts <<2*2,2
2

Solusi lama

_='_=%p;$><<_%%_';$><<_%_

Menghasilkan dirinya sendiri kecuali dengan tanda kutip tunggal diganti dengan tanda kutip ganda.



1

Ikan (> <>), 17 byte

Ini berfungsi menggunakan quine ikan klasik "r00g!;oooooooo|tetapi menambahkan {yang menggeser seluruh tumpukan ke kiri sehingga program asli bukan quine, tetapi outputnya, saat dijalankan, adalah.

"{r00g!;oooooooo|

Output:

"r00g!;oooooooo|

yang merupakan ikan quine!


1

Jelly , 3 byte (tidak bersaing)

Sayangnya, atom yang dibutuhkan kira-kira 2 minggu lebih muda dari tantangan.

Metaquine

”Ṙv

Cobalah online!

Bagaimana itu bekerja

”Ṙv  Main link. No arguments.

”Ṙ   Set the left argument and the return value to the character 'Ṙ'.
  v  Dyadic eval; evaluate the return value with the left argument as argument.
     Executing the atom Ṙ on the argument 'Ṙ' prints a string representation of
     the character, i.e., the string "”Ṙ".
     Finally, v returns its unaltered argument, which is printed implicitly.

Quine

”ṘṘ

Cobalah online!

Bagaimana itu bekerja

”ṘṘ  Main link. No arguments.

”Ṙ   Set the left argument and the return value to the character 'Ṙ'.
  Ṙ  Print a string representation of the character, i.e., the string "”Ṙ".
     (implicit) Print the unaltered return value.

Karena yang kedua mencetak dua karakter pertama ( ”Ṙ), ini adalah quine yang tepat menurut definisi kami.


1

Octopen-Baru, 22 byte

** Jawaban tidak bersaing

愛[35211].pack歩U')

Output Ruby

puts [35211].pack(' U')

Output yang mana . Yang merupakan quine di Octopen-Baru!


1

7 , 2 byte, tantangan tanggal bahasa

Program ini berukuran dua byte, dan dapat ditafsirkan dalam beberapa cara; sebagai hex dump:

00000000: 4ff4                                     O.

sebagai codepage 437:

O⌠

atau, paling mudah, dalam oktal (yang 7 digunakan secara asli):

237723

Cobalah online!

Cara kerjanya sangat sederhana: ini adalah quine 7 standar dengan elemen no-op stack yang disisipkan di antara kedua bagian, untuk membuatnya berbeda (dalam konteks ini, 7memisahkan elemen tumpukan). (Saya juga bisa memasukkannya di awal 723723,. Saya tidak bisa menafsirkannya di akhir karena trailing 7s seperti trailing whitespace, dan diabaikan dalam encoding yang dikemas, sehingga tidak akan ada bedanya dengan program keluaran. )

Kebetulan, program ini adalah dalam heksadesimal, tapi itu kebanyakan hanya kebetulan.


1

Underload, 11 byte

(:aSS)::aSS

Cukup mudah. Mencetak (:aSS):aSS, yang merupakan quine Underload standar.


1

Brachylog , 12 byte

"~k;?w₁"gjw₃

Cobalah online!

Salah satu dari 132 variasi metaquine dengan panjang yang sama pada quine I yang diterjemahkan dari quine Fatalize's Brachylog v1 (non-cheat). Saya benar-benar menulis program (non-golf, dan keseluruhan konyol) untuk mencetak semuanya:

{[[";?","gj","jḍ"],"₁₃₅₇"]j∋ᵐ{ḍ≠&};"\"~~k~ww~w\"~ww~w~n"}ᶠ{lw" metaquines generated:
"ẉ&}w₁ᵐ

Cobalah online!

Ada dua bagian dari Quine asli yang bisa diganti inconsequentially: ;?bisa diubah ke gjatau jḍ, dan dapat diubah ke , atau . Jika kita menyimpan atau mengubahnya di luar string literal dengan satu cara dan di dalam string literal dengan cara yang berbeda, maka output tidak akan cocok dengan sumbernya, karena varian apa pun yang ada di dalam string literal akan dicetak baik di dalam maupun di luarnya , menghasilkan quine yang bukan program awal dijalankan.

;?,, gjdan jḍdapat dipertukarkan karena ketiganya memasangkan string literal dengan dirinya sendiri: karena tata letak program, variabel input ?disatukan dengan string, jadi ;?pasangkan string dengan dirinya sendiri; terlepas dari tata letak, gjbungkus string dalam daftar yang kemudian digabungkan dengan dirinya sendiri; juga jḍmenggabungkan string ke dirinya sendiri kemudian membaginya menjadi dua.

wSubskrip bernomor ganjil dapat dipertukarkan karena, meskipun awalnya whanya bisa mengambil 0 atau 1, dengan 0 mencetak input ke wdan 1 mencetak elemen pertama diformat dengan yang kedua, persediaan subskrip untuk wtelah tumbuh menjadi sesuatu yang secara eksternal berfungsi sebagai bitfield: bit rendah dari subskrip mengkode apakah itu langsung atau diformat, bit tengah mengkodekan apakah variabel output berasalwtidak dibatasi atau diatur ke input, dan bit tinggi mengkodekan apakah pencetakan dilakukan segera atau jika itu ditunda sampai akhir program sehingga dapat mengalami backtracking. (Subskrip tersebut adalah kontribusi saya yang pertama dan sejauh ini terbesar bagi Brachylog.) Karena quine dan metaquine tidak menggunakan variabel output dan tidak mundur, keempat subskrip ganjil adalah setara.


0

Befunge-93, 22 byte

"+1_@#`+39:,g0:">:#,_@

Saya hanya mengambil quine standar, memasukkannya ke dalam tanda kutip, membaliknya (jadi dimuat di tumpukan dengan benar), dan kemudian menambahkan tumpukan-cetak di bagian akhir.

Ini 8 karakter ditambahkan ke quine normal, jadi sangat mungkin ada solusi yang lebih baik.


Tidak bisakah Anda hanya mengambil quine standar dan menambahkan baris baru? Baris baru akan hilang pada tahap penguraian, meninggalkan Anda hanya dengan quine standar (yang akan mencetak sendiri).

0

Turtlèd , 52 byte (tidak bersaing)

1 kurang dari quine asli

@##'@r,r,r-{ +.r_}r{ +.r_}"#'@r,r,r-{ +.r_}r{ +.r_}"

Bekerja dengan cara yang sama, kecuali bahwa ia tidak memiliki karakter pada akhirnya, ketika dijalankan, ia akan memiliki karakter pada akhirnya, yang tidak mempengaruhi output, karena ia menulis # ke #. Perhatikan outputnya sedikit berbeda dengan quine yang saya buat untuk tantangan quine, tetapi kerjanya sama: "tulis #, yang merupakan karakter terakhirnya sendiri, seperti quine yang saya buat. Lihat penjelasannya di sana .


0

Lua, 45 byte

Kode quine bukan milikku.

s="s=%qprint(s:format(s))"print(s:format(s));

akan menghasilkan

s="s=%qprint(s:format(s))"print(s:format(s))

yang merupakan quine. Senang ;adalah opsional di Lua.


0

Pushy , 7 byte

Non-bersaing karena bahasa memposting tantangan.

Ini adalah standar quine, tetapi dengan baris baru dihapus. Baris baru tidak berarti apa-apa di Pushy, tetapi pemisah standar operator cetak, dan oleh karena itu diperlukan untuk quine yang sebenarnya.

95 34_"

Cobalah online! Output ini:

95 34
_ "

Yang merupakan quine Pushy terpendek - sebuah penjelasan tentang cara kerjanya dapat ditemukan di sini .

Atau, H5-34_"bekerja untuk jumlah byte yang sama.


0

Busa , 14 byte

[. .'|: ~|]: ~

Ini mencetak quine Busa kedua yang dapat ditemukan di sini . Ini sebenarnya lebih pendek karena .akan selalu menempatkan spasi di antara setiap elemen, tetapi bilah di token ketiga memungkinkan saya untuk menghilangkan spasi sebelum itu.


Saya telah menghapus bit yang tidak bersaing karena bahasa yang lebih baru tidak secara otomatis tidak bersaing sesuai kebijakan situs.
Mego

0

Sekam , 6 byte

D"S+s¨

Cobalah online!

Mencetak quine Husk standar S+s"S+s".

 "S+s¨    The string S+s"
D         concatenated with itself.

Quine menjelaskan:

   "S+s"    The string S+s
 +          concatenated with
S           itself passed through
  s         the function which returns its string representation.
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.