Квин из заказов

10

Напишите программу, которая при запуске на разных языках выводит разные байтовые перестановки кода на каждом языке. Точный исходный код считается за одну перестановку.

Здесь «другой язык» может быть другой версии (Py 2 и Py 3) или разные стандартные флаги. Это другой вывод, который заставляет другую версию.

Правильные правила Quine применяются для программы на каждом языке. Ваша оценка рассчитывается как (Language count)^6/(Code length in bytes), с более высокой оценки лучше.

Образец:

Если ваш код работает AABи работает на трех разных языках, возвращается ABA, AABа AABзатем его оценка 2^6/3( AABучитывается только один из двух ). Это нормально, если ABAбессмысленно.

l4m2
источник
1
Что считается другим языком?
Лайкони
4
Какое определение правильного Quine применяется? ( Мартин , или ais523 , или, может быть, какое-то другое определение в этих мета-нитях?) Применяются ли правильные правила квин только к интерпретациям программы, которые на самом деле являются квинами? (Не смотря на то, что это стоит, я не думаю, что эта задача будет значительно улучшена путем применения надлежащих правил Куайна.)
Линн
Для пояснения, работая над вашим примером - если мой код AABпечатается AABна языке-1 и ABAна языке-2, я предполагаю, что это должен быть правильный quine, если рассматривать его как программу языка-1, и нет никаких дополнительных ограничений, связанных с ее интерпретацией как программа «язык-2». Это правильно?
Линн
1
Длина кода учитывается в символах или байтах? Что мы должны делать с разными кодировками символов?
Дилнан
1
А как насчет байтов и символов?
Дилнан

Ответы:

10

Befunge-98 , > <> , Голе> <> , Деление , Wumpus , Кардинал , пчелиный и Алиса Счет: 8 6 /88 = 2978,909

"65*4+059*$!#.39*0jp2+'Wk,@ ''5&.'\d&o@o&88#+\@ol?!,'.'0.6'!+Ox,++tttt=++%-$#}.6~.F4*`*R

Попробуйте это в Befunge! Попробуйте это в> <>! Попробуйте в Gol> <>! Попробуйте это в Fission! Попробуйте это в Wumpus! Попробуйте в Кардинал! Попробуйте это в пчелином воске! Попробуйте это в Алисе!

Проверка!

Много 2D-языков, все злоупотребляющие строковыми литералами. Разница в результатах, таким образом:

