Interquine - две программы, которые выводят друг друга в цикле


29

Программа A выводит код программы B при запуске, а B выводит источник A.

Требования:

  • Только один язык в обеих программах
  • Программы разные. Одна программа, которая выводит сама себя, не подходит.
  • Обе программы не пусты или имеют длину не менее 1 байта. Конечные переводы строк как в источнике, так и в выводе игнорируются
  • стандартный ввод закрыт Не читайте ничего (поэтому вы не можете прочитать источник и манипулировать им). Вывод идет в стандартный вывод.
    Изменить: стандартный подключен к /dev/null. Вы можете заказать его, если будет уточнено.
  • Не используйте randomфункции.

Дополнительно:

  • Дайте объяснения, если это возможно

Оценка - это общая длина . Трейлинг новой строки не считается, если он не влияет на программу.



5
«Не используйте случайные функции.»? Что вы имеете в виду? Функции, которые выводят случайное число?
г-н Xcoder


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

Ответы:


18

CJam , 13 + 13 = 26 байт

{sYZe\"_~"}_~

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

Выходы

{sZYe\"_~"}_~

объяснение

{       e# Standard quine framework, leaves a copy of the block on the stack
        e# for the block itself to process.
  s     e# Stringify the block.
  YZe\  e# Swap the characters at indices 2 and 3, which are Y and Z themselves.
  "_~"  e# Push the "_~" to complete the quine.
}_~

Поскольку e\во втором и третьем операндах коммутативно, другая программа делает то же самое, обмениваясь Zи Yвозвращаясь в исходный порядок.


17

CJam ,11 + 13 = 24 11 + 12 = 23 байта

"N^_p"
N^_p

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

Выходы:

"N^_p
"
N^_p

Вывод имеет 13 байтов, но:

Трейлинг новой строки не считается, если он не влияет на программу.

Поэтому я изменил пробел на новую строку, чтобы воспользоваться этим.

Это основано на самом коротком CJam собственно квине:

"_p"
_p

И это N^- xor строки с новой строкой, которая добавляет новую строку, если новой строки нет, и удаляет ее, если есть, для строки, каждый символ которой уникален.

Я думаю, что видел эту квинну в вопросе о квине, но не смог ее найти.


+1 за две программы разных размеров, в отличие от всех остальных ответов. Изменить: как только я смогу голосовать снова .. достигло предела последнего голосования>.>
Кевин Круйссен

Хорошо для разной длины.
iBug

«Я думаю, что видел эту квинну в вопросе о квине, но я не смог ее найти». Это упоминается только в ответе GolfScript.
Мартин Эндер

12

RProgN 2 , 3 + 3 = 6 байт

Первая программа:

0
1

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

Вторая программа:

1
0

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

-2 спасибо Мартину Эндеру .


7
Вы можете сохранить два байта, переключая языки: tio.run/##Kyooyk/P0zX6/9@Ay/D/fwA
Мартин Эндер,

@MartinEnder Ооо, я забыл, что RProgN 2 демонстрирует такое поведение ... кстати, я не знаю, если он все еще глючит.
Эрик Outgolfer

11
Я ничего не знаю о RProgN за исключением того, что такое поведение существует.
Мартин Эндер

@MartinEnder Автор RProgN здесь, просто спросите, если вам нужно что-то прояснить!
ATaco

@ATaco Ну, я бы попросил вас уточнить отрицательный голос, но я не думаю, что вы можете ...
Эрик Outgolfer

6

С 95 + 95 = 190 байт

Спасибо @immibis за сохранение 16 * 2 байтов!

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

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

Выходы:

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=0^1;printf(s,34,s,34,i);}

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

Какие выводы:

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

1
Почему бы просто не называть это C всегда и полагаться на то, что я изменяюсь, чтобы сделать программу другой? C меньше, чем% c
user253751

@immibis Да, вы правы, этого вполне достаточно.
Steadybox

5

Javascript, 67 + 67 = 134 байта

1-я программа:

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=0))

2-я программа:

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=1))

Это основано на ответе Германа Лауэнштейна на Tri-interquine

