Три взаємні лайки


23

Завдання

У цьому завданні ваше завдання полягає в тому, щоб написати три програми, які утворюють своєрідну систему, схожу на квінти. Давайте назвемо програми A, Bі C. Якщо одній із програм надається джерело іншої програми як вхідний, він виводить джерело третьої програми. Наприклад, якщо Aзадано Bяк вхід, він виводить C. Якщо програми дають свій власний джерело в якості вхідних даних, то вони повинні виводити три рядки "three", "mutual"і "quines"(без лапок). У всіх випадках вони можуть вивести один додатковий зворотний рядок. На будь-якому іншому вході програми можуть робити що завгодно, включаючи збої.

Приклад

Наприклад, припустимо, що вихідні коди A, Bі Cє aSdf, ghJkі zxcV. Тоді програми повинні вести себе так.

Source Input  Output
--------------------
aSdf   aSdf   three
aSdf   ghJk   zxcV
aSdf   zxcV   ghJk
ghJk   aSdf   zxcV
ghJk   ghJk   mutual
ghJk   zxcV   aSdf
zxcV   aSdf   ghJk
zxcV   ghJk   aSdf
zxcV   zxcV   quines

Правила та оцінка

Рішення A, Bі Cможуть бути або функції або повні програми, але вони повинні бути повністю незалежними: НЕ загальний код не допускається. Застосовуються стандартні лазівки та правила quine , тому програми не можуть отримати жодного доступу до власних вихідних кодів.

Ваш бал - це комбіноване число байтів A, Bа Cнижчий бал - кращий.


Що саме означає "не дозволений загальний код"? Чи не можуть вони мати подібні частини? (Це ускладнить відповідь на Java, оскільки у більшості програм public static void mainдесь є частина.) Або просто ви не можете написати функцію, яку викликають усі три?
Paŭlo Ebermann

@ PaŭloEbermann Це означає останнє: кожна з трьох програм повинна функціонувати самостійно.
Згарб

Відповіді:


16

CJam, 165 147 114 108 99 байт

2 _ri^_q+@"quinesmutualthree"6/=?
1 _ri^_q+@"quinesmutualthree"6/=?
3 _ri^_q+@"quinesmutualthree"6/=?

Дякуємо @ MartinBüttner за пропозицію, яка допомогла зберегти 48 байт!

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Перевірка

$ cat A
2 _ri^_q+@"quinesmutualthree"6/=?
$ cat B
1 _ri^_q+@"quinesmutualthree"6/=?
$ cat C
3 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam A < A
three
$ cjam A < B
3 _ri^_q+@"quinesmutualthree"6/=?
$ cjam A < C
1 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam B < A
3 _ri^_q+@"quinesmutualthree"6/=?
$ cjam B < B
mutual
$ cjam B < C
2 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam C < A
1 _ri^_q+@"quinesmutualthree"6/=?
$ cjam C < B
2 _ri^_q+@"quinesmutualthree"6/=?
$ cjam C < C
quines

Ідея

Множина {0, 1, 2, 3} - це група під операцією ^ (бінарний ексклюзивний АБО), де кожен елемент є власним оберненим.

Якщо всі три програми однакові, за винятком першого символу (елемент {0, 1, 2, 3} ), ми можемо легко їх розрізнити та роздрукувати:

  • Почнемо з XORing цифри на початку вихідного коду та введення.

  • Якщо результат дорівнює 0 , джерело та введення збігаються.

    Таким чином, ми друкуємо одне з трьох слів, вибране цією загальною цифрою.

  • Якщо результат не 0 , це елемент {1, 2, 3}, який немає ні в джерелі, ні у вході.

    Таким чином, ми друкуємо його з подальшим рештою введення.

Як це працює

2                                  e# Push the number N on the stack.
  _                                e# Push a copy.
    r                              e# Read a token from STDIN, i.e., the input up
                                   e# to and excluding the next whitespace char.
     i                             e# Cast to integer.
      ^                            e# XOR it with the copy of N. Result: X
       _                           e# Push a copy of the result.
        q+                         e# Append the rest of the input.
          @                        e# Rotate N on top of the stack.
           "quinesmutualthree"6/   e# Push ["quines" "mutual" "three"].
                                =  e# Select the word at index N.
                                 ? e# If X is non-zero, select the modified input;
                                   e# otherwise, select the word.

2
Нічого собі, я прочитав питання і подумав: "Ніхто не збирається відповісти на це". Тоді я подивився вниз і побачив відповідь від Денніса (хто ще?) +1!
Рівень річки Св.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.