Çift veya tek: üç oyuncu


15

Üç kişilik bir oyun, tek elle oynamak.

Aynı zamanda, her oyuncu 0 ila 5 parmak uzatılmış olarak elini gösterir.

Tüm oyuncuların aynı türden (çift veya tek) sayı göstermesi durumunda kazanan yoktur. Ama başka oyuncu, diğer iki farklı kazancı gösteriyor.

 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

İstenen araç, bağımsız değişkenler (0 ile 5 arasında sayısal olarak 3 bağımsız değişken) veya STDIN (satır başı, boşlukla ayrılmış 3 değer) kullanabilir.

Girişi kontrol etmeye gerek yoktur: Düzensiz giriş beklenmedik çıkışlara neden olabilir.

Dan, soldan sağa doğru çizgi üzerinde Argümanlar veya değerler verilir oyuncu A'ya karşı oyuncu C .

Çıktı yalnızca içermelidir A, Bya C(büyük harfle) veya dize no one(normal boşluk, küçük harflerle).

Araç yalnızca bir kez veya tüm giriş satırlarında filtre olarak çalışabilir.

En kısa kod kazancı.


6
Tepenin kralı olarak daha ilginç olabilir. Oyunu oyna .
dmckee --- eski moderatör kedi yavrusu

5 parmağımız olduğu gerçeğini merak ediyorum (bu yüzden 3 tek ve 2 çift parmak sayısı mümkün) kazanan stratejiyi nasıl etkiliyor ...
Olivier Dulac

@OlivierDulac, 0 da çift sayıdır.
Peter Taylor

Bu oyun kuralında evet, bu tek sayılara göre bile aynı şansı veriyor (0 2 4 vs 1 3 5)
F. Hauri

@PeterTaylor: teşekkürler, soruyu yanlış okudum (ve önemli olacağını düşünmedim).
Olivier Dulac

Yanıtlar:


12

APL ( 34 30)

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

Açıklama:

  • 2|⎕: bir giriş satırı okuyun, her sayının mod-2'sini alın (bir liste vererek, yani 1 0 1)
  • ∘.=⍨: bir matris vererek vektördeki her öğeyi vektördeki her öğeyle karşılaştırın
  • +/: her bir öğeye kaç öğeye eşit olduğunu vererek matrisin satırlarını toplayın. Aynı iki farklı tane olsaydı, şimdiki gibi bir vektör var 2 1 2nerede 1farklıydı belirtir. Eğer hepsi aynı olsaydı, anlıyoruz 3 3 3.
  • 1⍳⍨: konumunu bulun 1. Hayır yoksa 1, bu durumda vektörün uzunluğundan bir tane daha döner 4.
  • ⊃'ABC',⊂'no one': verilen dizinde dizeyi görüntülemenizi sağlar.

Dizini hesaplamak için dizi odaklı programlamanın güzel, iyi kullanımı.
FireFly

8

Mathematica, 45 43 42 41 karakter

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

Misal:

f[{0 ,0, 0}]

hiç kimse

f[{1, 3, 5}]

hiç kimse

f[{2, 3, 5}]

bir

f[{2, 3, 4}]

B


43 42 karakter içeren başka bir çözüm :

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


4

Befunge-98, 61 50 45 karakterler

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

Fors'un akıllı ifadesini kullanarak birkaç karakter daha tıraş olur. Şimdi tek hatlı (yani Unefunge uyumlu)! Bir oyun kazanılana kadar okur; @tek seferlik bir program için sonuna ekleyin .

JS modumda olduğu gibi giriş mod 2'yi ikili bir sayı olarak ele alır, ardından AC aramasına dayanır ve sınırların dışına çıkarsa 'hiç kimseye' geri dönmez (karakterin 'A' olup olmadığını test ederek bana izin verir. yakındaki kodu veri olarak kullanmak için: D).

Bir girdi satırını okuyan, çıktı üreten, yeni bir girdi satırı, vb. Bir oyun kararlaştırılana kadar (yani 'hiç kimse' değil)

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


