3つの相互のクイン


23

タスク

この課題では、あなたの仕事は、一種の相互に似たシステムを形成する3つのプログラムを作成することです。プログラムを呼ぶことにしましょうABC。プログラムの1つに別のプログラムのソースが入力として与えられた場合、3番目のプログラムのソースを出力します。たとえば、AB入力として与えられた場合、を出力しますC。プログラムは、入力として、独自のソースを与えている場合は、出力3つの文字列はなら"three""mutual"と、"quines"(引用符なし)。いずれの場合でも、1つの追加の末尾の改行を出力できます。他の入力については、プログラムはクラッシュを含め、何でもできます。

例えば、のソースコードを仮定しABそしてCありaSdfghJkそして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

ルールとスコアリング

ソリューションABおよびCは、機能または完全なプログラムのいずれかですが、完全に独立している必要があります。共有コードは許可されません標準の抜け穴クインルールが適用されるため、プログラムは独自のソースコードにアクセスできません。

あなたのスコアはの組み合わせバイト数でABかつC、低いスコアは良くあること。


「共有コードは許可されません」とはどういう意味ですか?似たような部品はありませんか?(これは、ほとんどのプログラムがpublic static void mainどこかに部分を持っているため、Javaでの応答を難しくします。)または、3つすべてによって呼び出される関数を書くことができないのですか?
パエロエベルマン

@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/=?

48バイトの節約に役立つ提案をしてくれた@MartinBüttnerに感謝します!

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}は、操作^(バイナリ排他的OR)の下のグループであり、各要素はそれ自体が逆です。

最初の文字({0、1、2、3}の要素)を除いて3つのプログラムがすべて同一である場合、それらを簡単に区別して印刷できます。

  • まず、ソースコードと入力の先頭にある数字のXOR演算を行います。

  • 結果が0の場合、ソースと入力が一致します。

    したがって、この共通の数字で選択された3つの単語の1つを印刷します。

  • 結果が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!
レベルリバーセント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.