Cetak quine yang berisi input


15

Tugas

Anda akan diberi string dalam input yang hanya terdiri dari karakter dari ahingga z, yaitu input akan cocok dengan regex/^[a-z]*$/ .

Output Anda harus berupa program lengkap dalam bahasa yang sama, yang kode sumbernya berisi input, dan merupakan quine yang tepat.

Contoh

Program Anda akan menerima input abcdan output:

...abc...

Di atas harus merupakan program lengkap dalam bahasa yang sama yang tidak mengambil input dan output:

...abc...

yaitu output sendiri.

Mencetak gol

Ini adalah . Jawaban terpendek dalam byte menang.

Referensi


3
Hmm .. Jadi seperti 'quat' (quine + cat)?
Matius Roh

Jawaban:


7

Python 3, 57 61 byte

lambda x:"s='s=%r;print(s%%s)';print(s%s)".replace('s',x+'x')

Mengambil dasar python 3 quine dari sini dan mengganti nama variabel dengan input.

Catatan: Seperti yang ditunjukkan oleh Hyper Neutrino dalam komentar, ini tidak bekerja untuk kata kunci dilindungi seperti for, if, dll

Menambahkan karakter yang tidak diakhiri dengan kata kunci yang dicadangkan seperti 'x'atau nomor apa pun yang memperbaikinya. (Ørjan Johansen).


Sangat kreatif menggunakan nama variabel.
Leaky Nun

3
Tidak berfungsi untuk input "for", atau kata lain yang dicadangkan dalam Python.
HyperNeutrino

Dapat mengkonfirmasi. Ini tidak berfungsi untuk semua input yang mungkin. Cobalah online
mbomb007

@HyperNeutrino, Tercatat, juga tidak tahu bagaimana menyiasatinya
..

Anda dapat menambahkan karakter tambahan yang tidak ada di akhir kata kunci apa pun, seperti 'x'.
Ørjan Johansen

6

Jelly , 9 byte

Generator

;“¶Øv”ṾØv

Cobalah online!

Bagaimana itu bekerja

;“¶Øv”ṾØv  Main link. Argument: s (string of letters)

;“¶Øv”     Concatenate s and the string "\nØv".
      Ṿ    Uneval; get its string representation.
           (implicit) Print the previous return value since the next link is an
           otherwise unparsable nilad.
       Øv  Set the return value to "Ṙv".

Quine

Jika inputnya adalah quine, program berikut dihasilkan.

“quine
Øv”Ṙv

Cobalah online!

Bagaimana itu bekerja

Ini adalah quine Jelly standar. Pertama,

“quine
Øv”

menetapkan argumen kiri dan nilai kembali ke string "quine\nØv".

Kemudian, cetak representasi string (kode dari blok sebelumnya) dan mengembalikan string yang tidak diubah.

Setelah itu, vambil argumen kiri dan meneruskannya sebagai input ke program Jelly

quine
Øv

Di semua program Jelly, hanya tautan utama (ditentukan pada baris terakhir) yang dieksekusi, sehingga baris pertama diabaikan seluruhnya.

Akhirnya, Øvtetapkan nilai kembali ke "Ṙv", yang dicetak secara implisit ketika program luar selesai.



4

Haskell , 51 byte

q mengambil string dan mengembalikan string.

q s|t<-"main=putStr$fst`mappend`show$"=t++show(t,s)

Cobalah online!

Contoh output untuk putStr$q"test":

main=putStr$fst`mappend`show$("main=putStr$fst`mappend`show$","test")

Cobalah online!

  • Masukkan teks quine utama dan string yang diinginkan ke dalam tuple.
  • Penggunaan fstuntuk mengekstrak teks utama.
  • Menggunakan showuntuk mengubah seluruh tuple menjadi string.
  • Penggunaan mappenduntuk menggabungkan dua fungsi sebelumnya. Mudahnya mappendpada dua fungsi memberikan fungsi yang menerapkan setiap fungsi ke argumennya dan menggabungkan hasil dengan mappenduntuk tipe hasil (di sini rangkaian string).

