マジックザギャザリング:友達か敵か?


67

カードゲームMagic:the Gatheringには、白(W)、青(U)、黒(B)、赤(R)、緑(G)の5つの異なる色があります。これらは多くの場合、次のように五角形に配置されます。

  W
G   U
 R B

MtGの伝承と多くのカードメカニズムの両方で、この五角形の隣接する色は通常同盟国と見なされ、隣接していない(反対の種類の)色は敵と見なされます。

この課題では、2色が与えられ、それらの関係を決定する必要があります。

挑戦

セットから任意の2つの異なる文字が与えられますBGRUW。これらは、2文字の文字列、文字間に区切り文字がある文字列、2つの個別の文字値、2つのシングルトン文字列、コードポイントを表す2つの整数、または2つの文字/文字列/整数を含むリストまたはセットタイプとして使用できます。

出力は、選択した2つの異なる一貫した値の1つである必要があります。1つは2つの色が味方であることを示し、もう1つは敵であることを示します。これらの2つの値のいずれかは、まったく出力されない場合があります。

プログラムまたは関数を記述し、入力を受け取り、出力を提供する当社の標準的な方法のいずれかを使用できます。

任意のプログラミング言語を使用できますが、これらの抜け穴はデフォルトでは禁止されています。

これはであるため、バイト単位で測定された最短の有効な回答が勝ちます。

テストケース

可能な入力は20個しかないため、すべてをリストします。

友達:

WU   UB   BR   RG   GW   UW   BU   RB   GR   WG

敵:

WB   UR   BG   RW   GU   BW   RU   GB   WR   UG

33
次のアップ:コアルールを実装:P
キャプテン・マン

12
@CaptainMan

@Walfrat 30k?可能にすべき
チャールズ

2
@IvanKolmychekは、最も予想外の提携から最も予想外の結果をもたらします。
-aluriak

1
楽しい事実:マジック:ザ・ギャザリングはチューリング完全な:)です
マシュー盧

回答:


82

JavaScript(ES6)、 26 23 17 15  14バイト

カリー化構文の2つのASCIIコードとして入力を受け取ります(a)(b)4友人または0敵のために戻ります。

a=>b=>a*b/.6&4

オンラインでお試しください!

どうやって?

NB:0.6による除算の整数商のみを以下に示します。

Combo | a  | b  | a*b  | / 0.6 | AND 4
------+----+----+------+-------+------
  WU  | 87 | 85 | 7395 | 12325 |   4
  UB  | 85 | 66 | 5610 |  9350 |   4
  BR  | 66 | 82 | 5412 |  9020 |   4
  RG  | 82 | 71 | 5822 |  9703 |   4
  GW  | 71 | 87 | 6177 | 10295 |   4
  UW  | 85 | 87 | 7395 | 12325 |   4
  BU  | 66 | 85 | 5610 |  9350 |   4
  RB  | 82 | 66 | 5412 |  9020 |   4
  GR  | 71 | 82 | 5822 |  9703 |   4
  WG  | 87 | 71 | 6177 | 10295 |   4
------+----+----+------+-------+------
  WB  | 87 | 66 | 5742 |  9570 |   0
  UR  | 85 | 82 | 6970 | 11616 |   0
  BG  | 66 | 71 | 4686 |  7810 |   0
  RW  | 82 | 87 | 7134 | 11890 |   0
  GU  | 71 | 85 | 6035 | 10058 |   0
  BW  | 66 | 87 | 5742 |  9570 |   0
  RU  | 82 | 85 | 6970 | 11616 |   0
  GB  | 71 | 66 | 4686 |  7810 |   0
  WR  | 87 | 82 | 7134 | 11890 |   0
  UG  | 85 | 71 | 6035 | 10058 |   0

以前のアプローチ、15バイト

カリー化構文の2つのASCIIコードとして入力を受け取ります(a)(b)0友人または1敵のために戻ります。

a=>b=>a*b%103%2

オンラインでお試しください!

どうやって?

