偶数または奇数:3人のプレーヤー


15

片手でプレイする3人用のゲームです。

同時に、各プレーヤーは0〜5本の指を伸ばして手を見せます。

すべてのプレイヤーが同じ種類(偶数または奇数)の数字を示している場合、勝者はいません。しかし、そうでない場合は、異なる種類のプレイヤーが2つの勝ちです。

 P l a y e r s
A      B      C       Winner

Even   Even   Even    No winner
Odd    Odd    Odd     No winner
Even   Odd    Odd     Player A
Odd    Even   Even    Player A
Even   Odd    Even    Player B
Odd    Even   Odd     Player B
Odd    Odd    Even    Player C
Even   Even   Odd     Player C

要求されたツールは、引数(0〜5の数値として3つの引数)またはSTDIN(スペースで区切られた行ごとの3つの値)を使用できます。

入力を確認する必要はありません。入力が不規則な場合、予期しない出力が生成される可能性があります。

行の引数または値は、プレーヤーAからプレーヤーCまで、左から右に与えられます。

出力は含まれている必要がありますABまたはC(大文字の)または文字列no one(通常のスペースで、小文字)。

ツールは1回だけ、またはすべての入力行でフィルターとして機能します。

最短のコード勝利。


6
[王様の王様]としてもっと面白いかもしれません。ゲームをプレイします。
dmckee

私は実際には、我々は5本の指(その3奇数と可能な指の2つの偶数がある)勝利の戦略に影響を与えます...持っているか疑問に思う
オリヴィエ・デュラック

@ OlivierDulac、0も偶数です。
ピーターテイラー

このゲームルールでは、そうです。これにより、奇数の場合と偶数の場合とで同じチャンスが得られます(0 2 4 vs 1 3 5)
F. Hauri

@PeterTaylor:ありがとう、質問を読み間違えました(そして、それが重要だとは思いませんでした)。
オリビエデュラック

回答:


12

APL(34 30)

(1⍳⍨+/∘.=⍨2|⎕)⊃'ABC',⊂'no one'

