Üç karşılıklı sınav


23

Görev

Bu zorlu görevde, göreviniz bir tür birbirine benzeyen sistem oluşturan üç program yazmaktır. Let programlarını diyoruz A, Bve C. Programlardan birine girdi olarak başka bir programın kaynağı verilirse, üçüncü programın kaynağını çıkarır. Örneğin, girdi olarak Averilirse B, çıktı verir C. Programlar girdi olarak kendi kaynağını verilirse, bunu yapacaklarını çıkış üç dizeleri "three", "mutual"ve"quines" (tırnaklar olmadan). Her durumda, ek bir son satır yeni satır verebilir. Diğer girişler için, programlar kilitlenme dahil her şeyi yapabilir.

Örnek

Örneğin, bu kaynak kodu varsayalım A, Bve Cvardır aSdf, ghJkve zxcV. O zaman programlar aşağıdaki gibi davranmalıdır.

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

Kurallar ve puanlama

Çözümler A, Bve Cişlevleri veya tam programları da olabilir, ancak bunlar tamamen bağımsız olması gerekir: Hiçbir paylaşılan kod izin verilir. Standart boşluklar ve quine kuralları uygulanır, böylece programlar kendi kaynak kodlarına hiçbir şekilde erişemez.

Puanınız kombine bayt sayısıdır A, Bve Calt skor daha iyi olmak.


Tam olarak "paylaşılan koda izin verilmiyor" ne demek? Benzer parçaları olamaz mı? (Bu, çoğu programın bir public static void mainyerde bir parçası olduğu için Java’ya cevap vermeyi zorlaştırır .) Ya da sadece üçünün de çağırdığı bir işlevi yazamazsınız?
Paŭlo Ebermann

@ PaŭloEbermann Bu ikinci demektir: 3 programın her biri kendi başına işlevsel olmalıdır.
Zgarb

Yanıtlar:


16

CJam, 165 147 114 108 99 bayt

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

@ MartinBüttner'e 48 bayttan tasarruf etmesini sağlayan öneri için teşekkürler!

CJam tercümanında çevrimiçi olarak deneyin .

Doğrulama

$ 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

Fikir

{0, 1, 2, 3} kümesi , her bir öğenin kendi tersi olduğu ^ (ikili hariç OR) işlemi altında bir gruptur .

İlk karakter hariç ( {0, 1, 2, 3} öğesinin öğesi) üç program da aynıysa , bunları kolayca ayırt edebilir ve yazdırabiliriz:

  • Kaynak kodun başında ve girişte XORing ile başlıyoruz.

  • Sonuç 0 ise , kaynak ve giriş eşleşir.

    Böylece, bu ortak rakam tarafından seçilen üç kelimeden birini basarız.

  • Sonuç 0 değilse , {1, 2, 3} öğesinin öğesidir. , ne kaynakta ne de girdide .

    Böylece, onu yazdırıyoruz, ardından girdi geri kalanını takip ediyoruz.

Nasıl çalışır

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
Vay, soruyu okudum ve "hiç kimse bunun için bir cevap bulamayacak" diye düşündüm. Sonra aşağı baktım ve Dennis'den bir cevap gördüm (başka kim?) +1!
Seviye Nehri St
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.