4

Underload , 14 byte

(~aSaS(:^)S):^

Cobalah online!

Digunakan sebagai (test)(~aSaS(:^)S):^ - yang merupakan quine.

Bagaimana itu bekerja

  • Underload adalah bahasa esoterik concatenative (berbasis stack). Itu tidak mendukung input pembacaan, jadi setiap argumen diletakkan di tumpukan pada awalnya.
  • (test)dan (~aSaS(:^)S)string literal, jadi tempatkan diri mereka di tumpukan, dengan yang terakhir di atas.
  • :menduplikasi (~aSaS(:^)S)string di atas tumpukan, lalu ^menjalankan isinya sebagai subprogram.
  • ~menukar dua elemen teratas pada stack, jadi sekarang (test)adalah yang teratas.
  • amembungkus (test)tanda kurung tambahan.
  • Smengambil string ((test))di atas tumpukan, dan mencetaknya tanpa tanda kurung luar (yang hanya sintaks literal).
  • Sekarang, aScetak sisanya (~aSaS(:^)S)di tumpukan dengan cara yang sama (dengan tanda kurung).
  • Akhirnya, (:^)Scetak final :^.

Tidak benar-benar berfungsi )(sebagai input, saya pikir.
Rɪᴋᴇʀ

@Riker Benar, Underload sayangnya tidak mendukung tanda kurung yang tidak cocok. Tapi pertanyaannya menentukan a- z.
Ørjan Johansen

Ah, baiklah. Tidak memperhatikan itu.
Rɪᴋᴇʀ

4

Underload , 14 byte

a(aS(:^)S)~*:^

Cobalah online!

Pendekatan berbeda dari jawaban Underload lainnya; alih-alih menjadi quine, ini membangun quine. Menariknya, ia keluar ke jumlah byte yang sama. Ini adalah fungsi yang mengambil argumennya dari stack dan output ke output standar.

Penjelasan

a(aS(:^)S)~*:^
a               Generate a string literal containing the input
 (aS(:^)S)~*    Prepend "aS(:^)S"
            :^  Mockingbird: run the resulting function with itself as argument

Fungsi yang dihasilkan terlihat seperti ini:

aS(:^)S(input)
aS              Print a string literal containing the argument
  (:^)S         Print ":^"
       (input)  Push "input" onto the stack

Dengan kata lain, itu mencetak string literal yang berisi dirinya, diikuti oleh :^. Ini jelas quine (karena apa yang baru saja dicetak sama dengan kode yang kita jalankan untuk menjalankannya di tempat pertama).


Sepertinya di TIO, Anda dapat menjatuhkan inisial a, selama Anda tidak keberatan kesalahan segmentasi dicetak ke stderr ketika input berisi a.
Ørjan Johansen

Saya bahkan tidak berpikir untuk mengeksekusi string literal yang diberikan pengguna, atas dasar bahwa pekerjaan program sudah selesai pada saat itu dan tanpa (menjadi karakter yang muncul dalam input, semua program tidak akan melakukan apa-apa atau crash. Saya bahkan tidak berpikir itu khusus untuk TIO; program tidak valid, tetapi sudah menghasilkan output yang diinginkan pada saat crash.

2

V , 9 byte

ñ"qPxÉÑ~j

Cobalah online!

Ini adalah modifikasi dari standar V quine , dan saya bangga bahwa ini hanya satu byte lebih lama.

Hexdump:

00000000: f122 7150 78c9 d17e 6a                   ."qPx..~j

Penjelasan:

ñ           " Record the following commands into register 'q'
 "qP        " Paste register 'q' before all input
    x       " Delete the last character of what we just pasted (this will be a 'ÿ')
     ÉÑ     " Insert 'Ñ' at the beginning of this line
       ~    " Toggle the case of this character
        j   " Move down a line. During playback, this will cancel playback of the current macro,
            " So everything after here is a NOOP

Kemudian, rekaman secara implisit berhenti dan diputar. Ini akan menghasilkan output berikut:

ñ"qPxÉÑ~jHello

Karena jakan merusak pemutaran makro, tidak Helloada yang bisa dijalankan.


2

Python 2, 38 byte

Meskipun input hanya diperlukan untuk mendukung a-z, ini harus bekerja dengan input baris tunggal yang tidak mengandung NUL byte.

s='s=%r;print s%%s#'+input();print s%s

Cobalah online

Untuk input abc, quine yang dihasilkan adalah:

s='s=%r;print s%%s#abc';print s%s#abc

Cobalah online


1

RProgN 2 , 15 byte

"{']C'.%q[}]C"F

Dijelaskan

Menggunakan format

{']C'.%q[}]C}

dimana %qinput qouted, membangun quine rasa

{']C'."Some Text"[}]C

yang merupakan quine RProgN2 standar, {']C'.}]CItu, sebelum selesai, menambahkan dan menghancurkan string yang dimasukkan.