Cevabım için bunu balık tuttum. Seni not ettim. +1 btw
Cruncher

4

APL, 30

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

Sistem değişkenlerini yapılandırmayla değiştirmeme izin verilirse, 2 karakter tıraş edilebilir. (Özellikle dizin kaynağını ⎕IO0 olarak değiştirme )

Çok önemli parça

Tüm olasılıkları aynı şekilde temsil edersek ve aynı şekilde eşitlersek, çift bilge eşitlik işlemi 4 vakayı da ayırt edebilir: 0 0B kazançları, 0 1A kazançları vb.

açıklama

2|⎕Girdi ve mod 2 alır
2=/Çift yönlü eşitlik
1+İndeksleme için 1 ekleyin (APL dizileri varsayılan olarak 1 tabanlıdır)

'BA'('C',⊂'no one')İç içe dizi İç içe diziden
doğru öğeyi seçer


3

C: 88 karakter

Ne yazık ki C, her zamanki gibi, oldukça fazla gereksiz önemsiz gerektirir. Ama yine de, başka hangi dilde yazabilir =**++b+**(++ve aslında bir şey ifade eder? Oldukça basit.

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

Sadece üç sayıyı argüman olarak iletin ve voilà!


Bu ön düzenlemelerin kesin sırası belirtilmiş mi? Ben değil olduğunu düşündüm ... rağmen, *b[1]hiçbir boyut farkı için onları vb ile değiştirebilirsiniz (zerafet bazı kayıp olsa .. :()
FireFly

Ruby'de:: s = "=**++b+**(++"P tüm ciddiyetle, vay, bu nasıl ... bu nasıl çalışıyor? : O
Kapı tokmağı

@Doorknob çok zekidir, ancak kayıttan çıkarma ve önkoşulları dizinleme ile değiştirir bve koşulu biraz yazdırırsanız, bunu anlayabilmeniz gerekir. : D (sonuçta ortaya çıkan doğruluk tablosu için kalem ve kağıt da yardımcı olur)
FireFly

3

GolfScript (31 karakter)

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

Çok basit bir mantık: giriş modülü 2'yi azaltın, sonra bir kopyasını sıralayın. Sıralanan dizinin orta öğesi çoğunluktadır, bu nedenle farklı (ve dolayısıyla azınlıkta) bir dizin arayın.


3

Yakut (fonksiyon gövdesi), 42 karakter

3 sayısal argümanlar varsayarak a, bve c:

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

Ruby (komut satırı aracı), 61 karakter

Sürüm 1 62 karakterle geliyor:

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

Ancak, Darren Stone'un cevabını piggyback yaparak, Sürüm 2 61 karaktere iniyor:

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

3

Yakut, 61 karakter

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 karakter kaydedildi).
daniero

Güzel. Uyguladı. Teşekkür!
Darren Stone

2

JavaScript (düğüm), 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")

Topu yuvarlamak için ... üç ekstra argüman olarak girdi bekliyor. Giriş / çıkış için aşağıdaki kalıbı kullanır ( /"hiç kimseyi temsil etmez"):

  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 karakter

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

STDIN'den tarif edildiği gibi girdi alır. Kodu çevrimiçi olarak da test edebilirsiniz .


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 giriş satırını farklı rakamlara ayrıştırır
  • map{$_%2 bu listeyi alır ve mod 2 değerini (çift veya tek) hesaplar
  • oct"0b".join"", bu mod değerleri listesini alır, bunları bir dizeye ekler, bir sekizlik belirteç ekler ve dizeyi bir sayıya dönüştürür.

Temel olarak yaptığım şey bir doğruluk tablosu oluşturmaktı ve sonra dikkatlice yeniden sıraladı, böylece etrafta bir ters çevirme operasyonu yaptım $x == 4. Öyleyse , diziye dizine $x >=4eklerken [$x>=4?7-$x:$x]kullandığımız dönüşümü yaptık('no one','C','B','A')

Onun mümkün olan en kısa kodu değil, ama aslında hat gürültü ... kendisi ve kendisi dikkate değer.

Perl: 74 karakter + 3 bayrak = 77, ile çalıştır perl -anE '(code)'

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

Bu, otomatik dağılım (-a), (-E) diyelim ve nihayet karşılaştırma ile neyin yanlış olduğunu anlayarak bir gelişmedir.


Neden >=4sadece yerine >3? '0b'.Daha önce bilmediğim ipuçları için +1
F. Hauri

Hem hata ayıklayıcıda (> 3 ve> = 4) denedim ve neden olduğundan emin değilim, ama> = 4 çalıştı, ancak> 3 işe yaramadı. Ben de kendi memnuniyetime (muhtemelen buged hata ayıklayıcı?) Açıklayamıyorum
Joe

düzelttiğim her iki sayımda da fazladan bir karakterin varmış gibi görünüyor. Ayrıca, bayraklar karakter olarak sayılır.
Kapı tokmağı

2

Yaygın Lisp, 114106 70 karakter

Üç değerden, bitişik elemanlar arasındaki parite farkını temsil eden bir çift oluşturun. Sonuç listesine endekslemek için bunu bir ikili sayı olarak kabul edin.

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

Eski algoritma:

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

Test yapmak

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

"hiç kimse"
"hiç kimse"
"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))]

İlginç! Bunu nasıl test edebilirim?
Kaçmam gerekiyor

Etkileşimli bir R oturumu başlatmanız (örn. /usr/bin/R) Ve ardından yukarıdaki kodu girmeniz gerekir. scan()giriş için sizi isteyecek olan şey: bir örnek yazmak 1[space]3[space]5[space][enter][enter]ve ekrana karşılık gelen çıktıyı (burada no one) görürsünüz . R'yi
flodel

1

C, 85 karakter

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

Yakut cevabım kadar kısa değil ama ben bu düşüncesinden memnunum main.


1

Balık - 41

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

FireFly'ın akıl almaz cevabını çaldı ve balıklara taşıdı çünkü balıklarda kayıt kullanmak bazı karakterleri tıraş etmemize izin veriyor. Operatör olsa yatay olmaması üzerinde birkaç karakter kaybetti.

Bu, parametreleri bağımsız değişkenlerle alır.

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 güzel!
F. Hauri

Hım, balık ha. Tramboliniz var mı? öyleyse, #@...<sonunda bir karakter kaydetmek için (eşdeğerini) kullanabilirsiniz . Oh, ve şu anki kodun bana 42 karakter gibi geliyor, bu yüzden senin karakter sayısını azalt. :)
FireFly

@FireFly teşekkürler! Bu bir karakter kurtardı ve haklısın, bir kişi tarafından sayıldım. Metin düzenleyicim sonunda "col 43" dedi. Ama elbette, boş bir satırdaki imleç "sütun 1" diyor.
Cruncher

1

Smalltalk, 128 karakter

[: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:bir koleksiyonla gönder


1

JavaScript (ES6) / CoffeeScript, 50 bayt

Firefly'ın cevabına göre doğruluk tablosunu kullanır, ancak karakter erişiminde daha doğrudan bir yaklaşım alır:

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

gösteri

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

İki farklı dilde iki farklı yöntem + varyasyonlar -> 6 cevap

Bu işlem için esasen 2 yol vardır:

  • array tabanlı: Bir diziden yanıt almak yerine 3 basamaklı ikili sayı oluşturdu
  • count tabanlı: Çift ve tek sayın ve bir count == 1

Perl 71 (dizi tabanlı + varyasyon)

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

Biri benim en kısa perl:

  • s/(.)\s*/$1&1/eg;gibi bir dizeyi 1 2 3dönüştürmek101
  • $==oct"0b".$_; ikiliyi okta dönüştür (dec ile aynı, 8'in altında)
  • $==$=>3?7-$=:$=;eğer > 3oper 7-. (Oradan no one== 0)
  • say$=?chr 68-$=:"no one"değilse 0, değerden karakter yazdırın, başka yazdırın no one.

Perl 71 (dizi tabanlı)

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

baskı adımında biraz farklı: çıktı bir dayanmaktadır 'diziye' .

Perl 81 (sayıya göre)

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

Farklı anlam:

  • $c=A Bir karşı initialism c ileA .
  • map{$a[$_%2]=$c++;$b[$_%2]++}splitSayaç b bile sayımı ve garip bir kimse sadece mağaza
  • say$b[0]==1?$a[0]: eğer hatta 1 sayaç ==? hatta yazdır oyuncu .
  • $b[0]==2?$a[1]:eğer hatta 2 sayaç ==? ayrıca tek baskı oyuncu .
  • :"no one"başka yazdırın no one.

Bash 85 (dizi tabanlı)

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

Bu benim ikinci perl sürümüne dayanmaktadır:

  • c=$((($1%2)<<2|($2&1)*2+($3%2))) dizin pos.
    • $ 1% 2 kullanarak ilk argümanı ikili olarak mod
    • $ 2 & 1 kullanarak ikinci arg ikilisini kullanarak and
    • << 2 sola kaydırma ,*4
    • * 2 çarpı 2 ile aynıdır <<1.
  • ((c>3))&&c=$((7-c)) c> = 4 ise c = 7-c'dir.
  • o=() dizi bildirmek
  • echo ${o[c]} diziye göre

Bash 133 (sayıya göre)

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]=Coynatıcıyı a [çift] ve [tek] değişkenine depola
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))çift ​​/ tek saymak b.
  • case $b in 1) echo ${a[0]} hatta karşı = = 1 baskı bile oyuncu
  • 2)echo ${a[1]};; case even counter == 2 tek oyuncu yazdır
  • *)echo no one;esacbaşka yazdırın no one.