説明:

  • 2|⎕:入力の行を読み取り、各数値のmod-2を取得します(リストを指定します、つまり1 0 1
  • ∘.=⍨:ベクトルの各要素をベクトルの各要素と比較し、行列を与えます
  • +/:行列の行を合計し、各要素に等しい要素数を与えます。2つが同じで、1つが異なる場合、誰が違うかを示す2 1 2場所のようなベクター1があります。それらがすべて同じだった場合、取得し3 3 3ます。
  • 1⍳⍨:の位置を見つけます1。noがある場合1、これはベクトルの長さより1つ多く、この場合はを返します4
  • ⊃'ABC',⊂'no one':指定されたインデックスの文字列を表示します。

インデックスを計算するための配列指向プログラミングの優れた使用法。
ホタル

8

Mathematica、45 43 42 41文字

f="no one"[A,B,C]〚Mod[Tr@#-#,2].{2,1,0}〛&

例:

f[{0 ,0, 0}]

誰も

f[{1, 3, 5}]

誰も

f[{2, 3, 5}]

A

f[{2, 3, 4}]

B


43 42文字の別のソリューション:

f=Mod[Tr@#-#-1,2].{A,B,C}/._+__->"no one"&


4

Befunge-98、61 50 45文字

&&&:11p+2%2*\11g+2%+:"@"+#@\#,_0"eno on">:#,_

Forsの巧妙な表現を使用して、さらにいくつかの文字を削除します。単一行(つまりUnefunge互換)になりました!ゲームに勝つまで読み取ります。@ワンショットプログラムの最後に追加します。

JSの回答のように、入力mod 2を2進数として扱い、ACのルックアップに依存し、範囲外の場合は「no one」にフォールバックします(文字が≥'A 'かどうかをテストすることにより、近くのコードをデータとして使用するには:D)。

入力行の読み取り、出力の生成、新しい入力行の読み取りなど、ゲームが決定されるまで(つまり、「誰も」ではない)バリエーション:

&2%4*&2%2*&2%++1g:" "#@-#,_0"eno on">:#,_
 CBAABC


私は答えのためにこれを魚に移植しました。私はあなたに注意しました。+1 btw
ランチャー

4

APL、30

(1+2=/2|⎕)⊃'BA'('C',⊂'no one')

構成によってシステム変数を変更することが許可されている場合、2文字を削ることができます。(具体的には、インデックスの原点⎕IOを0に変更します)

重要なビット

すべてのオッズを同じ方法で、すべての偶数を同じ方法で表す場合、ペアごとの等値演算は、4つのケースすべてを区別できます0 0。Bが勝った場合0 1、Aが勝った場合などです。

説明

2|⎕入力とmod 2の
2=/ペアごとの等式を取ります
1+インデックス1を加算します(APL配列はデフォルトで1ベースです)

'BA'('C',⊂'no one')ネストされた配列ネストされた配列
から正しい要素を選択します


3

C:88文字

残念ながら、Cはいつものように、非常に多くの不要なジャンクを必要とします。しかし、それでも、他のどの言語で書くことができ=**++b+**(++、実際には何かを意味しますか?非常に単純に崇高です。

main(int a,char**b){(a=**++b+**(++b+1)&1|2*(**b+**++b&1))?putchar(a+64):puts("no one");}

引数として3つの数字を渡すだけで、無駄になります!


これらのプリインクリメントの正確な順序は指定されていますか?私はそれが...ではなかったと思いましたが*b[1]、サイズの違いなしでそれらをetcに置き換えることができます(ただし優雅さのいくらかの損失.. :()
FireFly

Rubyの場合::s = "=**++b+**(++"Pすべての深刻さ、すごい、どうやって...どうすれば機能するのでしょうか?:O
ドアノブ

@Doorknobは非常に賢いのですが、逆参照とプリインクリメントをb代わりにインデックス付けに置き換え、条件をきれいに印刷すると、それを把握できるはずです。:D(得られる真理値表のために、ペンと紙も役立ちます)
FireFly

3

GolfScript(31文字)

~]{1&}%.$1=!?)'no one
A
B
C'n/=

非常に単純なロジック:入力モジュロ2を減らしてから、コピーをソートします。ソートされた配列の中央の項目は多数派にあるため、異なる(したがって少数派の)インデックスを探します。


3

Ruby(関数本体)、42文字

3つの数値の引数を想定するとabc

['zCBAABCz'[a%2*4|b%2*2|c%2],'no one'].min

Ruby(コマンドラインツール)、61文字

バージョン1は62文字です。

$><<["zCBAABCz"[$*.reduce(0){|i,n|i*2|n.to_i%2}],'no one'].min

しかし、ダレン・ストーンの答えを便乗することにより、バージョン2は61文字になります。

i=0;$*.map{|n|i+=i+n.to_i%2};$><<['zCBAABCz'[i],'no one'].min


2

JavaScript(ノード)、87文字

p=process.argv;console.log("ABC"[3-Math.min(x=p[2]%2*4+p[3]%2*2+p[4]%2,7-x)]||"no one")

ボールを転がすには、入力を3つの追加引数として期待します。入出力に次のパターンを使用します(/「no-one」を表します)。

  A B C  res  #
 ───────────────
  0 0 0   /   0
  0 0 1   C   1
  0 1 0   B   2
  0 1 1   A   3
  1 0 0   A   4
  1 0 1   B   5
  1 1 0   C   6
  1 1 1   /   7


2

Perl、84文字。

$x=oct"0b".join"",map{$_%2}<>=~/(\d)/g;print"",('no one','C','B','A')[$x>=4?7-$x:$x]
  • <>=~/(\d)/g 入力行を個別の数字に解析します
  • map{$_%2 このリストを取り、値mod 2(偶数または奇数)を計算します
  • oct"0b".join"", このmod値のリストを取得し、それらを文字列に結合し、8進数指定子を追加して、文字列を数値に変換します。

基本的には、真理値表を作成し、それを慎重に並べ替えて、の周りで反転演算を行うようにしました$x == 4。もしそうなら$x >=4、我々は反転をしました[$x>=4?7-$x:$x]配列にインデックスをために使用を行いました('no one','C','B','A')

それは可能な限り短いコードではありませんが、実際にはラインノイズではありません...それ自体が注目に値します。

Perl:74文字+ 3フラグ= 77、で実行 perl -anE '(code)'

s/(\d)\s*/$1%2/eg;$x=oct"0b".$_;say"",("no one","C","B","A")[$x>3?7-$x:$x]

これは、自動分割(-a)、たとえば(-E)を活用し、最終的に比較の問題点を特定することで改善されます。


なぜ>=4単純な代わりに>3'0b'.私が前に知らなかったヒントのために+1
F.ハウリ

デバッガー(> 3および> = 4)で両方を試しましたが、なぜかはわかりませんが、> = 4は機能しましたが、> 3は機能しませんでした。私もそれを説明することはできません(おそらくデバッガーが中途半端なのでしょうか?)私自身の満足にも
ジョー

両方のカウントに余分な文字が含まれているようですが、修正しました。また、フラグは文字としてカウントされます。
ドアノブ

2

Common Lisp、114 106 70文字

3つの値から、隣接する要素間のパリティの違いを表すペアを作成します。結果リストにインデックスを付けるために、それを2進数として扱います。

(defun f(a b c)(elt'(no_one c a b)(+(mod(- b c)2)(*(mod(- a b)2)2)))))

古いアルゴリズム:

(defun f(h)(let*((o(mapcar #'oddp h))(p(position 1(mapcar(lambda(x)(count x o))o))))(if p(elt'(a b c)p)"no one")))

2

Python 2、54

f=lambda a,b,c:[['no one','C'],'BA'][(a^b)&1][(a^c)&1]

1

Mathematica 100 94 89

f=If[(t=Tally[b=Boole@OddQ@#][[-1,2]])==1,{"A","B","C"}[[Position[b,t][[-1,1]]]],"no one"]&

テスト中

f[{5, 3, 1}]
f[{2, 0, 4}]
f[{0, 1, 2}]
f[{0, 1, 3}]
f[{1, 3, 0}]

「誰も」
「誰も」
「B」
「A」
「C」



1

R 67

z="no one";c("A","B","C",z,z)[match(2-sum(x<-scan()%%2),c(x,2,-1))]

面白い!これをどのようにテストできますか?何を走らせる必要がありますか(おそらくシバンですか?)
F.ハウリ

インタラクティブなRセッション(例:)を開始して、/usr/bin/R上記のコードを入力する必要があります。scan()入力のプロンプトが表示されます。たとえば、入力1[space]3[space]5[space][enter][enter]すると、対応する出力(ここではno one)が画面に出力されます。Rはここからダウンロードできます:cran.r-project.org/mirrors.html
flodel

1

C、85文字

main(int j,char**p){puts("C\0A\0B\0no one"+((**++p&1)*2+(**++p&1)^(**++p&1?0:3))*2);}

私のRubyの答えほど短くはありませんが、main残酷さを考えると、私はそれに満足しています。


1

魚-41

:&+2%2*$&+2%+:"@"+!;$!o :?#"eno on"!;ooo<

FireFlyのベファンジの答えを盗んで、魚に移植しました。これは、魚のレジスタを使用すると、一部のキャラクターを剃ることができるためです。ただし、水平if演算子がないためにいくつかの文字が失われました。

これは引数を介してパラメーターを受け取ります。

python fish.py evenodd.fish -v 2 2 2  
no one
python fish.py evenodd.fish -v 2 3 2  
B
python fish.py evenodd.fish -v 2 3 3  
A
python fish.py evenodd.fish -v 3 3 4  
C

いいね
F.ハウリ

ええと、魚ハァッ。トランポリンはありますか?もしそうなら#@...<、最後に(と同等の)を使用してcharを保存できます。ああ、あなたの現在のコードは私には42文字のように見えるので、あなたの文字数を減らしてください。:)
FireFly

@FireFlyありがとう!それは文字を保存しました、そしてあなたは正しいです、私は1によって過剰に数えられました。私のテキストエディターは最後に「col 43」と言った。しかし、もちろん、空の行のカーソルには「col 1」と表示されます。
ランチャー

1

Smalltalk、128文字

[:c|o:=c collect:[:e|e odd].k:=o collect:[:e|o occurrencesOf:e].u:=k indexOf:1.^(u>0)ifTrue:[#($a $b $c)at:u]ifFalse:['no one']]

value:コレクションで送る


1

JavaScript(ES6)/ CoffeeScript、50バイト

Fireflyの回答に従って真理値表を使用しますが、キャラクターアクセスではより直接的なアプローチを取ります。

f=(a,b,c)=>'CBAABC'[(a%2*4+b%2*2+c%2)-1]||'no one' // JavaScript
f=(a,b,c)->'CBAABC'[(a%2*4+b%2*2+c%2)-1]||'no one'  # CoffeeScript

デモ

// Translated into ES5 for browser compatibility
f=function(a,b,c){return'CBAABC'[(a%2*4+b%2*2+c%2)-1]||'no one'}

//f=(a,b,c)=>'CBAABC'[(a%2*4+b%2*2+c%2)-1]||'no one'

for(i=6;i--;)
  for(j=6;j--;)
    for(k=6;k--;)
      O.innerHTML += i + ', ' + j + ', ' + k + ' => ' + f(i,j,k) + "\n"
<pre id=O></pre>




0

2つの異なる言語の2つの異なる方法+バリエーション-> 6つの回答

この操作には基本的に2つの方法があります。

  • array ベース:3桁の2進数を作成し、配列から回答を取得する
  • count ベース:偶数と奇数をカウントし、 count == 1

Perl 71(配列ベース+バリエーション)

s/(.)\s*/$1&1/eg;$==oct"0b".$_;$==$=>3?7-$=:$=;say$=?chr 68-$=:"no one"

私の最も短いperlの1つ:

  • s/(.)\s*/$1&1/eg;以下のような文字列変換1 2 3には101
  • $==oct"0b".$_; バイナリをoctに変換(decと同じ、8未満)
  • $==$=>3?7-$=:$=;> 3operの場合7-。(そこからno one== 0)
  • say$=?chr 68-$=:"no one"そうでない場合0、値からcharを出力し、そうでない場合はprintしますno one

Perl 71(配列ベース)

s/(.)\s*/$1&1/eg;$==oct"0b".$_;say@{["no one",qw{A B C}]}[$=>3?7-$=:$=]

印刷ステップがわずかに異なります:出力は 「配列」にます。

Perl 81(カウントベース)

$c=A;map{$a[$_%2]=$c++;$b[$_%2]++}split;say$b[0]==1?$a[0]:$b[0]==2?$a[1]:"no one"

別の意味:

  • $c=A でカウンターcを初期化しAます。
  • map{$a[$_%2]=$c++;$b[$_%2]++}splitカウンタBの数偶数と奇数、1のみの店舗
  • say$b[0]==1?$a[0]:偶数カウンター== 1の 場合 また、印刷してもプレーヤーを。
  • $b[0]==2?$a[1]:偶数カウンター== 2の場合 また、奇妙なプレーヤーを印刷します。
  • :"no one"その他の印刷no one

Bash 85(アレイベース)

c=$((($1%2)<<2|($2&1)*2+($3%2)));((c>3))&&c=$((7-c));o=("no one" C B A);echo ${o[c]}

これは、私の2番目のperlバージョンに基づいています。

  • c=$((($1%2)<<2|($2&1)*2+($3%2))) インデックスを作成します。
    • $ 1%2は、最初の引数をバイナリで変換して使用します mod
    • $ 2&1は、使用して2番目の引数をバイナリに変換します and
    • << 2 左へのシフトは以下と同じ*4
    • * 2 2を乗算すると、と同じになり<<1ます。
  • ((c>3))&&c=$((7-c)) c> = 4の場合、c = 7-c。
  • o=() 配列を宣言する
  • echo ${o[c]} 配列に基づく

Bash 133(カウントベース)

a[$1&1]=A;a[$2&1]=B;a[$3&1]=C;((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))
case $b in 1)echo ${a[0]};;2)echo ${a[1]};;*)echo no one;esac
  • a[$1&1]=A;a[$2&1]=B;a[$3&1]=Cプレーヤーを変数a [even]およびa [odd]に格納します
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))偶数/奇数をbに数えます。
  • case $b in 1) echo ${a[0]} 偶数counter == 1の場合、偶数プレーヤーを印刷します
  • 2)echo ${a[1]};; case even counter == 2奇数プレイヤーの印刷
  • *)echo no one;esacその他の印刷no one

Bash 133(カウントベース)

a[$1&1]=A;a[$2&1]=B;a[$3&1]=C;((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))
((b==1))&&echo ${a[0]}||(((b==2))&&echo ${a[1]}||echo no one)

同じバージョン、代わりにbashの条件とコマンドグループを使用 case ... esac


0

ゲームメーカー言語、116

私の新しい答えは、FireFlyの式に大きく依存しています。

a[1]="no one"a[2]='A'a[3]='B'a[4]='C'return a[(3-min(b=argument0 mod 2*4+argument1 mod 2*2+argument2 mod 2,7-b)||1)]

古い 0として初期化されていない変数を使用してコンパイルされたコード183個の文字:

a=argument0 mod 2b=argument1 mod 2c=argument2 mod 2if((a&&b&&c)||(!a&&!b&&!c))return "no one" else{if((a&&b)||(!a&&!b))return "C" else{if((a&&c)||(!a&&!c))return "B" else return "A"}}

編集#1-まったく異なるコード


面白い!?私は以前この言語を知りませんでした!しかし、この言語では配列の使用が許可されているため、このコードはこのジョブで可能な最小のサイズではないようです。
F.ハウリ

@ F.Hauriはい、配列を使って短くしようとしています。
ティムテック

0

Clojure、116

(fn[& h](let[a(map #(bit-and % 1)h)](["no one"\A\B\C](+(.indexOf(map(fn[x](reduce +(map #(if(= x %)1 0)a)))a)1)1))))

0

vba、116

Function z(q,r,s)
a="A":b="B":c="C":d="no one"
z=Array(d,c,b,a,a,b,c,d)((q And 1)*4+(r And 1)*2+(s And 1))
End Function

で呼び出す?z(1,2,3)か、変数で変数に割り当てるか、q=z(1,2,3)Excel内でUDFとして使用=z(1,2,3)し、Excelの式で使用します


0

Python 3、80文字

r=int(input().replace(' ',''),2)
print(['no one','C','B','A'][7-r if r>3 else r])

注:入力は「1」[奇数]または「0」[偶数]でなければなりません。例えば:

> 1 1 0
C
> 1 1 1
no one

このチャレンジでは、入力を「スペースで区切る」必要があります。おそらく、効果的にゴルフAへの道がありsplitそしてjoinあなたはまだ(非常にスマート)を使用することができそうint(...input...)なアイデアを。?
ダレンストーン

あなたは'0b'+私が思うに、少なくともそれを削除することができますint(input(),2)
FireFly

@DarrenStone私は、文字列の編集を参照してください。代わりに置き換える使用
ダラ

@FireFlyありがとう、そうですね、答えを編集しました。「0b」が必要なPython 2でコードを最初にテストしました。
ダラ

挑戦はまた0から5までの数字を受け入れるための入力を要求する
ピーター・テイラー

0

Java、226文字

void func(int a, int b, int c){
    a = a%2;
    b = b%2;
    c = c%2;
    String out = "B";
    if((a+b+c)==0 || (a+b+c)==3)
        out = "no one";
    else if(a==b)
        out = "C";
    else if(b==c)
        out = "A";
    System.out.println(out);
}

0

C 101 96

C、おそらく最も些細な例(いくつかの三項演算):

main(int v,char** c){(v=c[1]==c[2]?c[1]==c[3]?0:3:c[1]==c[3]?2:1)?puts("no one"):putchar(v+64);}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.