Javascript (Invalid-reads source code), 75 + 75 = 150 61 + 61 = 122 58 + 58 = 116 50 + 50 = 100 байт

сэкономил 20 байтов благодаря Tushar, 6 байтов благодаря Craig Ayre и сэкономил 16 байтов благодаря kamoroso94

1-я программа:

f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f()

2-я программа:

f=_=>alert(("f="+f).replace(1,a=>+!+a)+";f()");f()

Меняет местами 1 с 0 и наоборот. Они оба делают одно и то же, просто производя различный вывод из-за их исходного кода.


1
Давайте сохраним несколько байтов. f.toString()=> (''+f), (0|1)=> 0|1, (a,b)=> В aрезультатеf=()=>("f="+(''+f).replace(/0|1/g,a=>a==0?1:0)+";f()");f()
Tushar

Вы можете использовать неиспользуемый параметр, чтобы сохранить пару байтов f=_=>и удалить символы скобок из обратного вызова замены, как @Tushar предложил:a=>+!+a
Крейг Эйр,

Заменить "f="+(f+"")с ("f="+f)для -3 байт.
kamoroso94

Заменить /0|1/gи /1|0/gс , 0и , 1соответственно , для -5 байт.
kamoroso94

Вы управляли этим? Это работает так f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f().
kamoroso94

4

Python 2, 63 + 63 = 126 байт

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

Первая программа:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]

выходы:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

Вторая программа:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

Выходы:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]


3

Mathematica, 43 + 44 = 87 байт

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -1 1]

а также

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -(-1)]

Протестировал его на моем компьютере и вывод второго только -1в конце нет -1 1.
Числовой маньяк

@numbermaniac Я написал эти коды в текстовом интерфейсе. Кажется, они не работают в ноутбуках.
алефальфа

3

asmutils sh, 16 + 16 байт, злоупотребляя правилом "stdin is closed".

#!/bin/sh
tr x y

Поскольку stdin закрыт, и sh откроет свой скрипт для первого доступного дескриптора (вместо того, чтобы перемещать его в дескриптор с высоким номером, как это делают современные оболочки), tr заканчивает чтение из копии скрипта, даже не открыв его.

Этот запрос может быть полезен, но вставить его сложно.

Кроме того, в этой оригинальной версии используется некая безумная ошибка в древнем ядре, которое я использовал в те дни. (Я не знаю, что случилось с этим ядром - позже я узнал, что у него также есть разные старшие и младшие номера для устройств.) Если вы исправите изменения ABI, которые сломались, так как interquine все равно не будет работать. Я забываю, имеет ли asmutils sh exec или нет, но если это так, то это современная версия:

exec dd skip=0 | tr x y

Это злоупотребляет преднамеренной ошибкой в ​​asmutils dd; у него есть оптимизация производительности, которую он вызывает llseek для пропуска, если может, но чтобы сохранить байт, он передает SEEK_SET, а не SEEK_CUR. Это приводит к сборке мусора на stderr, но перехват на stdout. Asmutils dd не имеет возможности подавить спам stderr.


Будет ли это работать, если /dev/nullвместо этого подключен стандартный ввод ? В любом случае, хорошая работа!
iBug

@iBug: нет. Зависит полностью от stdin closed и того факта, что asmutils sh не связан с libc и поэтому не наследует код авторемонта в libc.
Джошуа

Вам нужен #!/bin/sh?
КалькуляторFeline

@CalculatorFeline: это зависит от точности вашего определения чего-то еще.
Джошуа

Обычно шебанги не учитываются, поэтому это будет 6 байт.
CalculatorFeline


1

Common Lisp, 58 символов

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

... или 24 символа, если вы не возражаете, предполагая, *print-circle*что глобально установлено T:

#1=(print '(write '#1#))

Печатное представление кода читается как циклическая структура, где #1#указатель на обратную ячейку минует следующую #1=. Мы цитируем программы так, чтобы они не выполнялись. Поскольку *print-circle*это T, REPL заботится о том, чтобы выдавать такие переменные считывателя во время печати; это то, что печатает и возвращает приведенный выше код:

