偶数或奇数:三人


15

这是一个三人游戏,一只手玩。

同时,每个玩家伸出0到5个手指来展示自己的手。

如果所有玩家都显示相同类型的(偶数或奇数)数字,则没有获胜者。但除此之外,玩家表现出不同的种类,而另外两个则获胜。

 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

请求的工具可以使用参数(3个参数为介于0和5之间的数字)或STDIN(3个值,每行,用空格分隔)。

无需检查输入:不规则的输入可能会产生意外的输出。

在线上的参数或值从玩家A玩家C从左至右给出。

输出只能包含ABC(大写)或字符串no one(小写,带有规则的空格)。

该工具只能工作一次,也可以在所有输入行上用作过滤器。

最短的代码获胜。


6
作为“山丘之王”可能会更有趣。游戏。
dmckee ---前主持人小猫,

我不知道我们有5个手指(所以可能有3个奇数和2个偶数的手指)这一事实如何影响获胜策略……
Olivier Dulac

@ OlivierDulac,0也是偶数。
彼得·泰勒

在这个游戏规则是,这让对于相同的机会甚至比为奇数(0 2 4 VS 1 3 5)
F. Hauri

@PeterTaylor:谢谢,我看错了这个问题(我不认为这会算在内)。
Olivier Dulac

Answers:


12

杀伤人员地雷(34 30)

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

说明:

  • 2|⎕:读取一行输入,取每个数字的mod-2(给出一个列表,即1 0 1
  • ∘.=⍨:将向量中的每个元素与向量中的每个元素进行比较,得到一个矩阵
  • +/:对矩阵的行求和,为每个元素提供等于多少个元素。如果有两个相同但一个不同,那么我们现在有一个向量,就像2 1 2其中1表示谁是不同的。如果它们都一样,我们得到3 3 3
  • 1⍳⍨:找到的位置1。如果不存在1,则返回的长度比向量的长度大一,在这种情况下为4
  • ⊃'ABC',⊂'no one':显示给定索引处的字符串。

很好,很好地使用了面向数组的程序来计算索引。
FireFly

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}]

一种

f[{2, 3, 4}]


另一个具有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视为二进制数,然后依靠查找AC,如果越界则退回到“ noone”(通过测试字符是否≥'A',这使我将附近的代码用作数据:D)。

读取输入行,产生输出,读取新行输入等的变化,直到决定游戏为止(即不是“没人”):

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


我把它移植到鱼上来作为我的答案。我注意到你了 +1 btw
Cruncher

4

APL,30

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

如果允许通过配置更改系统变量,则可以删除2个字符。(具体来说,将索引原点更改⎕IO为0)

关键点

如果我们用相同的方式表示所有的赔率,而用相同的方式表示所有的偶数,则成对相等的运算可以区分所有4种情况:0 0B赢,0 1A赢,等等

说明

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");}

只需传递三个数字作为参数,瞧瞧!


是否指定了这些预增量的确切顺序?我以为不是...尽管,您可以用等号替换它们,*b[1]而不会造成大小差异(尽管有些失落。.:()
FireFly 2013年

s = "=**++b+**(++"真的,在Ruby::P中,哇,那是怎么回事...甚至如何工作?:O
门把手

@Doorknob非常聪明,但是如果您用索引b来代替取消引用和预增量,并漂亮地打印一些条件,则应该可以弄清楚。:D(笔和纸也有帮助,对于生成的真值表)
FireFly 2013年

3

GolfScript(31个字符)

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

很简单的逻辑:减少输入模2,然后对副本进行排序。排序数组的中间项占多数,因此寻找一个不同的索引(因此占少数)。


3

红宝石(函数体),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

但是,通过piggy带Darren Stone的答案,第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")

为了使事情顺利进行……期望输入作为三个额外的参数。将以下模式用于输入/输出(/表示“无”):

  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

GolfScript,36 35 33个字符

~]0\{1&\.++}/'no one
C
B
A'n/.$+=

按照STDIN的说明进行输入。您也可以在线测试代码。


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值列表,将它们连接成字符串,附加八进制说明符,然后将字符串转换为数字。

基本上,我要做的是创建一个真值表,然后仔细地对其重新排序,以便在周围进行一个反转操作$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?+1的提示'0b'.,我不知道之前
F. Hauri

