Quine / Reverse Quine


26

Tulis program lengkap yang mengambil input boolean atau bilangan bulat non-negatif. Itu harus:

  • Keluarkan kode sumbernya sendiri jika nilai input salah
  • Keluarkan kode sumbernya sendiri secara terbalik jika nilai input benar

Program Anda tidak bisa palindromik, juga tidak bisa membaca kode sumbernya sendiri dengan cara apa pun.

Ini adalah kode golf - kode terpendek dalam byte yang menang.


6
Jadi ... jika bahasa saya tidak memiliki boolean. Tetapi 0 adalah bilangan bulat palsu dan positif adalah benar. Dapatkah saya berasumsi bahwa inputnya hanya 0 atau 1 (sebagai stand-in untuk boolean - bahasa sebenarnya akan selalu menghasilkan salah satu dari keduanya sebagai hasil dari operator bersyarat)? Atau apakah saya harus mendukung bilangan bulat apa pun, karena saya tidak dapat menggunakan boolean "sebenarnya"?
Martin Ender

Jawaban:


9

Gol> <> , 9 byte

'rd3*I?rH

Saya merasa sedikit canggung memposting ini, karena kami sudah>> menjawab, Vitsy dan Minkolang. Satu-satunya tambahan ke quine standar adalah I(baca input integer), ?(jalankan selanjutnya jika benar) dan r(tumpukan terbalik).

Cobalah online .


Bergabung dengan klub! : D Kamu menang. +1
Addison Crump

1
8 byte:sP#Hr?I"
Jo King

18

CJam, 17 16 byte

