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


13

Цей виклик схожий на Can You Meta Quine?

Quine - це програма, яка виробляє себе в STDOUT. Ця задача полягає у створенні програми A, яка під час запуску створює програму B на STDOUT. Програма B під час запуску створює програму A на STDOUT. Програми A і B повинні бути написані (та запущені) тією ж мовою. Пов'язане питання обмежене A! = B. Це виглядало занадто просто. Отже, для цього питання ми наполягаємо, що А і В - це антикварини, використовуючи такі правила:

  1. Програми A і B можуть не використовувати жодних одних і тих же символів, за винятком пробілів і роздільників висловлювань, а також розділових знаків.
  2. Програми A і B повинні містити принаймні один символ, який не є ні пробілом, ні роздільником висловлювань, ні пунктуаційним символом.
  3. Для цілей правил 1 і 2 термін "пробіл" виключає будь-який символ або послідовність символів, які самі по собі є інтерпретованим твердженням, оператором або символом (на відміну від роздільника). Тому в мові Whitespace немає пробілів.
  4. Розділювач висловлювань - це синтаксичний елемент, який умовно використовується в мові для розділення висловлювань. Це включає новий рядок у python або крапку з комою на Java, perl або C.
  5. Знак пунктуації - символ ASCII, який не є ні пробілом, ні класом символів POSIX (тобто, підкреслення не є пунктуаційним для цієї мети) - тобто ispunct()повернеться істинно, і це не так _.
  6. Програма A під час запуску повинна виробляти програму (Програма B) на своєму STDOUT, яка при запуску по черзі виробляє програму A.
  7. Програми A і B повинні бути однаковою мовою програмування.
  8. Використовувана мова програмування фактично повинна бути мовою програмування. Якщо ви не зробите гарний випадок інакше, я вважаю, що він повинен бути Тьюрінгом завершеним.
  9. Принаймні один з A і B повинен виконати принаймні одне твердження в межах мови.

Це кодовий гольф, тому найкоротша відповідь виграє, оцінка становить тривалість програми А в байтах (тобто тривалість програми B не має значення).


Чи можете ви, будь ласка, додати "пунктуацію" до списку винятків у першому пункті? Це завдання неможливо вирішити багатьма мовами (особливо тими, які вимагають від вас фігурних брекетів у головній функції) інакше.
FUZxxl

пов'язані, але, ймовірно, досить різні.
Мартін Ендер

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

1
Для цілей тут, є Aі aрозглядаються різні «символи»?
HostileFork каже, що не довіряйте SE

1
Було б краще, якби ви надали повний перелік символів ASCII, які відповідають правилу 5.
aditsu quit тому, що SE - EVIL

Відповіді:


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є пунктуацією.
Денніс

Гаразд, правила були змінені з моменту останнього їх читання.
isaacg

Так, це працює. Я б сформулював правила, щоб запобігти використанню пробілів як висловлювань, але забув, що така ж лазівка ​​буде присутня для пунктуації. Тож лазівка ​​легально експлуатувалася.
abligh

14

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

Програма A:

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.