Golf dan Anagram Quine


24

Dalam pertanyaan ini saya meminta Anda untuk menebak quine anagram berdasarkan outputnya. Namun sepertinya kami belum memiliki pertanyaan untuk golf anine quine. Jadi tugas Anda adalah membuat anagram terpendek yang Anda bisa.

Apa itu anagram quine?

Anagram quine adalah program yang tidak kosong yang mencetak anagram dari kode sumbernya, selain dari sumber aslinya.

Berikut adalah contoh quine anagram dengan Python 2:

print`'`print`*2'*2`

Anda seharusnya tidak membaca sumber Anda sendiri untuk tantangan ini.


2
@ LeakyNun Tidak, Ini tidak mungkin quine.
Wheat Wizard

2
Apakah kode yang dikeluarkan harus menjadi program yang valid?
MD XF

1
@ MDXF Tidak itu tidak.
Wheat Wizard

2
@Okx Ini harus mengikuti persyaratan standar kami untuk quine (selain quine).
Wheat Wizard

1
@ LeakyNun Pikiran Anda, saya tidak berpikir program 0-byte memiliki anagram yang berbeda dari aslinya juga!
Neil,

Jawaban:


29

Pyth , 2 byte

)(

Keluaran

()

Cobalah online!

)  # Ends statement, does nothing in this program
 ( # Create an empty tuple
   # Implicitly print the empty tuple

3
Apakah itu berarti Anda menemukan bahwa ()quine jauh lebih pendek daripada yang terkenal jN*2]"jN*2] ?
Jim

1
@ Jim tidak, karena ini tidak mampu payload: c
Rod

9

V , 4 byte

2ii2

Output:

i2i2

Cobalah online!


2x masukkan i2?
CalculatorFeline

1
Ya. 2 -> do the next thing twice i -> insert the following
Riley

Ah saya mengerti, saya pikir ini Vim.
Wheat Wizard

@WheatWizard Tidak, ini adalah modifikasi sepele dari quine V standar.
Riley

1
@isaacg: tidak, di Vim Anda harus menekan ESC setelah Anda selesai, yang merupakan masalah karena tidak ada karakter ESC dalam output.

9

> <> , 9 8 7 byte

Golf 1 byte berkat @WheatWizard dengan menggunakan !dan menambahkannya untuk mendapatkannya"

Golf 1 byte berkat @ ConorO'Brien dengan menggunakan #bukan<!

":1->o#

Cobalah online!

Keluaran "#o>-1:.

Penjelasan

":1->o#"        Push this string (note that the IP wraps around)
:               Duplicate the top value of the stack (35 from the "#")
1-              Subtract one from it to get 34 ('"')
>o#             Print every character on the stack until the program cannot pop any more and still tries to pop a value from the stack afterwards
                The program exits with an error from not being able to pop a value from an empty stack

":1+>o<!sedikit lebih pendek.
Wheat Wizard

@WheatWizard Terima kasih, itu adalah golf yang rapi :)
Kritixi Lithos

1
Anda bisa mendapatkan 7 byte:":1->o#
Conor O'Brien

@ ConorO'Brien Terima kasih atas tipnya, itu sangat pintar.
Kritixi Lithos

Terima kasih :) Saya terkejut bahwa ini bekerja lebih baik di sini daripada di quine yang sebenarnya
Conor O'Brien

9

Brainfuck, 158 byte

>>--<<-[[<+>->+>->+++<<<]>-]<<<<<<[--->>.<<]>>++<<<[->>>.<<<]>>-<<<[--->>>.<<<]>>>--<<<<[++>>>>.<<<<]>>>>+++>--.[---<.>]>+.......++.......<<<>>>>>>>>>-----+++

Cobalah online!

Ini mungkin bukan versi terpendek, tetapi setidaknya itu berfungsi.

Fakta yang menyenangkan , kode output sebenarnya dapat dieksekusi (dan itu tidak berakhir).

Keluaran

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>--------------------------++++++++++++++++++<....................[[[[[[[]]]]]]]

Penjelasan

>>--<<-[[<+>->+>->+++<<<]>-]    Initializes the tape with the
                                help of a recurrence relation.
<<<<<<[--->>.<<]>>++<<<[->>>
.<<<]>>-<<<[--->>>.<<<]>>>--    Prints the characters using
<<<<[++>>>>.<<<<]>>>>+++>--.    classic loops.
[---<.>]>+.......++.......