Combo | a  | b  | a*b  | MOD 103 | MOD 2
------+----+----+------+---------+------
  WU  | 87 | 85 | 7395 |    82   |   0
  UB  | 85 | 66 | 5610 |    48   |   0
  BR  | 66 | 82 | 5412 |    56   |   0
  RG  | 82 | 71 | 5822 |    54   |   0
  GW  | 71 | 87 | 6177 |   100   |   0
  UW  | 85 | 87 | 7395 |    82   |   0
  BU  | 66 | 85 | 5610 |    48   |   0
  RB  | 82 | 66 | 5412 |    56   |   0
  GR  | 71 | 82 | 5822 |    54   |   0
  WG  | 87 | 71 | 6177 |   100   |   0
------+----+----+------+---------+------
  WB  | 87 | 66 | 5742 |    77   |   1
  UR  | 85 | 82 | 6970 |    69   |   1
  BG  | 66 | 71 | 4686 |    51   |   1
  RW  | 82 | 87 | 7134 |    27   |   1
  GU  | 71 | 85 | 6035 |    61   |   1
  BW  | 66 | 87 | 5742 |    77   |   1
  RU  | 82 | 85 | 6970 |    69   |   1
  GB  | 71 | 66 | 4686 |    51   |   1
  WR  | 87 | 82 | 7134 |    27   |   1
  UG  | 85 | 71 | 6035 |    61   |   1

初期アプローチ、23バイト

入力を2文字の文字列として受け取ります。true友人またはfalse敵のために戻ります。

s=>parseInt(s,35)%9%7<3

オンラインでお試しください!


10
ああ、最後に何か楽しい。:)
マーティンエンダー

4
素晴らしい発見!
グレッグマーティン

私がここで気づいていない巧妙な数学はありますか?
-FourOhFour

@FourOhFourそれは総当たりでした。これは最小の二重モジュロソリューションだと思います。ただし、この回答のポート(比較を使用)は実際には1バイト短くなります。
アーナウルド

1
@OddDev最下位ビットだけでなく、すべてのビットを実際にテストしました。たとえば、a*b%290&8同様に機能します(0友人または8敵のために生産します)。
アーナウルド

37

ゼリー、6バイト

ạg105Ị

引数として2つのコードポイントを取ります。収量1友人のために、0敵のために。

オンラインでお試しください!

バックグラウンド

ましょう、N及びMは二つの入力文字のコードポイントです。服用することにより、N - M | | 、キャラクターの2つの組み合わせすべてにのみ関心を持つ必要があります。次の表は、文字のすべての2つの組み合わせと、対応する絶対的な違いを示しています。

WU  2
UB 19
BR 16
RG 11
GW 16

WB 21
UR  3
BG  5
RW  5
GU 14

すべてのの組み合わせが割り切れるある35、または7が、のどれも友人の友人が正確と互いに素なものであるので、この組み合わせが3×5×7 = 105

使い方

ạg105Ị  Main link. Left argument: n (code point). Right argument: m (code point)

ạ       Yield the absolute difference of n and m.
 g105   Compute the GCD of the result and 105.
     Ị  Insignificant; return 1 if the GCD is 1, 0 if not.

きれいに見つけた!なぜ絶対値が必要なのですか?(オンラインで試してみましたが、正しい答えは得られませんでしたが、数学的には重要ではありません。)
グレッグマーティン

@GregMartin必須ではありません。符号付きの差も同様に機能します。減算は_ゼリーです。他のものを使用しましたか?
デニス

ああ、私は間違って絶対値ではなく絶対値として読んだ。
グレッグマーティン


21

Befunge-98、13の 12バイト

~~-9%5%3%!.@

オンラインでお試しください!

0友達と1敵のためのプリント

これは、文字のASCII値の違いを使用します。

を取得した場合(((ASCII difference % 9) % 5) % 3)、敵の値は0になります。その後、値ではなく印刷します。

ゴルフの@Martinに感謝


Jellyを9バイト使用:IA%9%5%3¬編集してみてください!
ジョナサンアラン

@JonathanAllan私はあなたがすでにやったことを見る!いいね
MildlyMilquetoast

私は実際にあなたのメソッドを(絶対ではなく実際の違いを使用して)mod 9 mod 6でモーフィングし、Jellyがリストにモジュラーでインデックスを付けるという事実を使用して7に下げました。私はあなたを認定し、ここにリンクしました。
ジョナサンアラン

@JonathanAllan私もMOD 9のmod 6の方法を思い付いたが、Befungeは、実際の差や絶対値を持っていないので、それはのように実現可能ではなかった
MildlyMilquetoast