> <>, Gol> <> и Befunge-98 все распечатать код в обратном направлении (за исключением "), с последними тремя персонажами в разных позициях, R*", O"*и "R*соответственно. Пчелиный воск также имеет код в обратном направлении, но последние три символа чередуются в первой части вывода. Алиса в основном в обратном направлении, для всех уцелевших символов , за исключением ( ', \и ") перешел на фронт вместо этого.

Wumpus - единственная действительная квинна, Fission ставит "в конце кода вместо начала, а кардинал ставит "между 0и 5ближайшим началом.

Доказательство различных перестановок

Пояснения:

Befunge-98:

"  Wrapping string literal pushes all other characters + a space to the stack
 65*4+  Push " to the stack
      059*$!#.39*0j   Push 1,27 to the stack
                   p  Pops the top three values of the stack (27,1,34)
                    2+  Adds 2 to the space to make "
                      'Wk,@  Prints the top 88 characters of the stack and terminates

> <> и Гол> <>:

Честно говоря, я не много здесь сделал. Единственная разница между выполнением этих двух языков - это @команда, которая по-разному вращает три верхних значения стека для каждого языка.

"  Wrapping string literal pushes all other characters to the stack
 65*4+  Push 34 (") to the stack
      059*$!#.  Jump to cell 45,0
                                   \@  Rotate the top three values of the stack 
                                     ol?!,'.'0.  Output the whole stack, ending in a divide by 0/stack underflow error

Деление:

 "............R  Spawn a pointer going right

 "  Switch to printing mode and print every other character
 "  Switch off printing mode
  6  Teleport to other 6
 "........6'!+O   Print the "

Wumpus:

"  Bouncing string literal
 65*4+  Push a (")
      059*$!#.   Push 0 and jump to cell 0,45
                                        \  Reflect off mirror
                                       +   Add 0 to top of stack
                                 @o&88#    Print the top 88 characters of the stack

кардинал:

                                 %   Spawn two pointer going left/right (up/down despawn immediately)
                                  -$  Right pointer jumps to cell -1,0
                      x,++tttt=++     Left pointer prints "
"  While right pointer switches to print mode and prints the code

Пчелиный воск:

 "................*`*   Spawn pointers going in every direction
                        Every other * also spawns pointers, but they do nothing
                   `    Turn on print mode for two of the pointers going in different directions
                        This prints everything but the `
          #}.6~.F4*     Print a `

Алиса:

"  Wrapping string literal pushes all other characters to the stack
   Except 's and mirrors
 65*4+  Push " to the stack
      059*$!#.  Does nothing
              39*0j  Jumps to cell 39,0
                         ''5&.    Push ' and duplicate it 5 times
                              '\  Push \
                                d&o@  Print the whole stack
Джо Кинг
источник
6

Perl 5 , Руби , JavaScript (хром), PHP , Python , 2 , Python 3 , 1206 байт, оценка 6 6 /1206 = +38,6865671641791

q=1//2;s=+0;s|0;"/.__id__;#";_="""q=1//2;s=+0;s|0;"/.__id__;#";_={0}{1}{0};R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q={0}{2}{0};print(_.format(Q,_,q[0:-12]+R,"%"))""";R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q="""|;#<?ob_end_clean();
eval($_='"$t"?0?[$q=37 .chr+113 .chr+38 .chr,$p=(96 .chr+39 .chr)*4,$n=10 .chr,$s=39 .chr*12,$S=34 .chr*3]:eval("printf=console.log;c=String.fromCharCode;$q=c(96);$p=c(37,113,38,39).repeat(4);$n=c(10);$s=c(39).repeat(12);$S=c(34,34,34)"):[]?[$q=q(!g)^PA,$p=HARHARHARHAR^od2od2od2od2,$n=R^X,$s=bbbbbbbbbbbb^EEEEEEEEEEEE,$S=hhh^JJJ]:[$q=O^h,$p=str_repeat(RHa3^w9GS,4),$n=R^X,$s=str_repeat(b^E,12),$S=HHH^jjj];//#');printf($x='q=1//2;s=+0;s|0;"/.__id__;#";_=%7$sq=1//2;s=+0;s|0;"/.__id__;#";_={0}{1}{0};R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q={0}{2}{0};print(_.format(Q,_,q[0:-12]+R,"%8$s"))%7$s;R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q=%7$s|;#<?ob_end_clean();%5$seval($_=%3$s%1$s%3$s);printf($x=%3$s%2$s%3$s,$_,$x,$q,$p,$n,$s,$S,"%8$s",![]||([]+[])?$n:"");//#%4$s%6$s%7$s;print(_.format(Q,_,q[0:-12]+R,"%8$s"))%9$s',$_,$x,$q,$p,$n,$s,$S,"%",![]||([]+[])?$n:"");//#`q&%`q&%`q&%`q&%''''''''''''""";print(_.format(Q,_,q[0:-12]+R,"%"))

Проверьте Perl, Ruby, PHP, Python 2 и Python 3 онлайн!

Примечание . Запуск вышеуказанной программы в консоли Inspector в Chrome (которая поддерживает позиционные аргументы для console.log) возвращает правильную программу.

объяснение

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

Это в значительной степени стандартный формат Куайн , где расчет процитировать использование немного отличается для каждого языка: в Ruby , %q&используется, PHP использует ', JavaScript (Node.js) использует `и Perl 5 использует q(... ). Поскольку изменяются только кавычки, остальная часть программы по-прежнему исполняема и имеет правильный синтаксис на каждом языке. Python 2 и 3 обернуты вокруг предыдущей программы, использующей """для Python 2 и '''для Python 3.

Результирующие программы на Perl и Ruby не являются стандартными quines, дополнительные q/ %qs добавляются к каждой итерации, но первая программа возвращается правильно.

Результаты:

  • Perl 5:
    eval($_=q&... q&);printf($x=q&... q&,... );//#'%`'%`'%`'%`''''''''''''"""...
  • Руби:
    eval($_=%q&... %q&);printf($x=%q&... %q&,... );//#`'`'`'`'''''''''''''"""...
  • JavaScript (Chrome):
    eval($_=`... `);printf($x=`... `,... );//#%q&'%q&'%q&'%q&'''''''''''''"""...
  • PHP:
    eval($_='... ');printf($x='... ',... );//#`q&%`q&%`q&%`q&%''''''''''''"""...
  • Python 2:
    ... _="""... """;... q="""...''''''''''''""";print(_.format(Q,_,q[0:-12]+R,"%"))
  • Python 3:
    ... _='''... ''';... q='''...""""""""""""''';print(_.format(Q,_,q[0:-12]+R,"%"))

Я много работал над этим, надеюсь, я ничего не пропустил здесь. У меня все еще есть способ пойти куда-нибудь ближе к счету Джо Кинга ...

Дом Гастингс
источник
2

Желе , и М , 2 6 /14 = 4,57

1Ɗṙ@“1Ɗṙ@ȮṾ”ȮṾ

Попробуйте это в желе!

Попробуйте это в М!

Ɗṙ@ȮṾ1“Ɗṙ@ȮṾ1” в желе

1Ɗṙ@ȮṾ“1Ɗṙ@ȮṾ” в М

dylnan
источник
Я не уверен, что древесный уголь считается настоящей
квайной
@ H.PWiz Я собирался добавить комментарий об этом. Я попрошу ОП
Дилнан
@ l4m2, ты считаешь, что программа "Древесный уголь" - это подходящее место? Я удалю, если нет.
Дилнан
Я думаю, это как Quineв PHP?
l4m2
2

Python 2 и Python 3 , 2 6 /61 = 1,05

s='s=%r;print(s%%s[::(1/2>0)*2-1])';print(s%s[::(1/2>0)*2-1])

Попробуйте это в Python 2!

Попробуйте это в Python 3!

Сохранено 12 байтов благодаря Джо Кингу.

Python 2 гравюры

s=')]1-2*)0>2/1(::[s%%s(tnirp;r%=s';print(s%s[::(1/2>0)*2-1])

Python 3 отпечатка

s='s=%r;print(s%%s[::(1/2>0)*2-1])';print(s%s[::(1/2>0)*2-1])

При этом используется тот факт , что 1/2это .5в Python 3 и 0в Python 2.

dylnan
источник
1

Bash / GolfScript, 72 байта, 2 балла 6 /72 = 8/9 (~ 0,888 ...)

.~0 () 
{ 
    declare "-f" @* ".~0" " ()
 "+@n.;
    echo '.~0;'
}
.~0;

Содержит один завершающий пробел в первых двух строках.

Попробуйте онлайн в Bash.
Попробуйте онлайн в GolfScript.

Простая модификация ответа @ jimmy23013 для задания « Напиши полихиню » . Модификация, которая была сделана, удаляла завершающий пробел после третьей строки и изменялась \n"+@n.;на \n "+@n;.

Bash напечатает строки 1 и 2 следующим образом:

.~0 ()    <- Trailing space
{         <- Trailing space

И GolfScript напечатает строки 1 и 2 следующим образом:

.~0 ()   <- No trailing space
 {       <- Both leading and trailing space

Здесь базовая программа, вывод Bash и вывод GolfScript соответственно с заменой новых строк на \n:

.~0 () \n{ \n    declare "-f" @* ".~0" " ()\n "+@n.;\n    echo '.~0;'\n}\n.~0;
.~0 () \n{ \n    declare "-f" @* ".~0" " ()\n "+@n.;\n    echo '.~0;'\n}\n.~0;
.~0 ()\n { \n    declare "-f" @* ".~0" " ()\n "+@n.;\n    echo '.~0;'\n}\n.~0;

      ^^^ Note the difference here
Кевин Круйссен
источник