Гольф анаграмма Куайн

24

В этом вопросе я попросил вас угадать анаграмму, основываясь на ее результатах. Однако, похоже, что у нас еще нет вопроса о том, чтобы поиграть в анаграмму. Таким образом, ваша задача состоит в том, чтобы создать самую короткую анаграмму, какую только можно.

Что такое анаграмма?

Qua anagram - это непустая программа, которая печатает анаграмму своего исходного кода, отличную от исходного.

Вот пример анаграммы quine в Python 2:

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

Вы не должны читать свой собственный источник для этой проблемы.

Мастер пшеницы
источник
2
@ LeakyNun Нет, это не может быть квиня.
Пшеничный волшебник
2
Должен ли выводимый код быть допустимой программой?
MD XF
1
@ MDXF Нет, это не так.
Пшеничный волшебник
2
@Okx Это должно следовать нашим стандартным требованиям к квине (кроме как квине).
Пшеничный волшебник
1
@LeakyNun Имейте в виду, я не думаю, что 0-байтовые программы имеют анаграммы, которые также отличаются от оригинала!
Нил

Ответы:

29

Pyth , 2 байта

)(

Выходы

()

Попробуйте онлайн!

)  # Ends statement, does nothing in this program
 ( # Create an empty tuple
   # Implicitly print the empty tuple
прут
источник
3
Означает ли это, что вы обнаружили, что ()квинна намного короче, чем хорошо известная jN*2]"jN*2] ?
Джим
1
@ Джим нет, потому что это не способно к полезной нагрузке: c
Rod
9

V , 4 байта

2ii2

Выходы:

i2i2

Попробуйте онлайн!

Райли
источник
2x вставить i2?
CalculatorFeline
1
Ага. 2 -> do the next thing twice i -> insert the following
Райли
Ах, я вижу, я думал, что это была Вим.
Wheat Wizard
@WheatWizard Нет, это тривиальная модификация стандарта V quine.
Райли
1
@isaacg: нет, в Vim вам нужно будет нажать ESC, когда вы закончите, что является проблемой, потому что в выводе нет символа ESC.
9

> <> , 9 8 7 байт

Гольф 1 байт благодаря @WheatWizard, используя !и увеличивая его, чтобы получить"

Гольф 1 байт благодаря @ ConorO'Brien с использованием #вместо<!

":1->o#

Попробуйте онлайн!

Выходы "#o>-1:.

объяснение

":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
Kritixi Lithos
источник
":1+>o<!немного короче.
Пшеничный волшебник
@WheatWizard Спасибо, это был
отличный
1
Вы можете получить 7 байтов:":1->o#
Конор О'Брайен
@ ConorO'Brien Спасибо за совет, это действительно умно.
Kritixi Lithos
Спасибо :) Я приятно удивлен, что здесь работает лучше, чем в самом деле
Конор О'Брайен,
9

Brainfuck, 158 байт

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

Попробуйте онлайн!

Это может быть не самая короткая версия, но, по крайней мере, она работает.

Интересный факт , что выходной код действительно может быть выполнен (и он действительно завершается).

Выход

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

объяснение

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

<<<>>>>>>>>>-----+++            Junk to complete the anagram.
6infinity8
источник
8

Python 3, 32 байта

печать ( "" "р" г "я" п "т" 2 ( ") *" "" * 2)

Отпечатки p"r"i"n"t"2(")*p"r"i"n"t"2(")*\n, отсортированный вывод:\n""""""""""""(())**22iinnpprrtt

CalculatorFeline
источник
Ой, старая версия :(
CalculatorFeline
1
@ Downvoter Пожалуйста, отмените голосование.
CalculatorFeline
7

Рубин , 8 байт

p"p*2"*2

Попробуйте онлайн!

Это печатает

"p*2p*2"

объяснение

Это работает аналогично Python ответ на вопрос. Он создаст строку, а p*2p*2затем с помощью Ruby pнапечатает представление строки.

Мастер пшеницы
источник
Вы можете использовать pвместо puts?! Так много потраченного времени ...
Урна волшебного осьминога
4
@carusocomputing Это не совсем то же самое, что Put. p xэквивалентноputs x.inspect
Конор О'Брайен
6

JavaScript (ES6), 40 32 байта

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

Никакого возни с Function.toString тоже нет. В качестве бонуса, код внутри строки выглядит почти законно. Редактировать: Сохранено 8 байт, используя +вместо repeat(2).

Нил
источник
1
Почему бы не использовать *2вместо .repeat(2), это не работает?
Волшебная Урна Осьминога
1
@carusocomputing JavaScript не перегружает *строки
Конор О'Брайен,
1
@carusocomputing Это дало мне идею, спасибо!
Нил
4

Japt , 10 9 байт

Нашел лучший способ :-)