Bash 133 (sayıya göre)

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)

Aynı sürüm, bash'ın durumu ve komut grubu yerine case ... esac


0

Oyun Yapıcı Dili, 116

Yeni cevabım büyük ölçüde FireFly'nin formülüne dayanıyor:

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

Eski 0 olarak başlatılmamış değişkenlerle derlenmiş kod 183 karakterden:

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

Düzenleme # 1 - Tamamen farklı kod


İlginç!? Bu dili daha önce bilmiyordum! Ancak bu dil dizinin kullanımına izin verdiği için, bu kod bu iş için mümkün olan en küçük gibi görünmüyor.
F. Hauri

@ F.Hauri Evet, kısaltmak için diziler kullanmaya çalışıyorum.
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

excel ?z(1,2,3)ile bir değişkenle çağırma veya atama q=z(1,2,3), hatta UDF olarak kullanma =z(1,2,3)ve excel formülünüzde kullanma


0

Python 3, 80 karakter

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

Not: giriş '1' [tek] veya '0' [çift] olmalıdır. Örneğin:

> 1 1 0
C
> 1 1 1
no one

Zorluk, girdinin "boşluklarla ayrılmasını" gerektirir. Belki de etkili bir golf a yolu vardır splitve joinböylece (çok akıllı) int(...input...)fikrinizi hala kullanabilirsiniz . ?
Darren Stone

'0b'+Bence kaldırabilirsin , en azından bana gereksiz görünüyor ve sadece int(input(),2)bir REPL'de çalışıyor gibi görünüyor.
FireFly

@DarrenStone Bunun yerine bir dize kullandım, düzenlemeye bakın
Dhara

@FireFly Teşekkürler, haklısın, cevabımı düzenledim. Önce kodu '0b' gereken Python 2 ile test ettim.
Dhara

Zorluk ayrıca girdinin 0 ile 5 arasındaki sayıları kabul etmesini gerektiriyor
Peter Taylor

0

Java, 226 karakter

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, muhtemelen en önemsiz örnek (bazı üçlü operasyonlar):

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);}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.