<<<>>>>>>>>>-----+++            Junk to complete the anagram.


7

Ruby , 8 byte

p"p*2"*2

Cobalah online!

Ini mencetak

"p*2p*2"

Penjelasan

Ini berfungsi mirip dengan jawaban python dalam pertanyaan. Ini akan membuat string p*2p*2kemudian menggunakan Ruby pakan mencetak representasi dari string.


Anda bisa menggunakan pbukan puts?! Begitu banyak waktu yang terbuang ...
Magic Gurita Guci

4
@carusocomputing Ini tidak persis sama dengan menempatkan. p xsetara denganputs x.inspect
Conor O'Brien

6

JavaScript (ES6), 40 32 byte

f=($=`($)=>{$=$+"${"``"}$"}`)=>$+$

Tidak main-main dengan Function.toString juga. Sebagai bonus, kode di dalam string hampir terlihat legal. Sunting: Disimpan 8 byte dengan menggunakan +alih-alih repeat(2).


1
Mengapa tidak menggunakan *2bukan .repeat(2), apakah itu tidak bekerja?
Magic Octopus Mm

1
@carusocomputing JavaScript tidak membebani *string
Conor O'Brien

1
@carusocomputing Itu memberiku ide, terima kasih!
Neil


4

Japt , 10 9 byte

Menemukan cara yang lebih baik :-)

Q+2ç"Q+2ç

Keluaran "Q+2çQ+2ç.Uji secara online!

Penjelasan

Q+2ç"Q+2ç    // Implicit: Q = quotation mark
    "Q+2ç    // Take this string.     Q+2ç
  2ç         // Repeat it twice.      Q+2çQ+2ç
Q+           // Prepend a quote.      "Q+2çQ+2ç
             // Implicit: output result of last expression

Bisa juga Qi2ç"Qi2ç, yang dicetak Qi2çQi2ç". Yang ini lebih dekat ke standar Japt quine:

"iQ ²"iQ ²

Tapi saya tidak percaya ada cara mudah untuk memotong tanda kutip di tengah string untuk quine 9-byte.


Lain 10-byter:Q+"+Q² " ²
Conor O'Brien

@ ConorO'Brien Yap, dan Anda selalu dapat mengatur 4 karakter di dalam string di masing-masing 24 permutasi yang mungkin. Saya juga percaya Anda selalu dapat mengganti kedua spasi dengan baris baru
ETHproduksi

3

Ruby, 20 byte

$><<%q($><<%q()*2)*2

Ini output

$><<%q()*2$><<%q()*2

Mengambil keuntungan dari %q(...)sintaks string Ruby , yang mendukung tanda kurung bersarang.


3

Retina , 8 byte


_

$nn$

Cobalah online!

Cetakan


n$_
n$

Keduanya mengandung satu _, duan , dua $dan tiga umpan baris.

Perhatikan bahwa linefeed yang diikuti oleh hampir semua karakter lain adalah solusi sepele, tetapi dipertanyakan apakah itu valid, karena karakter kedua hanya mengkodekan dirinya sendiri dan linefeed tidak benar-benar menyandikan salah satu karakter output.

Penjelasan


_

Ganti input kosong dengan a _.


$nn$

Cocokkan string kosong, yang terjadi sebelum atau sesudah _dan masukkan baris baris ( $n), an n, dan a $. Sejak pertama kali kami menyisipkan itu _, ini menambahkan masing-masing karakter tersebut dua kali, jadi ndan $akun untuk$n , dan kita mendapatkan dua dari tiga baris baris yang kita butuhkan dalam output. Linefeed ketiga dicetak karena Retina mencetak linefeed trailing secara default.

Kita juga bisa menggunakan n$n$pada tahap ini, yang kemudian akan mencetak:

n
$_n
$


3

Python Repl, 4 byte

Ini adalah solusi Code Golf pertama saya, jadi saya harap ini memenuhi aturan. Dalam interpreter interaktif Python 2 atau 3:

>>> (1),
(1,)

Outputnya adalah anagram input.


Lain:

>>> 2*'2*'
'2*2*'

Dengan Python 2:

>>> type('rst <>'),
(<type 'str'>,)

Dengan Python 3:

>> {1, 0}
{0, 1}

Pembaruan 2017-06-15: Satu lagi:

>>> 01.
1.0

1
Saya pikir jawaban terakhir di sini melanggar aturan quine (semua karakter dalam output melayani tujuan yang sama dengan karakter yang cocok pada input). Yang lainnya baik-baik saja.

