Genap atau ganjil: tiga pemain

15

Ini adalah permainan tiga pemain, bermain dengan satu tangan.

Pada saat yang sama, setiap pemain menunjukkan tangannya dengan 0 hingga 5 jari terulur.

Jika semua pemain menunjukkan nomor (bahkan atau ganjil) yang sama, tidak ada pemenang. Tapi yang lain, pemain yang berbeda menunjukkan dua kemenangan lainnya.

 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

Alat yang diminta dapat menggunakan argumen (3 argumen sebagai angka antara 0 dan 5) atau STDIN (3 nilai per baris, dipisahkan oleh spasi).

Tidak perlu memeriksa input: Input tidak teratur dapat menghasilkan output yang tidak terduga.

Argumen atau nilai-nilai pada baris diberikan dari kiri ke kanan, dari pemain A ke pemain C .

Output hanya boleh berisi A, Batau C(dikapitalisasi) atau string no one(dalam huruf kecil, dengan ruang reguler).

Alat dapat berfungsi hanya sekali atau sebagai filter pada semua jalur input.

Kemenangan kode terpendek.

F. Hauri
sumber
6
Mungkin akan lebih menarik sebagai [raja-bukit]. Mainkan gamenya.
dmckee --- ex-moderator kitten
Saya bertanya-tanya bagaimana fakta kita memiliki 5 jari (jadi ada 3 jari aneh dan 2 angka genap mungkin) memengaruhi strategi kemenangan ...
Olivier Dulac
@OlivierDulac, 0 juga merupakan bilangan genap.
Peter Taylor
Dalam aturan permainan ini ya, ini membiarkan peluang yang sama untuk bahkan daripada untuk angka ganjil (0 2 4 vs 1 3 5)
F. Hauri
@ PeterTaylor: terima kasih, saya salah membaca pertanyaan (dan saya pikir itu tidak masuk hitungan).
Olivier Dulac

Jawaban:

12

APL ( 34 30)

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

Penjelasan:

  • 2|⎕: baca sebaris input, ambil mod-2 dari setiap angka (berikan daftar, mis. 1 0 1)
  • ∘.=⍨: membandingkan setiap elemen dalam vektor dengan setiap elemen dalam vektor, memberikan matriks
  • +/: jumlah baris dari matriks, memberi untuk setiap elemen berapa banyak elemen itu sama dengan. Jika ada dua yang sama dan satu berbeda, kita sekarang memiliki vektor seperti di 2 1 2mana 1menunjukkan yang berbeda. Jika semuanya sama, kita dapatkan 3 3 3.
  • 1⍳⍨: temukan posisi 1. Jika tidak ada 1, ini mengembalikan satu lebih dari panjang vektor, dalam hal ini 4.
  • ⊃'ABC',⊂'no one': tampilkan string pada indeks yang diberikan.
marinus
sumber
Bagus, penggunaan yang baik dari pemrograman berorientasi array untuk menghitung indeks.
FireFly
8

Mathematica, 45 43 42 41 karakter

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

Contoh:

f[{0 ,0, 0}]

tidak seorangpun

f[{1, 3, 5}]

tidak seorangpun

f[{2, 3, 5}]

SEBUAH

f[{2, 3, 4}]

B


Solusi lain dengan 43 42 karakter:

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

Powershell, 65

param($a,$b,$c)"@ABCCBA@"[$a%2+$b%2*2+$c%2*4]-replace"@","no one"
Danko Durbić
sumber
Terima kasih. Ini memberi saya ide untuk memperpendek naskah Rock, Paper, Scissors saya !
Iszi
4

Befunge-98, 61 50 45 karakter

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

Menggunakan ekspresi pintar Fors untuk memangkas beberapa karakter lagi. Sekarang single-line (yaitu Unefunge-compatible)! Dibaca sampai permainan dimenangkan; tambahkan @di akhir untuk program sekali pakai.

Memperlakukan input mod 2 sebagai angka biner, seperti dengan jawaban JS saya, kemudian bergantung pada pencarian untuk AC dan jatuh kembali ke 'tidak ada' jika di luar batas (dengan menguji apakah karakternya ≥'A ', yang memungkinkan saya untuk menggunakan kode terdekat sebagai data: D).

Variasi yang membaca baris input, menghasilkan output, membaca baris input baru, dll hingga permainan diputuskan (yaitu bukan 'tidak ada'):

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