#1=(write '(print '#1#)) 

Когда мы оцениваем приведенный выше код, он печатает:

#1=(print '(write '#1#))

Если вы хотите придерживаться значения по умолчанию для *print-circle*- NIL в соответствующей реализации, то вам придется временно перепривязать переменную:

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

Внутри тела LET мы печатаем вещи *print-circle*как T. Таким образом, мы получаем:

#1=(write
    '(let ((*print-circle* t))
       (print '#1#))
    :circle t) 

Как видите, новая программа не перепривязывается *print-circle*, но, поскольку мы используем writeфункцию низкоуровневого вызова print, мы можем передавать дополнительные аргументы, такие как :circle. Затем код работает как положено:

#1=(let ((*print-circle* t))
     (print '(write '#1# :circle t)))

Тем не менее, вы должны выполнить вышеупомянутые программы в качестве сценария, а не внутри РЕПЛ, потому что даже если вы печатаете вещи, заботясь о кольцевых структур, так writeи printтакже возвращает значение , которое печатается; и в REPL по умолчанию значение также печатается, но вне динамического контекста, где *print-circle*T.


1

> <> , 16 + 16 = 32 байта

":1-}80.r   !#o#

а также

#o#!   r.08}-1:"

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

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

Этот код закончится ошибкой.


1

RProgN 2 , 7 + 7 = 14 байт

Я хотел показать лучшее использование RProgN, а не просто злоупотреблять заказами на печать ...

1
«\1\-

а также...

0
«\1\-

Разъяснения

1   # Push the constant, 1. (Or 0, depending on the program)

«\1\-
«       # Define a function from this to the matching », in this case there isn't any, so define it from this to the end of the program, then continue processing.
 \      # Flip the defined function under the constant.
  1\-   # Get 1 - Constant.

Поскольку это печатает стопку вверх дном, сначала печатается новая константа, а затем печатается строковая версия функции.

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


1

LOGO , 65 + 66 = 131 байт

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] 1]

а также

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] -1]

1

Python 3, 74 + 74 = 148 байт

a='a=%r;b=%r;print(b%%(b,a))';b='b=%r;a=%r;print(a%%(a,b))';print(b%(b,a))

а также

b='b=%r;a=%r;print(a%%(a,b))';a='a=%r;b=%r;print(b%%(b,a))';print(a%(a,b))

я тоже не понимаю


1

> <> , 12 + 12 = 24 байта

'3d*!|o|!-c:

а также

':c-!|o|!*d3

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

Обе программы используют строковый литерал для добавления кода в стек, а затем создают 'команду различными методами. При печати стопки он сдвигает код назад, но 'остается впереди. Есть несколько вариантов, которые производят '; 3d*, d3*, 00g, :c-Когда в паре с 3d*и :9-когда в паре с 00g.

Слишком похожее решение для публикации в Befunge-98 за 13 * 2 байта

"2+ck, @,kc+2


0

Javascript (ES6), 36 + 36 = 72 байта

Программа 1:

f=n=>('f='+f).replace(/4|5/g,n=>n^1)

Программа 2:

f=n=>('f='+f).replace(/5|4/g,n=>n^1)

Эти программы работают клонирование себя и заменить 5с 4и 4с5

console.log((
    f=n=>('f='+f).replace(/4|5/g,n=>n^1)
)())
console.log((
    f=n=>('f='+f).replace(/5|4/g,n=>n^1)
)())


2
Так как это помечено как quine , это то, что обычно считают «обманным quine», так как он читает свой собственный источник. Не уверен, что решение ОП по этому вопросу, но они обычно не допускаются.
Стивен

0

Кляйн , 26 24 байта

<:3+@+3<:"

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

объяснение

Это работает так же, как мой Klein Quine , где он печатает источник задом наперед, а затем a ", последний из которых сходит с рук, будучи палиндромным, поэтому все, что нам нужно сделать, это сделать его непалиндромным, не нарушая его функциональность. Путем переключения <и :мы смогли сделать это, не мешая функционалу.


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