18

ゼリー8 7 バイト

Mistah Figginsの素晴らしいBefungeの答えからおんぶ

Iị390B¤

オンラインでお試しください!

どうやって?

Mistah Figginsが指摘したように、ASCII値mod 9 mod 5 mod 3の絶対差を取ることによって決定が行われる場合があります。0はフレンドであり、1と2は敵です。

代わりに(プレーン)差分mod 9を使用すると、友人は1、2、7、8であり、敵は3、4、5、6であることがわかります。

このコードは、差分を取得Iし、長さ9のリストにインデックスを付けます。[1,1,0,0,0,0,1,1,0]これは、バイナリで390 390Bです。インデックス作成はモジュール式であるため(事実上、インデックス作成はmod 9を無料で実行します)、1ベース(したがって、左端に1があります)です。


16

C ++テンプレートメタプログラミング、85バイト

template<int A,int B,int=(A-B)%9%5%3>struct f;template<int A,int B>struct f<A,B,0>{};

少ないゴルフ:

template<int A, int B,int Unused=(((A-B)%9)%5)%3>
struct foe;
template<int A, int B>
struct foe<A,B,0>{};

これはメタプログラミング言語であるため、コンパイルされるかどうかのコンストラクトが1つの可能な出力です。

とが敵であるf<'W','B'>場合にのみ、コンパイルのインスタンス。'W''B'

Befunge回答に基づく数学。

ライブ例

C ++テンプレートのメタプログラミングは最悪のゴルフ言語の1つであるため、これよりも悪い人は恥ずべきことでしょう。;)


templatesの中に合計2つの冗長な空白があるようです。
イッツィー

@TuukkaX修正、d'oh
Yakk

14

ルビー、22 19バイト

->x,y{390[(x-y)%9]}

入力:2文字のASCIIコード。出力:味方は1、敵は0。

使い方:

9を法とする2つの数値の差を取得し、ビットマスク(390はバイナリ110000110)を使用し、[]演算子を使用して1ビットを取得します。


2
ああ、私は整数にインデックスを付けることができることを忘れ続けています。+1
マーティン・エンダー

16バイト:とは逆になっ->x,y{x*y%103%2}ていることに注意してください。01
エリックドゥミニル

1
そしてx*y%51>9他の皆と同じように15バイト。今、それを非常に根本的に変えることは、賛成者にとって不公平だと思います。
GB

10

CJam、8バイト

{*51%9>}

スタックの上部に2つの文字コードが必要で、それらを0(友人)または1(敵)に置き換える名前のないブロック。

オンラインでお試しください!

説明

さて、私たちは今、多くの楽しい算術ソリューションを見てきましたので、私は今、私自身のソリューションを提示することは問題ないでしょう。これまで見てきた中で最も近いのは、SteadyboxのCソリューションです。これは、先ほどアナーキーゴルフ用に書いたGolfScriptブルートフォーサーの助けを借りて発見されました。

以下は、これがさまざまな入力に対して行うことです(最初の乗算は可換であるため、順序を無視します)。

xy   x    y    x*y   %51  >9

WU   87   85   7395    0   0
UB   85   66   5610    0   0
BR   66   82   5412    6   0
RG   82   71   5822    8   0
GW   71   87   6177    6   0
WB   87   66   5742   30   1
UR   85   82   6970   34   1
BG   66   71   4686   45   1
RW   82   87   7134   45   1
GU   71   85   6035   17   1

51を法とする入力の積を取得することにより、入力が大小の結果にうまく分離され、2つのケースを区別するために中間の値を使用できることがわかります。


9

ローダ30 22 21バイト

@fergusqのおかげ_で、ストリーム上の値を入力として使用することでバイトを節約

{[_ in"WUBRGWGRBUW"]}

オンラインでお試しください!

関数はpush "WU" | f、関数に名前を割り当てた後に実行されます

説明

{                      /* Declares an anonymous function */
 [                 ]   /* Push */
  _ in                 /* the boolean value of the value on the stream is in */
      "WUBRGWGRBUW"    /* this string */
}

o_O電光速度
パベル