我在调试器(> 3和> = 4)中都尝试过,但我不确定为什么,但是> = 4有效,但> 3没有。我也无法满意地解释它(可能是调试器很烂吗?)
Joe

您似乎在这两个方面都有一个额外的字符,我已将其修复。此外,标志也算作字符。
门把手

2

普通Lisp,114 106 70个字符

从这三个值创建一对表示相邻元素之间的奇偶性差异的对。将其视为二进制数以索引到结果列表中。

(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

哈斯克尔(97)

main=interact$(["no one","A","B","C"]!!).(\x->min x$7-x).foldr(\y x->x*2+mod y 2)0.map read.words

1

R 67

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

有趣!我该如何测试?我必须跑什么(也许是shebang?)
F. Hauri

您需要启动一个交互式R会话(例如/usr/bin/R),然后输入上面的代码。scan()是提示您输入的内容:例如输入1[space]3[space]5[space][enter][enter],您将看到相应的输出(此处为no one)打印到屏幕上。您可以在此处下载R:cran.r-project.org/mirrors.html
flodel 2013年

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. Hauri 2013年

嗯,鱼。你有蹦床吗?如果是这样,也许您可​​以#@...<在末尾使用(等效于)保存一个字符。哦,对我来说,您当前的代码看起来像42个字符,因此请减少您的字符数。:)
FireFly 2013年

@FireFly谢谢!那确实节省了一个字符,你是对的,我被一个人高估了。我的文本编辑器最后说“ col 43”。但是,当然,空行上的光标会显示“ col 1”。
Cruncher

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

Python 3、115

l=[int(x)%2for x in input().split()];0if[print("ABC"[i])for i,x in enumerate(l)if l.count(x)%2]else print("no one")

0

Python 3、114

r=[0,3,2,1,1,2,3,0][int("".join(map(str,(int(x)%2for x in input().split()))),2)];print("ABC"[r-1]if r else"no one")

0

两种不同语言的两种不同方法+变体-> 6个答案

此操作本质上有两种方法:

  • array 基于:构建3位数的二进制数,而不是从数组中获取答案
  • count 基于:计算偶数和奇数,并查看是否存在 count == 1

Perl 71(基于数组+变体)

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

其中一个最短的Perl:

  • s/(.)\s*/$1&1/eg;将字符串1 2 3转换成101
  • $==oct"0b".$_; 将二进制转换为八进制(与dec相同,在8以下)
  • $==$=>3?7-$=:$=;如果> 3oper 7-。(从那里no one== 0)
  • say$=?chr 68-$=:"no one"如果不是0,则从值中打印char,否则打印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 初始化计数器ÇA
  • map{$a[$_%2]=$c++;$b[$_%2]++}split柜台b计数奇数和偶数,一个只能存储其中一个
  • say$b[0]==1?$a[0]: 如果柜台== 1?还可以打印甚至播放器。
  • $b[0]==2?$a[1]:如果柜台== 2?还打印奇数播放器。
  • :"no one"否则打印no one

重击85(基于数组)

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

这基于我的第二个perl版本:

  • c=$((($1%2)<<2|($2&1)*2+($3%2))) 使索引pos。
    • $ 1%2使用以下命令转换二进制中的第一个arg mod
    • $ 2&1通过使用二进制形式转换第二个arg and
    • << 2 左移*4
    • * 2 乘以2等于<<1
  • ((c>3))&&c=$((7-c)) 如果c> = 4,则c = 7-c。
  • o=() 声明一个数组
  • echo ${o[c]} 基于数组

重击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]} 万一偶数计数器== 1打印偶数玩家
  • 2)echo ${a[1]};; 大小写偶数计数器== 2打印奇数玩家
  • *)echo no one;esac否则打印no one

重击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. Hauri 2013年

@ F.Hauri是的,我正在尝试使用数组使其更短。
Timtech

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

挑战要求输入要“用空格分隔”。也许有一种有效地打高尔夫球的方法splitjoin所以您仍然可以使用(非常聪明的)int(...input...)想法。?
Darren Stone

您可以删除'0b'+我认为的,至少对我而言似乎多余,并且int(input(),2)似乎可以在REPL中使用。
FireFly 2013年

@DarrenStone我改用字符串替换,请参见编辑
Dhara

@FireFly谢谢,您是对的,我编辑了答案。我首先使用Python 2测试了代码,其中需要使用“ 0b”。
达拉

挑战还需要输入从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);}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.