Chẵn hoặc lẻ: ba người chơi


15

Đây là một trò chơi ba người chơi, chơi bằng một tay.

Đồng thời, mỗi người chơi cho thấy bàn tay của mình với 0 đến 5 ngón tay mở rộng.

Nếu tất cả người chơi hiển thị cùng một loại số (chẵn hoặc lẻ), không có người chiến thắng. Nhưng khác, người chơi thể hiện loại khác nhau hai chiến thắng khác.

 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

Công cụ được yêu cầu có thể sử dụng các đối số (3 đối số dưới dạng số từ 0 đến 5) hoặc STDIN (3 giá trị theo dòng, cách nhau bởi khoảng trắng).

Không cần kiểm tra đầu vào: Đầu vào không thường xuyên có thể tạo ra đầu ra không mong muốn.

Đối số hoặc giá trị trên dòng được đưa ra từ trái sang phải, từ người chơi A để chơi C .

Đầu ra chỉ phải chứa A, Bhoặc C(viết hoa) hoặc chuỗi no one(trong trường hợp thấp hơn, với một không gian thông thường).

Công cụ chỉ có thể hoạt động một lần hoặc dưới dạng bộ lọc trên tất cả các dòng đầu vào.

Mã ngắn nhất giành chiến thắng.


6
Có thể thú vị hơn với tư cách là [vua của ngọn đồi]. Chơi trò chơi.
dmckee

Tôi tự hỏi làm thế nào thực tế chúng ta có 5 ngón tay (vì vậy có 3 số lẻ và 2 số chẵn có thể) ảnh hưởng đến chiến lược chiến thắng ...
Olivier Dulac

@OlivierDulac, 0 cũng là số chẵn.
Peter Taylor

Trong quy tắc trò chơi này, vâng, điều này cho phép cơ hội tương tự thậm chí nhiều hơn cho các số lẻ (0 2 4 so với 1 3 5)
F. Hauri

@PeterTaylor: cảm ơn, tôi đã đọc sai câu hỏi (và tôi không nghĩ nó sẽ được tính).
Olivier Dulac

Câu trả lời:


12

APL ( 34 30)

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

Giải trình:

  • 2|⎕: đọc một dòng đầu vào, lấy mod-2 của mỗi số (đưa ra danh sách, nghĩa là 1 0 1)
  • ∘.=⍨: so sánh từng phần tử trong vectơ với từng phần tử trong vectơ, đưa ra một ma trận
  • +/: tính tổng các hàng của ma trận, cho mỗi phần tử có bao nhiêu phần tử bằng. Nếu có hai cái giống nhau và một cái khác nhau, thì bây giờ chúng ta có một vectơ như2 1 2 nơi 1biểu thị người khác nhau. Nếu tất cả đều giống nhau, chúng tôi nhận được 3 3 3.
  • 1⍳⍨: tìm vị trí của 1 . Nếu không có 1, cái này trả về một giá trị lớn hơn độ dài của vectơ, trong trường hợp này 4.
  • ⊃'ABC',⊂'no one': hiển thị chuỗi tại chỉ mục đã cho.

Đẹp, sử dụng tốt lập trình hướng mảng để tính toán chỉ số.
FireFly

8

Toán học, 45 43 42 41 ký tự

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

Thí dụ:

f[{0 ,0, 0}]

không một ai

f[{1, 3, 5}]

không một ai

f[{2, 3, 5}]

Một

f[{2, 3, 4}]

B


Một giải pháp khác với 43 42 ký tự:

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


4

Befunge-98, 61 50 45 ký tự

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

Sử dụng biểu cảm thông minh của Fors để loại bỏ thêm một vài ký tự. Bây giờ một dòng (tức là tương thích Unefunge)! Đọc cho đến khi một trò chơi được chiến thắng; thêm @vào cuối cho một chương trình một shot.