2

Haskell , 38 39 byte

main=print$[0,0]>>"main=print$[0,0]>>"

Cobalah online! Keluaran:

"main=print$[0,0]>>main=print$[0,0]>>"

Sunting: +1 byte karena saya sebelumnya lupa tentang baris baru trailing implisit dari print.


Alternatif: (Jumlah byte yang sama tetapi tidak mengandung ASCII-owl)

main=print$e++e;e="main=print$e++e;e="

Cobalah online!

Keluaran:

"main=print$e++e;e=main=print$e++e;e="

Hanya sebuah anagram quine daripada quine true ....
Feathercrown

2

Groovy, 24 20 byte

{"""{""*""2""}"""*2}

-4 Berkat CalculatorFeline, spasi putih tidak diperlukan sama sekali!

Keluaran:

{""*""2""}{""*""2""}

Penjelasan:

Penutupan anonim yang, ketika dipanggil, kembali {""*""2""}dua kali (bersambung).


1
Mohon penjelasannya. Juga, byte dapat (mungkin) disimpan dengan menggunakan *2bantalan sebagai di antara tanda kutip:{"""{""*""2""}"""*2}
CalculatorFeline

@ CalculatorFeline cukup jelas. Tapi ya, itu adalah ide <s> 100% </s> 9% lebih baik daripada saya.
Magic Gurita Guci

3
Sebenarnya, ini hanya 9% lebih baik: P
CalculatorFeline

2

05AB1E , 10 byte

'∞∞''∞'JJ∞

Cobalah online!

Keluaran:

∞∞''JJ''∞∞

Penjelasan:

Code       | Explanation                | Stack
-----------+----------------------------+-------------------
'∞         | Push literal '∞'.          | ["∞"]
  ∞        | Mirror.                    | ["∞∞"]
   ''      | Push literal "'".          | ["∞∞","'"]
     ∞     | Mirror.                    | ["∞∞","''"]
      'J   | Push literal 'J'.          | ["∞∞","''","J"]
        J  | Join it all together.      | ["∞∞''J"]
         ∞ | Mirror.                    | ["∞∞''JJ''∞∞"]
-----------+----------------------------+-------------------
           | Implicit print.            | ∞∞''JJ''∞∞

2

CJam , 6 byte

"_`"_`

Cobalah online!

Cetakan

_`"_`"

Penjelasan

"_`"   e# Push this string.
_      e# Duplicate.
`      e# Stringify it, which wraps it in quotes.
       e# Implicitly print stack contents.

Saya akan memposting ini ... "` _ "_` juga berfungsi
Luis Mendo

1

Bash, 36 byte

tee f<<<'tee f<<<""cat f'"''"
cat f

Ini output

tee f<<<""cat f''
tee f<<<""cat f''

(dan membuat file f sebagai efek samping, tapi itu diperbolehkan per meta .)

Baik program dan output memiliki baris baru.

Proses pemikiran: Saya pikir cara termudah untuk mengeluarkan string dua kali, selain menetapkannya ke variabel, adalah dengan melakukan

tee f<<<string
cat f

String perlu dikutip karena akan berisi spasi dan <karakter, jadi aku punya

tee f<<<'tee f<<<cat f'
cat f

yang hampir berhasil, kecuali itu tidak menampilkan tanda kutip. Untungnya, Bash mendukung penggabungan string literal dengan hanya menempatkannya di sebelah satu sama lain, jadi menambahkan "''"ke herestring dan memasukkan ""ke dalam bagian kutipan tunggal menghasilkan solusi ini.



1

CJam , 8 byte

"2*`"2*`

Cobalah online!

Penjelasan

Mirip dengan contoh Python dalam pertanyaan

"2*`"     e# Push the string "2*`"
     2*   e# Repeat it twice
       `  e# Get its string representation (wrap in quotes)

Outputnya adalah "2*`2*`".


1

Befunge, 11 byte

' 2+">:#,_@

Cetakan:

+2 '@_,#:>"

Penjelasan:

' 2+"        Put a " on the stack (32 + 2)
    "        Put the rest of the code on stack (wrap-around string)
     >:#,_   Print stack
          @  End

Iya nih. tapi begitu juga ". Apa batasan tepatnya itu?
MegaTom

Saya tidak berpikir bahwa "dianggap membaca sumber sendiri, itu hanya string literal. gNamun cukup terang-terangan membaca sumbernya sendiri.
Wheat Wizard

