Кодегольф: Куайн и Антиквин


13

Эта задача похожа на « Можете ли вы Мета Куайн»?

Quine - это программа, которая производит себя на STDOUT. Эта задача состоит в том, чтобы создать программу A, которая при запуске выдает программу B в STDOUT. Программа B при запуске создает программу A на STDOUT. Программы A и B должны быть написаны на одном языке (и работать на нем). Связанный вопрос ограничил A! = B. Это выглядело слишком просто. Поэтому для этого вопроса мы настаиваем на том, что A и B являются антиквариатами, используя следующие правила:

  1. Программы A и B не могут использовать одни и те же символы, за исключением разделителей пробелов и операторов, а также знаков пунктуации.
  2. Каждая из программ A и B должна содержать хотя бы один символ, который не является ни пробелом, ни разделителем операторов, ни символом пунктуации.
  3. Для целей правил 1 и 2 термин «пробел» исключает любой символ или последовательность символов, которые сами по себе являются оператором, оператором или символом, который интерпретируется (в отличие от разделителя). Поэтому в языке пробелов нет пробелов.
  4. Разделитель операторов - это синтаксический элемент, традиционно используемый в языке для разделения операторов. Это будет включать новую строку в Python или точку с запятой в Java, Perl или C.
  5. Знак пунктуации - это символ ASCII, который не является ни пробелом, ни классом символов слова POSIX (т. Е. Символ подчеркивания не является пунктуацией для этой цели), т. ispunct()Е. Возвращает true, а это не так _.
  6. Программа A при запуске должна создавать программу (Программу B) на своем STDOUT, которая при запуске по очереди создает Программу A.
  7. Программы A и B должны быть на одном языке программирования.
  8. Используемый язык программирования должен быть языком программирования. Если вы не приведете веские аргументы в противном случае, я полагаю, что должно быть завершено по Тьюрингу
  9. По крайней мере, один из A и B должен выполнить хотя бы один оператор на языке.

Это код гольф, поэтому выигрывает самый короткий ответ, при этом длина программы равна A в байтах (т. Е. Длина программы B не имеет значения).


Не могли бы вы добавить пунктуацию в список исключений в первом предложении? В противном случае невозможно решить эту задачу на многих языках (особенно на тех, которые требуют от вас фигурных скобок в основной функции).
FUZxxl

связаны, но, вероятно, достаточно разные.
Мартин Эндер

@FUZxxl Я разрешил знаки препинания, но исключил подчеркивание.
abligh

1
Для целей здесь, Aи aсчитаются ли разные "персонажи"?
HostileFork говорит, что не доверяйте SE

1
Было бы лучше, если бы вы предоставили полный список символов ASCII, соответствующих правилу 5.
aditsu quit, потому что SE - ЗЛО

Ответы:


5

GolfScript, 13 байт

1{\~\".~"}.~

Выход

-2{\~\".~"}.~

который генерирует начальную программу.

Количество байтов включает в себя конечный LF, так как выходной результат будет содержать его.

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

Как это устроено

1       # Push 1.
{       # Start code block.
  \~\   # Apply logical NOT to the second topmost element of the stack.
  ".~"  # Push that string.
}       # End code block.
.~      # Duplicate the code block and execute the copy.

GolfScript печатает содержимое стека после завершения.


Пожалуйста, прочитайте формулировку проблемы еще раз -Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg

1
Все, кроме 1и 2есть пунктуация.
Деннис

ОК, правила были изменены с тех пор, как я последний раз их читал.
Исаак

Да, это работает. Я сформулировал правила для предотвращения использования пробелов в качестве операторов, но забыл, что для пунктуации будет присутствовать та же самая лазейка. Так что лазейка легально эксплуатируется.
abligh

14

Паскаль (731 символов)

Программа А:

program s;{$h+}uses sysutils;const p='program s;{$h+}uses sysutils;const p=';a='a';aa=''';';aaa='a=''';aaaa='''';aaaaa='begin write(lowercase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),''lower''+''c'',''tm''+''p'',[]),''up''+''c'',''lower''+''c'',[]),''tm''+''p'',''up''+''c'',[])+aa+aaaaa))end.';begin write(upcase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),'lower'+'c','tm'+'p',[]),'up'+'c','lower'+'c',[]),'tm'+'p','up'+'c',[])+aa+aaaaa))end.

Выходы программы B:

PROGRAM S;{$H+}USES SYSUTILS;CONST P='PROGRAM S;{$H+}USES SYSUTILS;CONST P=';A='A';AA=''';';AAA='A=''';AAAA='''';AAAAA='BEGIN WRITE(UPCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),''LOWER''+''C'',''TM''+''P'',[]),''UP''+''C'',''LOWER''+''C'',[]),''TM''+''P'',''UP''+''C'',[])+AA+AAAAA))END.';BEGIN WRITE(LOWERCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),'LOWER'+'C','TM'+'P',[]),'UP'+'C','LOWER'+'C',[]),'TM'+'P','UP'+'C',[])+AA+AAAAA))END.

Выводит программу А.


3
Я наслаждаюсь (неправильным) использованием тематического перевода.
abligh

11

ROT13 ( больше не конкурирует после обновления правил )

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

A

Циклы между Aи N:

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A

Я думаю, что это не работает, так как rot13 просто вводит данные STDIN, а не выполняет программу. Если вы утверждаете, что это программа нулевой длины, то она не удовлетворяет правилу 2. Программа (с sed) - это то, что передается sed -e. Если бы это было приемлемо, тогда catбыл бы квин, и tacбыл бы квин и антихин. Тем не менее, ничто не производит источник cat, tacили в этом отношении rot13.
abligh

@abligh Если язык rot13 используется, зачем мне печатать исходный код rot13? Кроме того, если я запускаю Golfscript, Python или что-то еще, я, скорее всего, просто передам ему исходный код через stdin или файл, так что на самом деле нет никакой разницы. В этом случае rot13 является переводчиком.
Инго Бюрк

rot13поскольку язык программирования не удовлетворяет какому-либо разумному определению «языка программирования», и он ничего не интерпретирует. Я исправлю вопрос, чтобы прояснить это.
abligh

Я согласен. Я оставлю этот ответ как не конкурирующий больше и начну мета-обсуждение. Кстати, хороший вызов. Не могу дождаться, чтобы увидеть «реальные» решения!
Инго Бюрк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.