Xử lý mod 2 đầu vào dưới dạng số nhị phân, như với câu trả lời JS của tôi, sau đó dựa vào tra cứu AC và quay lại 'không có ai' nếu ở ngoài giới hạn (bằng cách kiểm tra xem ký tự có phải là''A 'hay không, cho phép tôi để sử dụng mã gần đó làm dữ liệu: D).

Biến thể đọc một dòng đầu vào, tạo đầu ra, đọc một dòng đầu vào mới, v.v ... cho đến khi một trò chơi được quyết định (nghĩa là không 'không ai'):

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


Tôi chuyển câu cá này cho câu trả lời của tôi. Tôi ghi nhận bạn. +1 btw
Cruncher

4

APL, 30

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

Nếu tôi được phép thay đổi các biến hệ thống theo cấu hình, có thể xóa 2 ký tự. (Cụ thể, thay đổi nguồn gốc chỉ số⎕IO thành 0)

Các bit quan trọng

Nếu chúng ta đại diện cho tất cả các tỷ lệ cược theo cùng một cách và tất cả đều phát triển theo cùng một cách, thì một hoạt động bình đẳng theo cặp có thể phân biệt cả 4 trường hợp: 0 0cho B thắng,0 1 cho A thắng, v.v.

Giải trình

2|⎕Có đầu vào và mod 2
2=/Bình đẳng cặp
1+ Thêm 1 để lập chỉ mục (mảng APL được dựa trên 1 theo mặc định)

'BA'('C',⊂'no one')Mảng lồng nhau
Chọn ra phần tử chính xác từ mảng lồng nhau


3

C: 88 ký tự

Thật không may, như mọi khi, đòi hỏi khá nhiều rác không cần thiết. Tuy nhiên, trong ngôn ngữ khác người ta có thể viết =**++b+**(++và nó thực sự có nghĩa là gì? Khá đơn giản là cao siêu.

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

Đơn giản chỉ cần vượt qua ba số làm đối số, và voilà!


Là thứ tự chính xác của những khu vực được chỉ định? Tôi nghĩ rằng đó không phải là ... mặc dù, bạn có thể thay thế chúng bằng *b[1]vv để không có sự khác biệt về kích thước (mặc dù có một số mất mát về sự thanh lịch .. :()
FireFly

Trong Ruby :: s = "=**++b+**(++"P trong tất cả sự nghiêm túc, wow, làm thế nào mà ... nó thậm chí còn hoạt động như thế nào? : O
Doorknob

@Doorknob điều đó rất thông minh, nhưng nếu bạn thay thế hội nghị và các khu vực thay thế bằng lập chỉ mục bthay vào đó và in một số điều kiện, bạn sẽ có thể tìm ra nó. : D (bút và giấy cũng giúp, cho bảng chân lý kết quả)
FireFly

3

GolfScript (31 ký tự)

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

Logic rất đơn giản: giảm modulo đầu vào 2, sau đó sắp xếp một bản sao. Mục giữa của mảng được sắp xếp chiếm đa số, vì vậy hãy tìm một chỉ mục khác (và do đó là thiểu số).


3

Ruby (cơ thể chức năng), 42 ký tự

Giả sử 3 đối số số a, bc:

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

Ruby (công cụ dòng lệnh), 61 ký tự

Phiên bản 1 có 62 ký tự:

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

Nhưng, bằng cách cõng câu trả lời của Darren Stone , Phiên bản 2 đã giảm xuống còn 61 ký tự:

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

3

Ruby, 61 ký tự

w=0
$*.map{|p|w+=w+p.to_i%2}
$><<%w(no\ one C B A)[w>3?w^7:w]

['no one',?C,?B,?A]== %w(no\ one C B A)(2 ký tự được lưu).
daniero

Đẹp. Áp dụng mà. Cám ơn!
Darren Stone

2

JavaScript (nút), 87 ký tự

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

Để có được quả bóng lăn ... mong đợi đầu vào là ba đối số bổ sung. Làm cho việc sử dụng mẫu sau cho đầu vào / đầu ra ( /đại diện cho "không ai cả"):

  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 ký tự

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

Lấy đầu vào như được mô tả từ STDIN. Bạn cũng có thể kiểm tra mã trực tuyến .


2

Perl, 84 ký tự.

$x=oct"0b".join"",map{$_%2}<>=~/(\d)/g;print"",('no one','C','B','A')[$x>=4?7-$x:$x]
  • <>=~/(\d)/g phân tích dòng đầu vào thành các chữ số riêng biệt
  • map{$_%2 lấy danh sách này và tính giá trị mod 2 (chẵn hoặc lẻ)
  • oct"0b".join"", lấy danh sách các giá trị mod này, nối chúng thành một chuỗi, nối thêm một bộ xác định bát phân và chuyển đổi chuỗi thành một số.

Về cơ bản những gì tôi đã làm là tạo ra một bảng chân lý, và sau đó cẩn thận sắp xếp lại nó để tôi có một hoạt động đảo ngược xung quanh $x == 4. Vì vậy, nếu $x >=4, chúng tôi đã thực hiện đảo ngược [$x>=4?7-$x:$x]mà chúng tôi sử dụng để lập chỉ mục vào mảng('no one','C','B','A')

Đây không phải là mã ngắn nhất có thể, nhưng thực tế nó không phải là dòng nhiễu ... rất đáng chú ý.

Perl: 74 ký tự + 3 cờ = 77, chạy với perl -anE '(code)'

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

Đây là một sự cải tiến, bằng cách tận dụng autosplit (-a), nói (-E), và cuối cùng tìm ra điều gì sai với so sánh.


Tại sao >=4thay vì đơn giản >3? +1 cho các mẹo '0b'.tôi chưa biết trước đây
F. Hauri

I tried both in the debugger ( >3 and >=4), and I am not sure why, but the >=4 worked, but >3 did not. I can't explain it (possibly borked debugger?) to my own satisfaction either
Joe

you seem to have had an extra char in both counts, which I fixed. Also, flags count as characters.
Doorknob

2

Common Lisp, 114 106 70 chars

From the three values create a pair representing difference in parity between adjacent elements. Treat that as a binary number to index into result list.

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

Older algorithm:

(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"]&

Testing

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

"no one"
"no one"
"B"
"A"
"C"


1

Haskell, 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))]

Interesting! How could I test this? What do I have to run (maybe a shebang?)
F. Hauri

You'll need to start an interactive R session (e.g. /usr/bin/R) then enter the code above. scan() is what will prompt you for the input: an example would be to type 1[space]3[space]5[space][enter][enter] and you will see the corresponding output (here, no one) printed to the screen. You can download R here: cran.r-project.org/mirrors.html
flodel

1

C, 85 chars

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

Not as short as my Ruby answer but I'm happy with it, considering the main cruft.


1

Fish - 41

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

Stole FireFly's befunge answer and ported it to fish because using registers in fish allows us to shave off some characters. Lost a few characters on not having the horizontal if operator though.

This takes parameters in through arguments.

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

Ooooooooooo nice!
F. Hauri

Hm, fish huh. Do you have trampoline? if so, maybe you could use (the equivalent of) #@...< at the end to save a char. Oh, and your current code looks like 42 chars to me, so decrement that char-count of yours. :)
FireFly

@FireFly thanks! That did save a char, and you're right, I was over counted by one. My text editor said "col 43" at the end. But of course, cursor on an empty line says "col 1".
Cruncher

1

Smalltalk, 128 characters

[: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']]

send value: with a collection


1

JavaScript (ES6) / CoffeeScript, 50 bytes

Uses the truth table as per Firefly's answer but takes a more direct approach in character access:

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

Demo

// 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

Two different method in two different languages + variations -> 6 answers

There are essentially 2 way for this operation:

  • array Dựa: Đã xây dựng một số nhị phân gồm 3 chữ số, hơn là trả lời từ một mảng
  • count dựa: Đếm chẵn và lẻ, và xem nếu có count == 1

Perl 71 (dựa trên mảng + biến thể)

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

Một trong những perl ngắn nhất của tôi :

  • s/(.)\s*/$1&1/eg;biến một chuỗi như 1 2 3thành101
  • $==oct"0b".$_; biến đổi nhị phân thành oct (giống như dec, dưới 8)
  • $==$=>3?7-$=:$=;nếu > 3hoạt động 7-. (Từ đó no one== 0)
  • say$=?chr 68-$=:"no one"nếu không 0, in char từ giá trị, in khác no one.

Perl 71 (dựa trên mảng)

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

hơi khác trong bước in: Đầu ra dựa trên một 'mảng' .

Perl 81 (tính dựa)

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

Ý nghĩa khác nhau:

  • $c=A Khởi tạo một bộ đếm c với A.
  • map{$a[$_%2]=$c++;$b[$_%2]++}splitSố lượt đếm b chẵn và lẻ, một cửa hàng duy nhất
  • say$b[0]==1?$a[0]: nếu thậm chí truy cập == 1? cũng in ngay cả máy nghe nhạc.
  • $b[0]==2?$a[1]:nếu thậm chí truy cập == 2? cũng in cầu thủ lẻ .
  • :"no one"in khác no one.

Bash 85 (dựa trên mảng)

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

Điều này dựa trên phiên bản perl thứ hai của tôi:

  • c=$((($1%2)<<2|($2&1)*2+($3%2))) làm cho chỉ số pos.
    • $ 1% 2 biến đổi đối số đầu tiên trong nhị phân bằng cách sử dụng mod
    • $ 2 & 1 biến đổi arg thứ hai trong nhị phân bằng cách sử dụng and
    • << 2 dịch chuyển sang trái là giống nhau*4
    • * 2 nhân với 2 là giống nhau <<1.
  • ((c>3))&&c=$((7-c)) nếu c> = 4 thì c = 7-c.
  • o=() khai báo một mảng
  • echo ${o[c]} dựa trên mảng

Bash 133 (tính dựa)

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]=Clưu người chơi vào biến a [chẵn][lẻ]
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))đếm chẵn / lẻ vào b.
  • case $b in 1) echo ${a[0]} trong trường hợp ngay cả bộ đếm == 1 bản in
  • 2)echo ${a[1]};; trường hợp thậm chí truy cập == 2 người chơi lẻ
  • *)echo no one;esacin khác no one.

