Trzy wzajemne quiny

23

Zadanie

W tym wyzwaniu Twoim zadaniem jest napisanie trzech programów, które tworzą rodzaj systemu podobnego do quine. Nazwijmy programy A, Ba C. Jeżeli jeden z programów podaje jako źródło źródło innego programu, wysyła źródło trzeciego programu. Na przykład, jeśli Apodano Bjako dane wejściowe, generuje dane wyjściowe C. Jeśli programy zostały podane jako własne źródło wejścia, są one zobowiązane do wyjścia trzy struny "three", "mutual"i "quines"(bez cudzysłowów). We wszystkich przypadkach mogą wyświetlać jeden dodatkowy znak nowej linii. W przypadku innych danych wejściowych programy mogą robić wszystko, w tym awarię.

Przykład

Na przykład załóżmy, że kody źródłowe A, Bi Cto aSdf, ghJki zxcV. Następnie programy powinny zachowywać się w następujący sposób.

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

Zasady i punktacja

Rozwiązania A, Bi Cmogą być zarówno funkcje lub pełne programy, ale muszą one być całkowicie niezależny: nie wspólny kod jest dozwolony. Obowiązują standardowe luki i reguły quine , więc programy nie mogą uzyskać dostępu do własnych kodów źródłowych w żaden sposób.

Twój wynik to łączna liczba bajtów A, Ba im Cniższy wynik, tym lepiej.

Zgarb
źródło
Co dokładnie oznacza „niedozwolony wspólny kod”? Czy nie mogą mieć podobnych części? (Utrudniłoby to udzielanie odpowiedzi w Javie, ponieważ większość programów public static void maingdzieś ma swoją część). A może po prostu nie możesz napisać funkcji wywoływanej przez wszystkie trzy?
Paŭlo Ebermann
@ PaŭloEbermann Oznacza to drugie: każdy z 3 programów powinien działać samodzielnie.
Zgarb,

Odpowiedzi:

16

CJam, 165 147 114 108 99 bajtów

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

Dzięki @ MartinBüttner za sugestię, która pomogła zaoszczędzić 48 bajtów!

Wypróbuj online w interpretatorze CJam .

Weryfikacja

$ 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

Pomysł

Zbiór {0, 1, 2, 3} to grupa pod operacją ^ (binarne wyłączne OR), w której każdy element jest własną odwrotnością.

Jeśli wszystkie trzy programy są identyczne, z wyjątkiem pierwszego znaku (element {0, 1, 2, 3} ), możemy je łatwo odróżnić i wydrukować:

  • Zaczynamy od XOR cyfry na początku kodu źródłowego i wejścia.

  • Jeśli wynik wynosi 0 , źródło i wejście są zgodne.

    Tak więc drukujemy jedno z trzech słów wybranych przez tę wspólną cyfrę.

  • Jeśli wynikiem nie jest 0 , to element {1, 2, 3} nie znajduje się ani w źródle, ani w danych wejściowych.

    W ten sposób drukujemy go, a następnie resztę danych wejściowych.

Jak to działa

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.
Dennis
źródło
2
Wow, przeczytałem pytanie i pomyślałem: „nikt nie znajdzie na to odpowiedzi”. Potem spojrzałem w dół i zobaczyłem odpowiedź Dennisa (kto jeszcze?) +1!
Level River St