parameters:を受け取る代わりに、ストリームから入力値を読み取ることで5バイトを節約することもできますが{[(_.._)in"WUBRGWGRBUW"]}、その場合は関数を次のように呼び出す必要があります[a, b] | f
fergusq



8

Vim、22 21バイト

CWUBRGWGRBUW<esc>:g/<c-r>"/d<cr>

入力:2つの文字を含む1行。

出力:友達の場合は空のバッファー、含むバッファー WUBRGWGRBUW、敵の場合。

説明

C                                 # [C]hange line (deletes line into " register and enters insert mode)
 WUBRGWGRBUW<esc>                 # insert this text and exit insert mode
                 :g/      /d<cr>  # delete all lines containing...
                    <c-r>"        # ... the previously deleted input

2
あなたは行うことができますC代わりにcw
KritixiのLithos

8

Japt、6バイト

@Martin Enderのソリューションに触発されました 。

2つの文字コードの配列を入力として受け取ります。

×%51<9

オンラインでお試しください!| テストスイート

敵のtrueために、友人のfalseために戻ります。

14バイトのソリューション:

入力として2つの文字コードを受け取ります

nV a /3%3 f ¦1

オンラインでお試しください!| テストスイート

説明:

nV a /3%3 f ¦1
nV a             // Absolute value of: First input (implicit) - Second input
      /3%3 f     // Divide by 3, mod 3, then floor the result
             ¦1  // Return true if the result does not equals 1, otherwise return false

12バイトのソリューション:

"WUBRGW"ê èU

オンラインでお試しください!| テストスイート

説明:

"WUBRGW"ê èU
"WUBRGW"ê     // "WUBRGW" mirrored = "WUBRGWGRBUW"
          èU  // Returns the number of times U (input) is found

1友人と0敵のために戻ります。

9バイトソリューション

@Arnauldのソリューションに触発されました。

*V%24%B%2

テストスイート

敵の1ために、友人の0ために戻ります。

11バイトのソリューション:

@Mistah Figginsのソリューションに触発されました。

nV %9%5%3¦0

テストスイート


8

脳フラック155、147、135のバイト

(([(({}[{}]))<>])){({}())<>}(((([])[][][])[]())()()())<>{}<>{({}<><(({}))>)({}[{}]<(())>){((<{}{}>))}{}{{}({}<({}())>)(<()>)}{}<>}<>{}

オンラインでお試しください!

これは、134バイトのコードに加えて、 -aて、ASCII入力を有効にするフラグの。