{`"_~"+Wq~g#%}_~

Uji di sini.

Modifikasi quine standar yang cukup mudah. Solusi lain untuk 17 byte:

{`"_~"+q~{W%}&}_~
{`"_~"+q~!2*(%}_~

Jika saya dapat berasumsi bahwa inputnya hanya 0 atau 1 (sebagai stand-in untuk boolean, yang tidak ada tipe khusus untuk di CJam), saya mendapatkan 15 dengan menghilangkan g:

{`"_~"+Wq~#%}_~

Penjelasan

{`"_~"+  e# Standard generalised quine framework. Leaves the source code on the stack. 
  W      e# Push a -1.
  q~     e# Read and evaluate input.
  g      e# signum, turning truthy values into 1 (leaving 0 unchanged).
  #      e# Power. -1^0 == 1, -1^1 == -1.
  %      e# Select every Nth element: a no-op for 1 and reverses the string for -1.
}_~

Karena 0 dan 1 adalah Boolean CJam, saya tidak berpikir Anda membutuhkannya g.
Dennis

@ Dennis Ya saya tidak begitu yakin tentang itu.
Martin Ender

Anehnya, saya entah bagaimana mengalahkan ini. oo Saya tidak akan terkejut jika Anda menurunkannya lagi. : D
Addison Crump

9

Pyth, 17 byte

_WQjN*2]"_WQjN*2]

Modifikasi sederhana dari standar Pyth quine.


Sial, aku sudah menunggu untuk memposting ini sejak satu jam setelah itu dikosongkan.
lirtosiast

7

> <>, 17 Bytes

Membutuhkan flag -v (+1 byte) untuk mendorong input ke stack (atau bagi Anda untuk memasukkan input pada stack sebelumnya pada interpreter online).

'rd3*$?rol?!;70.

Anda dapat melakukan hal di bawah ini untuk jumlah byte yang sama (tanpa tanda) jika input integer hanya diizinkan (yaitu 0 untuk falsy, 1 untuk kebenaran).

'rd3*ic%?rol?!;80.

Cobalah online

Kebenaran / kepalsuan untuk> <> adalah sesuatu yang bukan 0 dan 0, masing-masing.


6

Vitsy , 15 Bytes

... Aku ... aku mengalahkan CJam! (berteriak) Bu! Lihat, bu, aku melakukan itu!

'rd3 * i86 * -) rl \ O

Penjelasan:

'rd3 * i86 * - (rl \ O
Quine standar, tetapi dengan twist:

'Tangkap kode sumber sebagai string
 rd3 * Buat karakter 'di ASCII
     i86 * - Dapatkan karakter input sebagai ASCII lalu kurangi 48 dari itu. 
                    Jika nol, maka pernyataan if akan melewatkan instruksi selanjutnya.
          (r Jika item teratas tumpukan adalah nol, jangan lakukan item berikutnya.
                    Item selanjutnya di sini adalah terbalik.
            l \ O Cetak tumpukan.

Versi Vitsy yang lebih baru , 11 Bytes

v'rd3 *} v) rZ
v Menangkap input sebagai variabel.
 'Tangkap sumbernya sampai bertemu yang lain'
  r Membalik tumpukan.
   d3 * Dorong 'ke tumpukan.
      ► Putar tumpukan ke kanan.
       v) Dorong variabel (input) ke tumpukan dan uji jika tidak nol.
         r Jika demikian, balikkan tumpukan.
          Z Keluarkan semua yang ada di tumpukan.

2

Javascript (ES6), 42 byte

$=_=>'$='+(_?$:[...''+$].reverse().join``)

Ini adalah modifikasi dari Bling Quine saya . Ini juga dua kali lebih panjang.


Apakah ini benar-benar menghasilkan sesuatu? Jawaban yang hanya berfungsi dalam REPL tidak diizinkan.
feersum

1
@ ETHproductions Itu akan memanggil fungsi, tetapi masih tidak akan mencetak apa pun. Juga, itu tidak akan menjadi quine lagi.
Dennis

@ Dennis Benar. Yah, kurasa itu artinya prompt()diperlukan, kecuali kita beralih ke Node.JS. Saya percaya $=_=>(A=`$=${$};$(prompt())`,alert(_?A:[...A].reverse().join``));$(prompt())berfungsi dengan baik, meskipun mungkin bisa diturunkan lebih banyak.
ETHproduksi

1
"Program Anda tidak dapat [...] membaca kode sumbernya sendiri dengan cara apa pun." Apakah solusi ini termasuk dalam kategori ini?
ETHproduksi

2

Burlesque, 40 byte

ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh

Penjelasan:

Burlesque memiliki built-in stack dan manipulasi kode tingkat lanjut. Bahkan, Anda tidak dapat mengakses kode sumber program tetapi Anda dapat mengakses kode yang tersisa yang akan dieksekusi di masa depan. Ini berarti #Qakan mengembalikan semua kode yang mengikutinya, itulah sebabnya kami harus menambahkan semuanya #Qke kode tersebut yang kami lakukan ri#Q.

blsq ) #Q1 2++
12 -- this is the result of 1 2++
{1 2 ++} -- this is the result of #Q

++1 2adalah kode yang secara teknis ilegal karena itu berdasarkan tumpukan. Tetapi kita dapat memanipulasi kode untuk membuatnya dieksekusi sebagai 1 2++:

blsq ) #Q<-#q++1 2 
12

Bekerja dengan built-in ini sangat sulit dan belum ada yang menggunakannya untuk hal-hal yang produktif kecuali untuk hal-hal terkait quine. Jika Anda membalikkan ++1 2Anda mendapatkan 2 1++yang akan menghasilkan 21dan tidak 12. Alasan kode di atas menghasilkan 12adalah karena #Qjuga termasuk <-jadi pada akhirnya kita akhirnya mengeksekusi lebih dari sekedar 2 1++: p. Kami akhirnya mengeksekusi 2 1++#q<-yang menghasilkan 12.

Kita sebenarnya dapat mengganti hal-hal dalam kode kita misalnya kode ini menggantikan semua kejadian ?+dengan sendirinya?*

blsq ) #Q(?+)(?*)r~5.-#q5 5?+
25

Pemakaian:

$ echo "1" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
hs fi sp "-<" j +. /\ "Q#ir" -~ HS 2Q#ir
$ echo "0" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh

2

Haskell, 126 118 108 byte

main=readLn>>=putStr.([t,reverse t]!!);t=s++show s;s="main=readLn>>=putStr.([t,reverse t]!!);t=s++show s;s="

Diharapkan 0atau 1sebagai input.


2

Minkolang 0,10 , 13 byte

"66*2-n,?r$O.

Coba di sini.

Ini adalah persis seperti Quine standar kecuali untuk empat karakter ini: n,?r. nmengambil integer dari input, ,membalikkannya, jadi ?lompati rjika input tersebut benar. Jika tidak, rbalikkan tumpukan sehingga menjadi output dalam urutan terbalik.


1
Guntur saya hilang. : c
Addison Crump

2

Python 2, 51 byte

s="print('s=%r;exec s'%s)[::1-2*0**input()]";exec s

0

Java 10 (program penuh), 282 byte

interface N{static void main(String[]a){var s="interface N{static void main(String[]a){var s=%c%s%1$c;s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}";s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}

Cobalah online.

Java 10 (sebagai fungsi lambda), 154 byte

b->{var s="b->{var s=%c%s%1$c;s=s.format(s,34,s);return b?new StringBuffer(s).reverse():s;}";s=s.format(s,34,s);return b?new StringBuffer(s).reverse():s;}

Cobalah online.

Penjelasan:

interface N{                          // Class
  static void main(String[]a){        //  Mandatory main-method
    var s="interface N{static void main(String[]a){var s=%c%s%1$c;s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}";
                                      //   Unformatted source code
    s=s.format(s,34,s);               //   Format the source code (the quine-String)
    System.out.print(                 //   Print:
      new Boolean(a[0])?              //    If the input is true:
       new StringBuffer(s).reverse()  //     Print the quine-String reversed
      :                               //    Else:
       s);}}                          //     Print the quine-String as is

penjelasan :

  • Ini var sberisi kode sumber yang tidak diformat
  • %s digunakan untuk menempatkan String ini ke dalam dirinya dengan s.format(...)
  • %c,, %1$cdan 34digunakan untuk memformat tanda kutip ganda
  • s.format(s,34,s) menempatkan semuanya bersama-sama

Dan kemudian new StringBuffer(s).reverse()digunakan untuk membalik quine-String jika perlu berdasarkan input-boolean.


0

05AB1E , 21 byte

0"D34çý‚sè"D34çý‚sè

Cobalah online.

Modifikasi default 0"D34çý"D34çýdengan menambahkan ‚sè.

Penjelasan:

0                        # Push 0 to the stack
                         #  STACK: [0]
 "D34çý‚sè"             # Push the string 'D34çý‚sè' to the stack
                         #  STACK: [0, 'D34çý‚sè']
            D            # Duplicate this string
                         #  STACK: [0, 'D34çý‚sè', 'D34çý‚sè']
             34ç         # Push '"' to the stack
                         #  STACK: [0, 'D34çý‚sè', 'D34çý‚sè', '"']
                ý        # Join the stack with '"' delimiter
                         #  STACK: ['0"D34çý‚sè"D34çý‚sè']
                 Â       # Bifurcate (short for Duplicate & Reverse)
                         #  STACK: ['0"D34çý‚sè"D34çý‚sè', 'ès‚Âýç43D"ès‚Âýç43D"0']
                        # Pair them up:
                         #  STACK: [['0"D34çý‚sè"D34çý‚sè','ès‚Âýç43D"ès‚Âýç43D"0']]
                   s     # Swap to get the boolean input (0 or 1)
                         #  STACK: [['0"D34çý‚sè"D34çý‚sè','ès‚Âýç43D"ès‚Âýç43D"0'], 1]
                    è    # Index the input into the list
                         #  STACK: ['ès‚Âýç43D"ès‚Âýç43D"0']
                         # (Output the top of the stack implicitly)

PS: Secara otomatis mencetak baris tambahan. Jika ini harus dibalik juga, itu 23 byte sebagai gantinya:

0"D34çý‚sè?"D34çý‚sè?

Cobalah online. ( ?adalah Cetak eksplisit tanpa baris baru )

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.