@ WoatWizard oke. Aku akan mengubahnya.
MegaTom

":1+>:#,_@!juga berfungsi tetapi tidak lebih pendek.
Wheat Wizard

' 2+"8k,@untuk 9 byte
ovs

1

QBIC , 8 byte

?A+@?A@+

Saya baru tahu cara melakukan quine yang tepat di QBIC. Membuat anagram dari itu dilakukan dengan hanya beralih di sekitar karakter dalam string literal. Ada 24 anagram yang mungkin dengan cara ini.



1

Ohm , 14 byte

"æ3M.Cæ"æ3M."C

Cobalah online!

Keluaran:

æ3M.CæC.M3æ"""

Penjelasan

"æ3M.Cæ"æ3M."C
"æ3M.Cæ"       # Pushes "æ3M.Cæ"
        æ      # Palindrone of that string
         3M    # 3 times...
           ."   # Push " on the stack
             C  # Concatenate with the string above


1

Fisi 2 , 9 8 6 byte

R"'!+O

Cobalah online!

Penjelasan

Sebuah atom diciptakan di R, yang bergerak ke kanan. Atom ini kemudian menemukan a ", yang memulai mode pencetakan. Dalam mode pencetakan, semua karakter (hingga pencocokan ") dicetak. Ini berarti ia mencetak '!+ORdalam kasus ini. Kemudian, semua yang tersisa adalah pencetakan ", yang dilakukan oleh karakter yang tersisa. '!menetapkan massa atom ke kode karakter !, dan +menambahkannya ke kode karakter ". Kemudian, kode karakter dihasilkan olehO dan atom dihancurkan, mengakhiri program.

(Sebenarnya, ini hanyalah rotasi dari quine terpendek)


Saya percaya Anda bisa menggunakan standar quine dan menggesernya secara siklis (jadi sesuatu seperti R"'!+O, belum diuji).
Martin Ender

@ MartinEnder: Anda benar. Diperbarui. Terima kasih telah membantu.
Luke

1

Mathematica, 2 byte

.0

Keluaran:

0.

Angka yang dimulai dengan titik desimal seperti .123ditafsirkan 0.123, sehingga .0ditafsirkan sebagai 0.0. Karena bagian dari angka setelah titik desimal adalah nol, Mathematica tidak mencetaknya.


1
Saya rasa ini tidak valid. Definisi situs kami mensyaratkan bahwa quine memiliki "encoder" dan "decoder", ini hanya melarang quine tipe literal.
Wheat Wizard

Semua aturan untuk quine terbawa ke tantangan ini.
Wheat Wizard

@ WyatWizard: Encode .itu sendiri, tapi saya rasa 0tidak? Angka 0 di luar titik desimal tidak dapat secara waras dilihat sebagai penyandian nol awal sebelum titik desimal, yang terakhir adalah efek samping dari pencetakan pelampung. Jadi di bawah aturan quine lama, tidak ada masalah di sini. (Saya tidak yakin apakah aturan baru ini sudah berlaku.)

@ ais523 Saya tidak tahu. Mungkin ini harus diatasi dengan pertanyaan meta.
Wheat Wizard



1

Stax , 8 4 byte

.S.S

Jalankan dan debug online!

Port langsung dari jawaban ini .

Versi lama, 8 byte

..b..LbL

Jalankan dan debug online!

Versi alternatif dengan trik yang cukup murah yang dapat diterapkan ke quines yang tepat di hampir semua bahasa.

"43bL"34bL

Jalankan dan debug online!

Karena "34bL"34bL merupakan quine yang tepat di Stax.

Namun versi lain, hanya menggunakan string string single-char.

''c'Lc'cccLcLL

Jalankan dan debug online!

Penjelasan

.S.S        Generates powerset ["","S","S.","."]
            Implicit flatten and output

..b         Push string ".b"
   ..L      Push string ".L"
      b     Duplicate both strings
       L    Concatenate all 4 strings to a single one.

0

05AB1E , 13 byte

"34çJ∞"34çJ∞

Output:

34çJ∞""∞Jç43

Cobalah online!

"34çJ∞"      # Push this string                 | [ 34çJ∞ ]
       34ç   # Push a quote (")                 | [ 34çJ∞, " ]
          J  # Join                             | [ 34çJ∞" ]
           ∞ # Mirror                           | [ 34çJ∞""∞Jç43 ]
             # Implicitly output with a newline
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.