これは、入力間の絶対差を見つけ、それらが2、11、16、または19に等しいかどうかを確認することで機能します。等しい場合、入力はフレンドであり、1を出力します。brain-flakには空のスタックに対応するもの何もないため、偽の値であるため、出力は偽の値ではありません。(メタ

私がこの回答で特に気に入っていることの1つは、「絶対差」スニペット(つまり(([(({}[{}]))<>])){({}())<>}{}{}<>{})がスタッククリーンではないことですが、エンコードする前にどのスタックになるかは気にしないので、この回答で引き続き使用できます可能な違い。

後の編集で、私はこれをさらに活用して、スタック上の残り物を虐待することで、それが絶対的な違いにならないようにしました。最初のリビジョンでは、両方をポップして少し健全に保ちました。これを行わないと、2つの主要なゴルフができます。

  1. 明らかに、それらをポップするコードを削除します:{}{}、しかしもっと重要なことは:

  2. 2, 11, 16, 19シーケンスを圧縮することができます

    (((((()()))[][][](){})[][]())[])
    

    (((([])[][][])[]())()()())
    

    幸いなことに、これらの残り物を後で処理するために必要な余分なコードはありません。したがって、それらは代替スタックに残っています。

brain-flakは理解が難しいことで有名なので、ここに読みやすい/コメント付きのバージョンがあります:

#Push the absolute difference of the two input characters. It is unknown which stack the result will end on
(([(({}[{}]))<>])){({}())<>}

#Push 2, 11, 16, 19, while abusing the values left on the stack from our "Absolute value" calculation
(((([])[][][])[]())()()())

#Pop a zero from the other stack and toggle back
<>{}<>

#While True
{

    #Move top over and duplicate the other top
    ({}<><(({}))>)

    #Equals?
    ({}[{}]<(())>){((<{}{}>))}{}

    #If so:
    {

        #Increment the number under the stack
        {}({}<({}())>)
        #Push a zero
        (<()>)

    }

    #Pop the zero
    {}

    #Go back to the other stack
    <>

#Endwhile
}

#Toggle back
<>

#Pop a zero
{}

削除できるプッシュ、ポップがあり、より効率的に0をプッシュして129に達する
ライリー

@Riley Cool、ヒントをありがとう!私はコメント付きのバージョンが好きなので、更新する前にそのバージョンを理解できるようになるまで待ちます。
DJMcMayhem

わずか2つの小さな変更でした。ここが重要な部分です。私のコメントはすべて大文字です。大声で叫ぶように見える場合は申し訳ありません。
ライリー

7

ゼリー、14バイト

“WUBRG”wЀIAÆP

1敵と0友人のために戻ります。

オンライン試す

どうやって?

“WUBRG”wЀIAÆP - Main link                                   e.g. WG
“WUBRG”        - ['W','U','B','R','G']
       wЀ     - first index of sublist mapped over the input     [1,5]
          I    - incremental differences                           -4
           A   - absolute value                                     4
            ÆP - is prime?                                          0


6

CJam16 12 11 10バイト

Mistah Figginsのアルゴリズムを使用して4バイトをゴルフ

Lynnのおかげで1バイト節約

l:m9%5%3%!

味方の色の1敵の色の出力0

オンラインでお試しください!(または、すべてのテストケースを確認します

説明

l           e# Push a line of input as a string
 :m         e# Reduce the string by subtraction (using the ASCII values)
   9%5%3%   e# Mod by 9, then by 5, then by 3. By doing this, enemy
            e#  pairs go to 0, and allies go to 1, 2, -1, or -2.
         !  e# Boolean negation

あまりにも賢くしようとしないでください!l:m9%5%3%!1バイト短いです。
リン

@Lynn Ohうわー、そうです。それはちょっと退屈です。ありがとう
ビジネスキャット

5

網膜、18バイト

O`.
BR|BU|GR|GW|UW

オンラインでお試しください!

かなり簡単です:入力を並べ替え、並べ替えられた味方ペアのいずれかを照合します。残念ながら、Retinaの文字列ベースの性質により、より興味深いアプローチのいずれかが競争力を発揮できるとは思いません。

次のRetinaバージョンのスニークピークとして、正規表現とターゲット文字列を交換するオプションを追加する予定です(したがって、現在の文字列が正規表現として使用され、チェックする文字列を指定します)ソリューションが動作します(またはこれらの線に沿って何か):

?`WUBRGWGRBUW



4

ゼリー、6バイト

ạ:3%3Ḃ

完全を期すために。引数として2つのコードポイントを取ります。収量0友人のために、1の敵のために。

オンラインでお試しください!

バックグラウンド

ましょう、N及びMは二つの入力文字のコードポイントです。服用することにより、N - M | | 、キャラクターの2つの組み合わせすべてにのみ関心を持つ必要があります。次の表は、文字のすべての2つの組み合わせと、対応する絶対的な違いを示しています。

WU UB BR RG GW  WB UR BG RW GU
 2 19 16 11 16  21  3  5  5 14

これらの整数を3で除算すると、次の商が得られます。

WU UB BR RG GW  WB UR BG RW GU
 0  6  5  3  5   7  1  1  1  4

14、および7は、にマッピングすることができる1結果モジュロ取ることによって3

WU UB BR RG GW  WB UR BG RW GU
 0  0  2  0  2   1  1  1  1  1

次に、パリティを確認するだけです。

使い方

ạ:3%3Ḃ  Main link. Left argument: n (code point). Right argument: m (code point)

ạ       Absolute difference; yield |n - m|.
 :3     Integer division by 3, yielding |n - m| / 3.
   %3   Modulo 3, yielding |n - m| / 3 % 3.
     Ḃ  Parity bit; yield |n - m| / 3 % 3 & 1.

4

Cubix、11バイト

ArnauldのソリューションのCubix実装。

U%O@A*'g%2W

使用法

2つの文字を入力すると0、友人1用と敵用に出力されます。ここで試してみてください。

説明

コードはこのように拡張できます。

    U %
    O @
A * ' g % 2 W .
. . . . . . . .
    . .
    . .

文字は次の順序で実行されます(制御フローを除く):

A*'g%2%O@
A         # Read all input as character codes
 *        # Multiply the last two character codes
    %     # Modulo the result by
  'g      #     103
      %   # And modulo that by
     2    #     2
       O  # Output the result ...
        @ # ... and terminate


2

AWK、23バイト

{$0="WUBRGWGRBUW"~$1}1

使用例:awk '{$ 0 = "WUBRGWGRBUW"〜$ 1} 1' <<< UB

これ1は、ペアがフレンドの場合に出力され、0それ以外の場合に出力されます。私は何か賢いことをしたかったのですが、考えていたすべてがもっと長くなるでしょう。



2

ルビー、28バイト

友達の場合はtrue、敵の場合はfalseを出力します。

p'WUBRGWGRBUW'.include?$**''

改変されていないバージョンはそれほど変わりません:

p 'WUBRGWGRBUW'.include?(ARGV.join(''))


2

GolfScript、7バイト

~*51%9>

2つのコードポイントを入力として受け取ります。

オンラインでお試しください!(便宜上、入力形式を変換するテストスイート。)

CJam回答の GolfScriptポート(技術的には、GolfScriptのブルートフォーサーの結果のCJam移植版です...ええと...)。

ただし、GolfScriptは負の入力でモジュロを取得するため、同じバイトカウントで4、代わりに敵に使用する楽しい代替ソリューションがあります1

~-)9%4&

オンラインでお試しください!

xy   x    y    x-y    +1  %9  &4

WU   87   85     2     3   3   0
UB   85   66    19    20   2   0
BR   66   82   -16   -15   3   0
RG   82   71    11    12   3   0
GW   71   87   -16   -15   3   0
WB   87   66    21    22   4   4
UR   85   82     3     4   4   4
BG   66   71    -5    -4   5   4
RW   82   87    -5    -4   5   4
GU   71   85   -14   -13   5   4

2

Java 7、38バイト

int b(int a,int b){return(a-b)%9%5%3;}

@Mistah Figginsポート'Befunge-98の回答は、これまでに投稿された回答の中でJava 7で最も短いものです。
その他については:

39バイト:@ArnauldのJavaScript(ES6)answerからのポート。

int a(int a,int b){return a*b%24%11%2;}

39バイト:@MartinEnderのCJam応答からのポート

Object e(int a,int b){return a*b%51>9;}

47バイト:@Steadyboxからのポート 'C回答

Object d(int a,int b){return(a=a*b%18)>7|a==3;}

52バイト:@LynnのPython 2回答からのポート

Object c(String s){return"WUBRGWGRBUW".contains(s);}

注:プライム/パリンドロームなどを使用する回答はスキップされました。これらはJavaで不足しているためです。;)
TODO:私自身の答えを考え出します。これらのほとんどよりも短いとは思いませんが。

