Три общих квина


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 Это означает последнее: каждая из 3 программ должна быть самостоятельной.
Згарб

Ответы:


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!
Уровень Река St
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.