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


10

Связанный: Interquine

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

На этот раз вы не можете обменять два символа и обменять снова :)

Требования:

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

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

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

Оценка - это длина самой короткой (можете ли вы создать длинную программу из короткой?). Пожалуйста, напишите длину всех программ и выделите наименьшее число. Трейлинг новой строки не считается. Самый низкий балл побеждает .


2
Связанные с. (То же самое, на разных языках.)
Мартин Эндер

Ответы:


19

Python 3 , 50 байт

s='s=%r;print(s%%(s,%i*2%%7))';print(s%(s,1*2%7))

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

Последнее выражение идет от 1*2%7к 2*2%7до, 4*2%7затем к 1*2%7.


6
Выглядит как универсальное решение n-interquine. Вам нужно только заменить 7 на (2 ^ n) -1.
iBug

4
В Python 2 отображение 1-2/_формирует 3-тактный цикл (1,-1,3), который сохраняет байт, не требуя экранирования %.
xnor

@iBug или даже короче для большого n, s='s=%r;print(s%%(s,-~%i%%3))';print(s%(s,-~1%3))заменив 3наn
PurkkaKoodari

4

RProgN 2 , 12 8 байт

1
«\2*7%

Разъяснения

1   # Push the digit to the stack.

«\2*7%
«       # Define a function from here to the matching ». As there is no matching », define it from here to the end of the program, and continue running.
 \      # Flip the function under the constant number.
  2*    # Multiply by 2.
    7%  # Modulo 7.

Из-за удобной природы того, как RProgN выводит данные по умолчанию, это оставляет число, которое повторяется между 1, 2 и 4, в первой строке и строковую версию функции во второй. Вдохновленный @LeakyNun «s Python Ответ

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


4

CJam , 17 байт

{sZZe\6Ye\"_~"}_~

{s6Ze\ZYe\"_~"}_~

{sZ6e\ZYe\"_~"}_~

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

Вероятно, не оптимально, но это модификация моего подхода к предыдущему вызову .

Основная идея та же, но мы выполняем два обмена, один из которых всегда запрещен. Затронутые индексы 2, 3и 6:

1:     {sZZe\6Ye\"_~"}_~
ZZe\             does nothing
       {sZZe\6Ye\"_~"}_~
6Ye\     \   /
          \ /
           X
          / \
         /   \
2:     {s6Ze\ZYe\"_~"}_~
6Ze\      \  /
           \/    doesn't really do anything
           /\
          /  \
       {s6Ze\ZYe\"_~"}_~
ZYe\     \/
         /\
3:     {sZ6e\ZYe\"_~"}_~
Z6e\      \  /
           \/
           /\
          /  \
       {sZZe\6Ye\"_~"}_~
ZYe\     \/      doesn't really do anything 
         /\
1:     {sZZe\6Ye\"_~"}_~

3

CJam , 14 байтов

{_]3/W="_~"}_~

{_]3/W="_~"}{_]3/W="_~"}_~

{_]3/W="_~"}{_]3/W="_~"}{_]3/W="_~"}_~

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

Другие программы имеют длину 26 и 38 байт соответственно.

объяснение

Еще один подход!

{       e# Again, the usual quine framework. In this case, there might
        e# be one or two additional copies of the block on the stack.
  _     e#   Duplicate the top copy of the block.
  ]     e#   Wrap all copies in an array.
  3/    e#   Split into chunks of 3. For the first two programs, this will
        e#   just wrap all of them in an array. For the third program, this
        e#   splits the fourth copy off from the first three.
  W=    e#   Select the last chunk. So `3/W=` does nothing for the first
        e#   two programs, but discards three copies once we get to four.
  "_~"  e#   Push the remainder of the program.
}_~


2

Python 3, 127, 127 и 127 байтов

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

печать

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

печать

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

Это основано на моем ответе на вопрос Interquine, который основан на обычной Python quine. И я точно знаю, что делать, когда мы получим четырехъядерный вопрос;)


1

CJam , 14 байтов

0{\)3%\"_~"}_~

1{\)3%\"_~"}_~

2{\)3%\"_~"}_~

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

объяснение

0{      e# Again, the standard CJam quine framework, but this time we have a zero
        e# at the bottom of the stack.
  \     e#   Bring the 0 to the top.
  )     e#   Increment.
  3%    e#   Mod 3 to loop from 2 back to 0.
  \     e#   Put the result underneath the block again.
  "_~"  e#   Push the remainder of the source.
}_~

1

Javascript (ES6), 63 55 байт

eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=0)
eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=1)
eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=2)

o1.innerText = eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=0) 
o2.innerText = eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=1)
o3.innerText = eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=2)
<pre id="o1"></pre>
<pre id="o2"></pre>
<pre id="o3"></pre>

Использование альтернативного решения Function.prototype.toString(чит, 30 байт)

(f=n=>`(f=${f})(${++n%3})`)(1)

1

Лямбда-исчисление , 38 символов, 44 байта

Простое решение, основанное на матери всех сущностей: y-комбинатор :

(λx.(λy.y)(λz.z)xx)(λx.(λy.y)(λz.z)xx)

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

(λx.(λy.y)(λz.z)xx)(λx.(λy.y)(λz.z)xx)
(λy.y)(λz.z)(λx.(λy.y)(λz.z)xx)(λx.(λy.y)(λz.z)xx)
(λz.z)(λx.(λy.y)(λz.z)xx)(λx.(λy.y)(λz.z)xx)
(λx.(λy.y)(λz.z)xx)(λx.(λy.y)(λz.z)xx)
etc.

0

Java 8, 118 байт

v->{int i=0;String s="v->{int i=%d;String s=%c%s%2$c;return s.format(s,++i%%3,34,s);}";return s.format(s,++i%3,34,s);}

Только int i=0;разница между функциями / выходами (это либо 0, 1либо 2).

Объяснение:

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

v->{                       // Method with empty unused parameter and String return-type
  int i=0;                 //  Integer, starting at 0, 1 or 2 depending on the version
                           //  (this is the only variation between the functions/outputs)
  String s="v->{int i=%d;String s=%c%s%2$c;return s.format(s,++i%%3,34,s);}";
                           //  String containing the unformatted source code
  return s.format(s,++i%3,s);}
                           //  Quine to get the source code, which we return as result
                           //  ++i%3 is used to cycle 0→1→2→0

Дополнительное объяснение:

-part:

  • String s содержит неформатированный исходный код
  • %s используется, чтобы поместить эту строку в себя с s.format(...)
  • %c, %2$cИ 34используются для форматирования двойных кавычек ( ")
  • %% используется для форматирования по модулю (% )
  • s.format(s,...,34,s) складывает все вместе

Разница выходов / функций:

Тот же подход, что и у большинства других ответов:

  • int iначинается либо 0, 1либо2
  • ++i%3преобразует это к следующему ( 0→1; 1→2; 2→0)

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