ここですべて試してください。


編集:さて、あまり悪くない自分自身を思いついた:

50バイト:

Object c(int a,int b){return(a=a*b%18)>3&a<7|a<1;}

説明:

ab  a   b   a*b     %18

WU  87  85  7395    15
UB  85  66  5610    12
BR  66  82  5412    12
RG  82  71  5822    8
GW  71  87  6177    3
UW  85  87  7395    15
BU  66  85  5610    12
RB  82  66  5412    12
GR  71  82  5822    8
WG  87  71  6177    3

WB  87  66  5742    0
UR  85  82  6970    4
BG  66  71  4686    6
RW  82  87  7134    6
GU  71  85  6035    5
BW  66  87  5742    0
RU  82  85  6970    4
GB  71  66  4686    6
WR  87  82  7134    6
UG  85  71  6035    5

すべての敵は4〜6(包括的)または0の範囲
です。EDIT2:うーん。@ Steadybox 'answer .. :(


2

PHP、31バイト

echo!strstr(WBGURWRUGBW,$argn);

で実行します。echo AB | php -nR '<code>ここでABは2色です。

strtr入力が見つかった位置から文字列を返します。色が敵であれば干し草の山のように、これはtruthy文字列を返します。そうでない場合は空の文字列。
WBGURWRUGBW

!は、真の文字列をfalseに変換
し、空の出力を生成し、空の文字列をtrueに変換し、出力を生成します1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.