Q+2ç"Q+2ç

Выходы "Q+2çQ+2ç. Проверьте это онлайн!

объяснение

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

Также может быть Qi2ç"Qi2ç, что печатает Qi2çQi2ç". Этот ближе к стандартному япошке Quine:

"iQ ²"iQ ²

Но я не верю, что есть какой-либо простой способ вставить кавычку в середине строки для 9-байтовой квинны.

ETHproductions
источник
Еще 10 байтов:Q+"+Q² " ²
Конор О'Брайен
@ ConorO'Brien Да, и вы всегда можете расположить 4 символа в строке в каждой из 24 возможных перестановок. Также я считаю, что вы всегда можете заменить оба пробела символами новой строки
ETHproductions
3

Рубин, 20 байтов

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

Это выводы

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

Использование %q(...)строкового синтаксиса Ruby , который поддерживает вложенные скобки.

Дверная ручка
источник
3

Сетчатка , 8 байт


_

$nn$

Попробуйте онлайн!

Печать


n$_
n$

Оба содержат один _, два n, два $и три перевода строки.

Обратите внимание, что перевод строки, за которым следует почти любой другой символ, является тривиальным решением, но сомнительно, действителен ли он, потому что второй символ кодирует только себя, а перевод строки в действительности не кодирует ни один выходной символ.

объяснение


_

Замените пустой ввод на _.


$nn$

Сопоставьте пустую строку, которая происходит как до, так и после, _и вставьте перевод строки ( $n), an nи a $. Так как мы сначала вставили это _, это добавляет каждый из этих символов дважды, поэтому и nи $учитывают $n, и мы получаем два из трех перевода строки, которые нам нужны в выводе. Третий перевод строки печатается, потому что Retina печатает завершающий перевод строки по умолчанию.

Мы могли бы также использовать n$n$на этом этапе, который бы напечатал:

n
$_n
$

Мартин Эндер
источник
3

Python Repl, 4 байта

Это мое первое решение Code Golf, поэтому я надеюсь, что оно соответствует правилам. В Python 2 или 3 интерактивный переводчик:

>>> (1),
(1,)

Вывод представляет собой анаграмму ввода.


Другая:

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

В Python 2:

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

В Python 3:

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

Обновление 2017-06-15: Еще одно:

>>> 01.
1.0
Полковник паника
источник
1
Я думаю, что последний ответ здесь нарушает правила quine (все символы в выходных данных служат той же цели, что и соответствующие символы во входных данных). Остальные в порядке, хотя.
2

Haskell , 38 39 байт

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

Попробуйте онлайн! Выход:

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

Изменить: +1 байт, потому что я ранее забыл о неявном конце новой строки print.


Альтернатива: (Тот же счетчик байтов, но не содержит ASCII-сову)

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

Попробуйте онлайн!

Выход:

"main=print$e++e;e=main=print$e++e;e="
Laikoni
источник
Просто
айва
2

Groovy, 24 20 байт

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

-4 благодаря CalculatorFeline, пробел не был нужен в конце концов!

Выход:

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

Объяснение:

Анонимное закрытие, которое при вызове возвращается {""*""2""}два раза (сцеплено).

Урна волшебного осьминога
источник
1
Пояснения пожалуйста. Кроме того, байты могут (вероятно) быть сохранены, используя *2заполнение между кавычками:{"""{""*""2""}"""*2}
CalculatorFeline
@CalculatorFeline это довольно очевидно. Но да, это идея на <s> 100% </ s> 9% лучше, чем моя.
Волшебная Урна Осьминога
3
На самом деле, это только на 9% лучше: P
CalculatorFeline
2

05AB1E , 10 байтов

'∞∞''∞'JJ∞

Попробуйте онлайн!

Выход:

∞∞''JJ''∞∞

Объяснение:

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 байтов

"_`"_`

Попробуйте онлайн!

Печать

_`"_`"

объяснение

"_`"   e# Push this string.
_      e# Duplicate.
`      e# Stringify it, which wraps it in quotes.
       e# Implicitly print stack contents.
Мартин Эндер
источник
Я собирался опубликовать это ... "` _ "
Луис Мендо
1

Баш, 36 байт

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

Это выводы

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

(и создает файл fкак побочный эффект, но это разрешено для каждой мета ).

И у программы, и у выхода есть завершающий перевод строки.

Мысленный процесс: я подумал, что самый простой способ вывести строку два раза, кроме присвоения ее переменной, это сделать