Bash 133 (tính dựa)

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)

Cùng một phiên bản, sử dụng điều kiện và nhóm lệnh của bash thay vì case ... esac


0

Ngôn ngữ nhà sản xuất trò chơi, 116

Câu trả lời mới của tôi phụ thuộc rất nhiều vào công thức của 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)]

Các mã biên dịch với các biến chưa được khởi tạo là 0, 183 ký tự:

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

Chỉnh sửa # 1 - Toàn bộ mã khác nhau


Interesting!? I didn't know this language before! But as this language does permit the use of array, this code seem not to be the smallest possible for this job.
F. Hauri

@F.Hauri Yes, I'm trying to use arrays to get it shorter.
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

call with ?z(1,2,3) or assign to a variable with q=z(1,2,3), or even use as a UDF within excel, and use =z(1,2,3) in your excel formula


0

Python 3, 80 chars

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

Note: input must be '1' [odd] or '0' [even]. For example:

> 1 1 0
C
> 1 1 1
no one

The challenge requires the input to be "separated by spaces". Perhaps there is a way to effectively golf a split and join so you can still use your (very smart) int(...input...) idea. ?
Darren Stone

You could remove the '0b'+ I think, at least it looks redundant to me, and just int(input(),2) seems to work in a REPL.
FireFly

@DarrenStone I used a string replace instead, see edit
Dhara

@FireFly Thanks, you're right, I edited my answer. I first tested the code with Python 2, where the '0b' was needed.
Dhara

The challenge also requires the input to accept numbers from 0 to 5.
Peter Taylor

0

Java, 226 chars

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, probably the most trivial example (some ternary operations):

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);}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.