Quine с двумя прорезями


11

Задача:

Кодируйте две программы, где каждая из программ выводит оба исходных кода, чередующихся на символ, например, застежка-молния, двойная щель Quine. Вывод двойного разреза Куайна начинается с первого символа из исходного кода первой программы. Если исходный код одной из программ короче по длине, чем другая, то остальная часть вывода должна быть заполнена оставшейся частью более длинного исходного кода.

Правила:

  1. Вы можете использовать любой язык программирования для обеих программ, необязательно один и тот же язык программирования для обеих.
  2. Ваши программы не должны принимать какие-либо данные из файла, имени файла, сети, другой программы или чего-либо еще.

Обязательные критерии:

  • Есть загвоздка, где-то в выводе слово QUINEзаглавными буквами должно существовать непрерывно.
  • Вам необходимо указать, какие два языка программирования вы используете. Если вы используете один и тот же язык программирования для обоих, вам нужно указать только один язык программирования.
  • Обе программы должны быть в состоянии исполняться или интерпретироваться независимо от другой программы.

Пример:

Имея этот пример исходного кода программы один :

"QIE"

Имея этот пример исходного кода программы два :

"UN"

Тогда действительный вывод Quine с двумя щелями из обеих программ должен быть:

""QUINE""

Это код-гольф, выигрывает наименьшее количество байтов при суммировании длины обоих исходных кодов и, очевидно, также длины каждой выходной программы!


Каждая отдельная программа также не должна быть квинной, верно? И должна ли каждая программа содержать хотя бы один символ?
mbomb007

@ mbomb007 Это правильно. Каждая отдельная программа должна выводить оба символа исходного кода, например, молнию от начала до конца. Ну, я думаю, вам понадобится как минимум 1 байт на языке программирования для вывода QUINE? Вывод из обеих программ должен быть одинаковым.
Пларсен

Я не уверен, что понимаю, что остальная часть вывода должна быть правильно заполнена остальным длинным исходным кодом . Как бы Aи XYZчередоваться? AXYZ?
Деннис

@Dennis Просто нравится .+или zработает
Оптимизатор

@ Денис Верный. То, что осталось от более длинного исходного кода, когда у более коротких байтов заканчиваются байты, должно быть добавлено к выводу обеих программ.
Пларсен

Ответы:


9

CJam, 49 47 байтов

{`:_"__~~e#QUINE"}_~

а также

{`:_"__~~e#QUINE"}_~e#QUINE

обе печати

{{``""__~~""++::__""ee##QQUUIINNEE""}}__~~e#QUINE

Попробуйте онлайн: программа 1 , программа 2 , подтверждение действительности

Как они работают

{                }   e# Push a code block.
                  _~ e# Execute a copy.
 `                   e# Convert the code block into a string.
  :_                 e# Duplicate each character of the resulting string.
    "__~~e#QUINE"    e# Push this string.

Программа 1 заканчивается здесь и имеет строковое представление всего своего исходного кода (который каждый символ повторяется дважды), а также строку e # QUINE в стеке.

Программа 2 дополнительно разбирает e#QUINE, что является комментарием.

В обоих случаях CJam автоматически печатает две строки, что приводит к вышеупомянутому выводу.


4

Серьезно, 46 56 42 байта

QUNX;RZtdXεj.ƒ£REIQ

Шестнадцатеричный дамп:

51554e583b525a746458ee6a2e7f9f9c524549510a

Вторая программа - это точная программа в обратном порядке. Он содержит невидимый символ, но количество байтов правильное. Обе программы выводят эту палиндромную строку:


QQUINEXR;£RƒZ⌂t.djXεεXjd.t⌂ZƒR£;RXENIUQQ

(По какой-то причине он отображает невидимый символ, когда выводит его в моем терминале. Я не совсем понимаю этот 7F байт.)

Как это работает:

Q                     Push the source to the stack
 U                    Nop
  NX                  Push and pop lyrics to 99 bottles of beer
    ;R                Make a copy of the source reversed.
      Z               Zip them together.
       t              Completely flatten the list.
        dX            Delete the trailing newline
          εj          Join it into a string.
            .         Print it with a trailing newline.
             ⌂        (This is that 7F byte that won't show up. It halts.)

Остальная часть программы не выполняется.

Тогда другое направление:

\n                   Nop
  Q                  Push the source code.
   IE                Nops
     R               Reverse source code to get source of first program
      £              Eval it into a function
       ƒ             Call it.

На данный момент мы запускаем первую программу, указанную выше, поэтому выполнение продолжается, как описано там.

Я активно использую тот факт, что несколько команд здесь ничего не делают со строками или пустыми стеками. Я также использую неожиданное поведение, tкогда в стеке только один элемент. Не ожидайте, что эта программа будет работать в будущих версиях Seriously.

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


@ Денис, ты проверял это на своем компьютере? Это может быть артефактом моей собственной среды сборки.
Quintopia

@ Денис НВМ, ты прав. Все методы вывода Seriously добавляют перевод строки. Я могу это исправить по стоимости 8 байт. Похоже, ваш метод будет короче (что печально, потому что этот метод круче IMO).
Quintopia

1

GolfScript, 46 байт

{`{.}%"..~~QUINE"}.~

а также

{`{.}%"..~~QUINE"}.~QUINE

обе печати

{{``{{..}}%%""....~~~~QQUUIINNEE""}}..~~QUINE

Попробуйте онлайн: программа 1 , программа 2 , подтверждение действительности

Как это работает

{`{.}%"..~~QUINE"}.~

{                }    # Push a code block.
                  .~  # Execute a copy.
 `                    # Convert the code block into a string.
  {.}%                # Duplicate each character of the resulting string.
      "..~~QUINE"     # Push that string.

Исходный код программы 2 дополнительно анализирует QUINE\n, что является двумя неопределенными токенами.


1

Perl 61 + 60 = 121 байт

Программа 1:

$x=q<print"\$x=q<$x>;eval\$x#"=~s/./$&$&/gr,QUINE>;eval$x#QIE

Программа 2:

$x=q<print"\$x=q<$x>;eval\$x#"=~s/./$&$&/gr,QUINE>;eval$x#UN

Я думал, что я бы попробовал это на неигровом языке. По сути, это всего лишь универсальный конструктор quine в Perl, модифицированный для удвоения каждого символа перед его печатью и добавления QUINEв конец. Тогда нам просто нужно вставить комментарий в конец кода, чтобы компенсировать добавленный текст.

(Я написал это, не обращая особого внимания на другие ответы. Оказалось, что можно было бы сохранить байт, поместив весь комментарий в одну программу, но я не уверен, стоит ли мне просто копировать подобные алгоритмы.)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.