tee f<<<string
cat f

Строка должна быть заключена в кавычки, потому что она будет содержать пробелы и <символы, так что тогда у меня было

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

который почти работает, за исключением того, что он не выводит кавычки. К счастью, Bash поддерживает конкатенацию строковых литералов, просто помещая их рядом друг с другом, поэтому добавление "''"к строке и вставка ""внутри части одинарных кавычек дает это решение.

Дверная ручка
источник
1

CJam , 8 байт

"2*`"2*`

Попробуйте онлайн!

объяснение

Аналогично примеру с Python в вопросе

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

Выход есть "2*`2*`".

Бизнес Кот
источник
1

Befunge, 11 байт

' 2+">:#,_@

Печать:

+2 '@_,#:>"

Объяснение:

' 2+"        Put a " on the stack (32 + 2)
    "        Put the rest of the code on stack (wrap-around string)
     >:#,_   Print stack
          @  End
MegaTom
источник
Да. но так же ". Какое именно ограничение на это?
MegaTom
Я не думаю, что "это считается чтением из собственного источника, это просто строковый литерал. gоднако довольно нагло читает свой собственный источник.
Пшеничный волшебник
@WheatWizard хорошо. Я изменю это.
MegaTom
":1+>:#,_@!тоже работает но не короче.
Пшеничный волшебник
' 2+"8k,@за 9 байт
OVS
1

QBIC , 8 байт

?A+@?A@+

Я только что понял, как сделать правильный quine в QBIC. Создание из нее анаграммы осуществляется простым переключением символов в строковом литерале. Таким образом, существует 24 возможных анаграммы.

steenbergh
источник
1

Ом , 14 байт

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

Попробуйте онлайн!

Выход:

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

объяснение

"æ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
Datboi
источник
1

Деление 2 , 9 8 6 байт

R"'!+O

Попробуйте онлайн!

объяснение

Создается атом R, который движется вправо. Этот атом затем попадает в точку ", которая запускает режим печати. В режиме печати все символы (до совпадения ") печатаются. Это означает, что он печатает '!+ORв этом случае. Затем все, что осталось, это печать ", которая выполняется оставшимися символами. '!устанавливает массу атома в код символа !и +увеличивает его в код символа ". Затем код символа выводится с помощью, Oи атом уничтожается, завершая программу.

(На самом деле, это просто вращение самой короткой квины)

Люк
источник
Я считаю, что вы можете просто использовать стандартный quine и циклически сдвигать его (что-то вроде того R"'!+O, что не проверялось).
Мартин Эндер
@MartinEnder: ты прав. Обновлено. Спасибо за помощь.
Люк
1

Mathematica, 2 байта

.0

Выход:

0.

Число, начинающееся с десятичной точки, например, .123интерпретируется как 0.123, поэтому .0интерпретируется как 0.0. Поскольку часть числа после десятичной точки равна нулю, Mathematica не печатает его.

Бен
источник
1
Я не думаю, что это действительно. Наше определение сайта требует, чтобы у quines были «кодер» и «декодер», это запрещает буквальный тип quines.
Пшеничный волшебник
Все правила для Quines переносятся на эту проблему.
Пшеничный волшебник
@WheatWizard: .кодирование само по себе, но я не думаю, что 0делает? Значение 0 после десятичной запятой не может рассматриваться как кодирование начального нуля перед десятичной запятой, последний является побочным эффектом печати числа с плавающей запятой. Так что по старым правилам Куайна здесь нет проблем. (Я не уверен, вступили ли новые правила в силу.)
@ ais523 Я не знаю. Возможно, это должно быть решено с помощью мета-вопроса.
Пшеничный волшебник
1

Python 3, 31 байт

a='a=%r;pritn(a%%a)';print(a%a)
Aaay Aaay
источник
1

Stax , 8 4 байта

.S.S

Запускать и отлаживать онлайн!

Прямой порт этого ответа .

Старая версия, 8 байт

..b..LbL

Запускать и отлаживать онлайн!

Альтернативная версия с довольно дешевым трюком, который может быть применен к нужным ссылкам практически на любом языке.

"43bL"34bL

Запускать и отлаживать онлайн!

Потому что "34bL"34bL что это правильный Quine в Stax.

Еще одна версия, использующая только строковые литералы с одним символом.

''c'Lc'cccLcLL

Запускать и отлаживать онлайн!

объяснение

.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 байтов

"34çJ∞"34çJ∞

Выходы:

34çJ∞""∞Jç43

Попробуйте онлайн!

"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
Райли
источник