Cobalah online!


1

Retina , 14 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

\(\`^
¶\(*S1`|

Cobalah online!

Untuk input x, output ini:


\(*S1`|x
\(*S1`|x

Penjelasan

Outputnya adalah modifikasi minor dari quine standar . Kami cukup menggunakan regex |xalih-alih regex kosong. Karena |masih mengizinkan (dan memprioritaskan) dan mencocokkan kosong, fungsi itu sendiri tidak terpengaruh, dan karena xhanya akan berisi surat, itu dijamin sintaks regex yang valid itu sendiri.

Pencetakan ini sebenarnya menggunakan teknik yang mirip dengan quine itu sendiri. Untuk menghindari duplikasi quine, kami ¶\(*S1`|hanya memasukkan sekali ke awal string. Itu persis setengah dari kode sumber. Untuk mencetaknya dua kali tanpa linefeed, kami menggunakan konfigurasi \(\, yang membungkus seluruh program dalam sebuah grup dan membuat kedua stage itu sendiri dan juga grup yang memuatnya mencetak hasilnya tanpa linefeed.


1

Japt , 14 byte

"\"iQ ²ª`"+U ²

Uji secara online! Untuk input abc, output

"iQ ²ª`abc"iQ ²ª`abc

yang menghasilkan sendiri. Uji secara online!

Penjelasan

Ini adalah ekstensi dari kuad Japt yang mampu-payload standar:

"iQ ²"iQ ²

"iQ ²"      // Take this string.  iQ ²
      iQ    // Insert a quote.    "iQ ²
         ²  // Repeat this twice. "iQ ²"iQ ²
            // Implicit: output result of last expression

Satu-satunya perbedaan adalah bahwa kita menambahkan ª`abcdi akhir, yang pada dasarnya JavaScript ||"abc". Karena hasil dari bagian pertama selalu berupa string yang tidak kosong (benar), yang ||tidak pernah dijalankan.

Ada beberapa versi alternatif dengan panjang yang sama:

"iQ ²ª`abc"iQ ²ª`abc   quine||"abc"
"iQ ²ª$abc"iQ ²ª$abc   quine||abc
"iQ ²ª{abc"iQ ²ª{abc   quine||function(){ ... }
"iQ ²ªXabc"iQ ²ªXabc   quine||X.a(...) (X could be any uppercase letter or digit)
"iQ ²//abc"iQ ²//abc   quine//abc      (// is a comment in JS/Japt)
"iQ ²;[abc"iQ ²;[abc   quine;          (unmatched [ causes a parsing error)

0

CJam , 16 14 byte

"`_~"q`';++`_~

Cobalah online!

Bagaimana itu bekerja

"`_~"           e# Push "`_~"
     q`         e# Push a string representation of the input (input wrapped in quotes)
       ';       e# Push a semicolon
         ++     e# Concatenate all this together
           `    e# Get the string representation of the resulting string
            _~  e# Duplicate it and eval it (pushing the original string on the stack again)

Yang menghasilkan sesuatu seperti "`_~\"test\";"`_~"test";.



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.