FireFly
sumber
Saya mengirim ini untuk memancing jawaban saya. Saya mencatat Anda. +1 btw
Cruncher
4

APL, 30

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

Jika saya diizinkan mengubah variabel sistem dengan konfigurasi, 2 karakter dapat dicukur habis. (Secara khusus, mengubah indeks asal ⎕IOke 0)

Yang krusial

Jika kita mewakili semua peluang dengan cara yang sama dan semua dengan cara yang sama, maka operasi kesetaraan pasangan-bijaksana dapat membedakan semua 4 kasus: 0 0untuk B menang, 0 1untuk A menang, dll.

Penjelasan

2|⎕Mengambil input dan mod 2
2=/Kesetaraan berpasangan
1+Tambahkan 1 untuk pengindeksan (array APL secara default adalah 1)

'BA'('C',⊂'no one')Array bersarang Memilih
elemen yang benar dari array bersarang

TwiNight
sumber
3

C: 88 karakter

Sayangnya C, seperti biasa, membutuhkan cukup banyak sampah yang tidak perlu. Tapi tetap saja, dalam bahasa apa orang bisa menulis =**++b+**(++dan itu sebenarnya berarti sesuatu? Cukup agung.

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

Cukup berikan tiga angka sebagai argumen, dan voila!

Untuk S
sumber
Apakah urutan preincrements itu sudah ditentukan? Saya pikir itu bukan ... meskipun, Anda bisa menggantinya dengan *b[1]dll tanpa perbedaan ukuran (meskipun beberapa kehilangan keanggunan .. :()
FireFly
Dalam Ruby:: s = "=**++b+**(++"P dalam keseriusan, wow, bagaimana itu ... bagaimana itu bekerja? : O
Gagang Pintu
@ Doorknob ini sangat pintar, tetapi jika Anda mengganti dereferencing dan preincrements dengan pengindeksan b, dan cukup cetak kondisinya, Anda harus bisa mengetahuinya. : D (pena dan kertas juga membantu, untuk tabel kebenaran yang dihasilkan)
FireFly
3

GolfScript (31 karakter)

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

Logika yang sangat sederhana: kurangi input modulo 2, lalu urutkan salinan. Item tengah dari array yang diurutkan adalah dalam mayoritas, jadi cari indeks yang berbeda (dan karenanya dalam minoritas).

Peter Taylor
sumber
3

Ruby (badan fungsi), 42 karakter

Dengan asumsi 3 argumen numerik a, bdan c:

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

Ruby (alat baris perintah), 61 karakter

Versi 1 hadir di 62 karakter:

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

Tapi, dengan membonceng jawaban Darren Stone , Versi 2 turun menjadi 61 karakter:

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

Ruby, 61 karakter

w=0
$*.map{|p|w+=w+p.to_i%2}
$><<%w(no\ one C B A)[w>3?w^7:w]
Darren Stone
sumber
['no one',?C,?B,?A]== %w(no\ one C B A)(2 karakter tersimpan).
daniero
Bagus. Diterapkan itu. Terima kasih!
Darren Stone
2

JavaScript (simpul), 87 karakter

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

Untuk mendapatkan bola bergulir ... mengharapkan input sebagai tiga argumen tambahan. Manfaatkan pola berikut untuk input / output ( /mewakili "tidak ada"):

  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
FireFly
sumber
2

GolfScript, 36 35 33 karakter

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

Mengambil input seperti yang dijelaskan dari STDIN. Anda juga dapat menguji kode secara online .

Howard
sumber
2

Perl, 84 karakter.

$x=oct"0b".join"",map{$_%2}<>=~/(\d)/g;print"",('no one','C','B','A')[$x>=4?7-$x:$x]
  • <>=~/(\d)/g mem-parsing garis input menjadi digit yang berbeda
  • map{$_%2 mengambil daftar ini dan menghitung nilai mod 2 (genap atau ganjil)
  • oct"0b".join"", mengambil daftar nilai mod ini, menggabungkannya menjadi string, menambahkan specifier oktal, dan mengubah string menjadi angka.

Pada dasarnya apa yang saya lakukan adalah membuat tabel kebenaran, dan kemudian dengan hati-hati memesannya kembali sehingga saya memiliki operasi inversi $x == 4. Jadi jika $x >=4, kami melakukan inversi [$x>=4?7-$x:$x]yang kami gunakan untuk mengindeks ke dalam array('no one','C','B','A')

Ini bukan kode terpendek yang mungkin, tetapi sebenarnya bukan derau baris ... yang luar biasa dalam dirinya sendiri.

Perl: 74 karakter + 3 bendera = 77, jalankan dengan perl -anE '(code)'

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

Ini adalah peningkatan, dengan memanfaatkan autosplit (the -a), katakan (the -E), dan akhirnya mencari tahu apa yang salah dengan perbandingan.

Joe
sumber
Kenapa >=4bukannya sederhana >3? +1 untuk kiat yang '0b'.tidak saya ketahui sebelumnya
F. Hauri
Saya mencoba keduanya di debugger (> 3 dan> = 4), dan saya tidak yakin mengapa, tetapi> = 4 bekerja, tetapi> 3 tidak. Saya tidak bisa menjelaskannya (mungkin debugger borked?) Untuk kepuasan saya sendiri
Joe
Anda tampaknya memiliki char ekstra dalam kedua hal, yang saya perbaiki. Bendera juga dihitung sebagai karakter.
Gagang Pintu
2

Common Lisp, 114 106 70 karakter

Dari ketiga nilai tersebut, buat pasangan yang mewakili perbedaan paritas antara elemen yang berdekatan. Perlakukan itu sebagai nomor biner untuk diindeks ke dalam daftar hasil.

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

Algoritma yang lebih lama:

(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")))
Paul Richter
sumber
2

Python 2, 54

f=lambda a,b,c:[['no one','C'],'BA'][(a^b)&1][(a^c)&1]
TheCrypt
sumber
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"

DavidC
sumber
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
Robin Green
sumber
1

R 67

z="no one";c("A","B","C",z,z)[match(2-sum(x<-scan()%%2),c(x,2,-1))]
flodel
sumber
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.

Darren Stone
sumber
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
Cruncher
sumber
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

Paul Richter
sumber
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>

rink.attendant.6
sumber
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")
Ramchandra Apte
sumber
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")
Ramchandra Apte
sumber
0

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

There are essentially 2 way for this operation:

  • array based: Built a binary number of 3 digit, than take answer from an array
  • count based: Count even and odd, and look if there is a count == 1

Perl 71 (array based + variation)

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

One of my shortest perl:

  • s/(.)\s*/$1&1/eg; transform a string like 1 2 3 into 101
  • $==oct"0b".$_; transform binary to oct (same as dec, under 8)
  • $==$=>3?7-$=:$=; if > 3 oper 7-. (From there no one == 0)
  • say$=?chr 68-$=:"no one" if not 0, print char from value, else print no one.

Perl 71 (array based)

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

slightly different in the print step: The output is based on an 'array'.

Perl 81 (count based)

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

Different meaning:

  • $c=A Initialise a counter c with A.
  • map{$a[$_%2]=$c++;$b[$_%2]++}split Counter b count even and odd, a only store which one
  • say$b[0]==1?$a[0]: if even counter == 1 ? also print even player.
  • $b[0]==2?$a[1]: if even counter == 2 ? also print odd player.
  • :"no one" else print no one.

Bash 85 (array based)

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

This is based on my second perl version:

  • c=$((($1%2)<<2|($2&1)*2+($3%2))) make the index pos.
    • $1%2 transform first arg in binary by using mod
    • $2&1 transform second arg in binary by using and
    • <<2 shift-to-the-left is same than *4
    • *2 multiply by 2 is same than <<1.
  • ((c>3))&&c=$((7-c)) if c >= 4 then c = 7-c.
  • o=() declare an array
  • echo ${o[c]} based on array

Bash 133 (count based)

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 store player into variable a[even] and a[odd]
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++)) count even/odd into b.
  • case $b in 1) echo ${a[0]} in case even counter==1 print even player
  • 2)echo ${a[1]};; case even counter==2 print odd player
  • *)echo no one;esac else print no one.

Bash 133 (count based)

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)

Same version, using bash's condition and command group instead of case ... esac

F. Hauri
sumber
0

Game Maker Language, 116

My new answer relies heavily on FireFly's formula:

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

The old code compiled with uninitialized variables as 0, 183 characters:

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

Edit #1 - Whole different code

Timtech
sumber
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))))
omiel
sumber
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

SeanC
sumber
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
Dhara
sumber
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);
}
Anurag
sumber
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);}
tasegula
sumber