Parzysty lub nieparzysty: trzyosobowy

15

To gra dla trzech graczy, gra jedną ręką.

W tym samym czasie każdy gracz pokazuje swoją rękę z 0 do 5 palcami wyciągniętymi.

Jeśli wszyscy gracze pokazują ten sam (parzysty lub nieparzysty) numer, nie ma zwycięzcy. Ale inaczej, gracz pokazujący inny rodzaj wygrywa.

 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

Żądane narzędzie może wykorzystywać argumenty (3 argumenty jako wartości liczbowe od 0 do 5) lub STDIN (3 wartości według linii, oddzielone spacjami).

Nie trzeba sprawdzać danych wejściowych: nieregularne dane wejściowe mogą powodować nieoczekiwane wyniki.

Argumenty lub wartości na linii podana jest od lewej do prawej, od gracza A do odtwarzacza C .

Wyjście musi zawierać tylko A, Blub C(kapitalizowane) lub ciąg znaków no one(małymi literami, z regularnym przestrzeni).

Narzędzie może działać tylko raz lub jako filtr we wszystkich wierszach wejściowych.

Najkrótszy kod wygrywa.

F. Hauri
źródło
6
Może być bardziej interesujący jako [król wzgórza]. Zagraj w grę.
dmckee --- były moderator kociak
Zastanawiam się, w jaki sposób fakt, że mamy 5 palców (możliwe są 3 nieparzyste i 2 parzyste liczby palców) wpływa na zwycięską strategię ...
Olivier Dulac
@OlivierDulac, 0 jest również liczbą parzystą.
Peter Taylor,
W tej grze tak, pozwala to na takie same szanse na parzyste niż na nieparzyste liczby (0 2 4 vs 1 3 5)
F. Hauri
@PeterTaylor: dzięki, źle przeczytałem pytanie (i nie sądziłem, że to się liczy).
Olivier Dulac,

Odpowiedzi:

12

APL ( 34 30)

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

Wyjaśnienie:

  • 2|⎕: przeczytaj wiersz danych wejściowych, weź mod-2 każdej liczby (podając listę, tj. 1 0 1)
  • ∘.=⍨: porównaj każdy element w wektorze z każdym elementem w wektorze, otrzymując macierz
  • +/: zsumuj rzędy macierzy, podając dla każdego elementu, ile elementów była równa. Gdyby były dwa takie same i jeden inny, mamy teraz wektor podobny do tego, 2 1 2gdzie 1oznaczono, kto był inny. Jeśli wszystkie są takie same, otrzymamy 3 3 3.
  • 1⍳⍨: znajdź pozycję 1. Jeśli nie ma 1, to w tym przypadku zwraca o więcej niż długość wektora 4.
  • ⊃'ABC',⊂'no one': wyświetla ciąg pod danym indeksem.
marinus
źródło
Ładne, dobre wykorzystanie programowania zorientowanego na tablicę do obliczenia indeksu.
FireFly,
8

Mathematica, 45 43 42 41 znaków

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

Przykład:

f[{0 ,0, 0}]

nikt

f[{1, 3, 5}]

nikt

f[{2, 3, 5}]

ZA

f[{2, 3, 4}]

b


Inne rozwiązanie z 43 42 znakami:

f=Mod[Tr@#-#-1,2].{A,B,C}/._+__->"no one"&
alephalpha
źródło
4

Befunge-98, 61 50 45 znaków

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

Wykorzystuje sprytną minę Forsa, aby zgolić jeszcze kilka postaci. Teraz jednowierszowy (tzn. Kompatybilny z Unefunge)! Czyta do momentu wygrania gry; dodaj @na końcu, aby uzyskać program jednorazowy.

Traktuje wejściowy mod 2 jako liczbę binarną, jak w mojej odpowiedzi JS, a następnie polega na wyszukiwaniu AC i wraca do „nikogo”, jeśli jest poza boiskiem (poprzez sprawdzenie, czy znak jest ≥'A ”, co pozwala mi użyć pobliskiego kodu jako danych: D).

Odmiana, która odczytuje wiersz danych wejściowych, generuje dane wyjściowe, odczytuje nowy wiersz danych wejściowych itp., Dopóki nie zostanie podjęta decyzja o grze (tj. Nie „nikt”):

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

Robaczek świętojański
źródło
Przeniesiłem to, by wyłowić moją odpowiedź. Zauważyłem cię. +1 btw
Cruncher
4

APL, 30

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

Jeśli wolno mi zmieniać zmienne systemowe według konfiguracji, można wygolić 2 znaki. (W szczególności zmiana początku indeksu ⎕IOna 0)

Kluczowy kawałek

Jeśli reprezentujemy wszystkie szanse w ten sam sposób, a wszystkie wyrównujemy w ten sam sposób, wówczas operacja równości par może rozróżnić wszystkie 4 przypadki: 0 0dla wygranych B, 0 1dla wygranych A itp.

Wyjaśnienie

2|⎕Pobiera dane wejściowe i mod 2
2=/Równość parami
1+Dodaj 1 do indeksowania (tablice APL są domyślnie oparte na 1)

'BA'('C',⊂'no one')Zagnieżdżona tablica
Wybiera właściwy element z zagnieżdżonej tablicy

TwiNight
źródło
3

C: 88 znaków

Niestety C, jak zawsze, wymaga sporo niepotrzebnych śmieci. Ale w jakim innym języku można pisać, =**++b+**(++a to faktycznie coś znaczy? Po prostu wysublimowane.

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

Wystarczy przekazać trzy liczby jako argumenty i voilà!

Fors
źródło
Czy określono dokładną kolejność wstępnych przyrostów? Myślałem, że to nie było ... chociaż można je zastąpić *b[1]itp. Bez różnicy wielkości (choć trochę utraty elegancji .. :()
FireFly
W Ruby:: s = "=**++b+**(++"P z całą powagą, wow, jak to ... jak to w ogóle działa? : O
Klamka
@Doorknob jest bardzo sprytny, ale jeśli zamiast tego zastąpisz dereferencje i wstępną inkrementację indeksowaniem b, i całkiem dobrze wydrukujesz ten warunek, powinieneś być w stanie to zrozumieć. : D (pióro i papier również pomagają, dla wynikowej tabeli prawdy)
FireFly
3

GolfScript (31 znaków)

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

Bardzo prosta logika: zmniejsz moduł wejściowy 2, a następnie posortuj kopię. Środkowy element posortowanej tablicy jest w większości, więc poszukaj indeksu, który jest inny (a zatem w mniejszości).

Peter Taylor
źródło
3

Ruby (ciało funkcyjne), 42 znaki

Zakładając 3 numeryczne argumenty a, boraz c:

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

Ruby (narzędzie wiersza poleceń), 61 znaków

Wersja 1 ma 62 znaki:

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

Ale, odkładając odpowiedź Darrena Stone'a , wersja 2 sprowadza się do 61 znaków:

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

Ruby, 61 znaków

w=0
$*.map{|p|w+=w+p.to_i%2}
$><<%w(no\ one C B A)[w>3?w^7:w]
Darren Stone
źródło
['no one',?C,?B,?A]== %w(no\ one C B A)(zapisane 2 znaki).
daniero
Ładny. Zastosowałem to. Dzięki!
Darren Stone
2

JavaScript (węzeł), 87 znaków

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

Aby piłka się potoczyła ... oczekuje danych wejściowych w postaci trzech dodatkowych argumentów. Wykorzystuje następujący wzorzec dla wejścia / wyjścia ( /reprezentuje „nikt”):

  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
Robaczek świętojański
źródło
2

GolfScript, 36 35 33 znaków

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

Pobiera dane wejściowe zgodnie z opisem z STDIN. Możesz również przetestować kod online .

Howard
źródło
2

Perl, 84 znaków.

$x=oct"0b".join"",map{$_%2}<>=~/(\d)/g;print"",('no one','C','B','A')[$x>=4?7-$x:$x]
  • <>=~/(\d)/g analizuje linię wejściową na wyraźne cyfry
  • map{$_%2 bierze tę listę i oblicza wartość mod 2 (parzysta lub nieparzysta)
  • oct"0b".join"", pobiera tę listę wartości modów, łączy je w ciąg, dołącza specyfikator ósemkowy i konwertuje ciąg na liczbę.

Zasadniczo stworzyłem tabelę prawdy, a następnie starannie zmieniłem jej kolejność, tak że miałem operację odwracania $x == 4. Więc jeśli $x >=4zrobiliśmy inwersję[$x>=4?7-$x:$x] której użyliśmy do indeksowania w tablicy('no one','C','B','A')

To nie jest najkrótszy możliwy kod, ale tak naprawdę nie jest to szum linii ... co samo w sobie jest niezwykłe.

Perl: 74 znaków + 3 flagi = 77, biegnij z perl -anE '(code)'

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

Jest to poprawa, polegająca na wykorzystaniu funkcji autosplit (-a), powiedzmy (-E) i na końcu ustaleniu, co było nie tak z porównaniem.

Joe
źródło
Dlaczego >=4zamiast po prostu >3? +1 za wskazówki, '0b'.których wcześniej nie znałem
F. Hauri
Próbowałem obu w debuggerze (> 3 i> = 4) i nie jestem pewien dlaczego, ale> = 4 działało, ale> 3 nie. Nie mogę też tego wyjaśnić (być może zepsutego debuggera?) Dla własnego zadowolenia
Joe
Wygląda na to, że masz dodatkowy znak w obu liczbach, co naprawiłem. Flagi liczą się również jako znaki.
Klamka
2

Common Lisp, 114 106 70 znaków

Z trzech wartości utwórz parę reprezentującą różnicę w parzystości między sąsiednimi elementami. Potraktuj to jako liczbę binarną, aby zindeksować do listy wyników.

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

Starszy algorytm:

(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
źródło
2

Python 2, 54

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

Testowanie

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

„nikt”
„nikt”
„B”
„A”
„C”

DavidC
źródło
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
źródło
1

R 67

z="no one";c("A","B","C",z,z)[match(2-sum(x<-scan()%%2),c(x,2,-1))]
flodel
źródło
Ciekawy! Jak mogłem to przetestować? Co muszę uruchomić (może shebang?)
F. Hauri
Musisz rozpocząć interaktywną sesję R (np. /usr/bin/R), A następnie wprowadzić powyższy kod. scan()jest to, co poprosi cię o wprowadzenie: przykładem może być wpisanie, 1[space]3[space]5[space][enter][enter]a zobaczysz odpowiednie wyjście (tutaj, no one) wydrukowane na ekranie. Możesz pobrać R tutaj: cran.r-project.org/mirrors.html
flodel
1

C, 85 znaków

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

Nie tak krótki jak moja odpowiedź Ruby, ale cieszę się z tego, biorąc pod uwagę maincruft.

Darren Stone
źródło
1

Ryba - 41

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

Odpowiedź Stfego FireFly na befunge i przeniesienie go do ryb, ponieważ użycie rejestrów w rybach pozwala nam ogolić niektóre postacie. Straciłem kilka znaków z powodu braku poziomego, jeśli operator.

To przenosi parametry poprzez argumenty.

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
źródło
Ooooooooooo miło!
F. Hauri,
Hm, ryba huh. Czy masz trampolinę? jeśli tak, to może możesz użyć (odpowiednik) #@...<na końcu, aby zapisać znak. Aha, a twój obecny kod wygląda dla mnie na 42 znaki, więc zmniejszaj liczbę znaków. :)
FireFly
@FireFly dzięki! To uratowało chara i masz rację, jeden zostałem przeliczony. Mój edytor tekstu powiedział na końcu „col 43”. Ale oczywiście kursor w pustej linii mówi „col 1”.
Cruncher,
1

Smalltalk, 128 znaków

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

wysłać value:z kolekcją

Paul Richter
źródło
1

JavaScript (ES6) / CoffeeScript, 50 bajtów

Korzysta z tabeli prawdy zgodnie z odpowiedzią Firefly, ale przyjmuje bardziej bezpośrednie podejście do dostępu do postaci:

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

Próbny

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

lodowisko. dozorca 6
źródło
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
źródło
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
źródło
0

Dwie różne metody w dwóch różnych językach + warianty -> 6 odpowiedzi

Istnieją zasadniczo 2 sposoby tej operacji:

  • array na podstawie: Zbudowano 3-cyfrową liczbę binarną, niż pobrać odpowiedź z tablicy
  • count na podstawie: Policz parzyste i nieparzyste i sprawdź, czy istnieje count == 1

Perl 71 (oparty na tablicy + wariacja)

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

Jeden z moich najkrótszych perli:

  • s/(.)\s*/$1&1/eg;przekształć ciąg podobny 1 2 3do101
  • $==oct"0b".$_; przekształć binarny na oct (taki sam jak dec, poniżej 8)
  • $==$=>3?7-$=:$=;jeśli > 3oper 7-. (Stamtąd no one== 0)
  • say$=?chr 68-$=:"no one"jeśli nie 0, wypisz char od wartości, w przeciwnym razie wydrukuj no one.

Perl 71 (oparty na tablicy)

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

nieco inny na etapie drukowania: dane wyjściowe są oparte na „tablicy” .

Perl 81 (na podstawie liczby)

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

Inne znaczenie:

  • $c=A Zainicjuj licznik c za pomocą A.
  • map{$a[$_%2]=$c++;$b[$_%2]++}splitLicznik b count parzystych i nieparzystych, sklep który jeden tylko
  • say$b[0]==1?$a[0]: jeśli nawet licznik == 1? również wydrukować nawet odtwarzacz.
  • $b[0]==2?$a[1]:jeśli nawet licznik == 2? również drukuje nieparzysty odtwarzacz.
  • :"no one"w przeciwnym razie wydrukuj no one.

Bash 85 (oparty na macierzy)

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

Jest to oparte na mojej drugiej wersji perla:

  • c=$((($1%2)<<2|($2&1)*2+($3%2))) zrobić indeks pos.
    • 1% 2 USD przekształca pierwszy argument w plik binarny za pomocą mod
    • 2 $ i 1 przekształca drugi argument binarnie za pomocą and
    • << 2 shift w lewo jest taki sam jak*4
    • * 2 pomnożenie przez 2 jest takie samo jak <<1.
  • ((c>3))&&c=$((7-c)) jeśli c> = 4, to c = 7-c.
  • o=() zadeklaruj tablicę
  • echo ${o[c]} na podstawie tablicy

Bash 133 (na podstawie liczby)

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]=Czapisz gracza w zmiennej a [parzysty] i [nieparzysty]
  • ((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))policz parzyste / nieparzyste w b.
  • case $b in 1) echo ${a[0]} w przypadku gdy licznik parzysty == 1 wydruk parzysty odtwarzacz
  • 2)echo ${a[1]};; case even counter == 2 drukuj nieparzysty odtwarzacz
  • *)echo no one;esacw przeciwnym razie wydrukuj no one.

Bash 133 (na podstawie liczby)

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)

Ta sama wersja, zamiast warunku i grupy poleceń bash case ... esac

F. Hauri
źródło
0

Game Maker Language, 116

Moja nowa odpowiedź w dużej mierze opiera się na formule 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)]

Stary kod skompilowany z niezainicjowanych zmiennych jako 0, 183 znaków:

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

Edytuj # 1 - Cały inny kod

Timtech
źródło
Ciekawy!? Nie znałem tego języka wcześniej! Ale ponieważ ten język pozwala na użycie tablicy, ten kod nie wydaje się być najmniejszym możliwym dla tego zadania.
F. Hauri
@ F.Hauri Tak, staram się używać tablic, aby je skrócić.
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
źródło
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

wywołać ?z(1,2,3)lub przypisać do zmiennej za pomocąq=z(1,2,3) , a nawet używać jako UDF w programie Excel i używać =z(1,2,3)w formule programu Excel

SeanC
źródło
0

Python 3, 80 znaków

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

Uwaga: wejście musi mieć wartość „1” [nieparzysty] lub „0” [parzysty]. Na przykład:

> 1 1 0
C
> 1 1 1
no one
Dhara
źródło
Wyzwanie wymaga, aby dane wejściowe były „oddzielone spacjami”. Być może istnieje sposób, aby skutecznie grać w golfa, splita joinwięc nadal możesz wykorzystać swój (bardzo inteligentny) int(...input...)pomysł. ?
Darren Stone,
Możesz usunąć '0b'+Myślę, że , przynajmniej wydaje mi się zbędny i po prostu int(input(),2)wydaje się działać w REPL.
FireFly,
@DarrenStone Zamiast tego użyłem zamiany łańcucha, patrz edycja
Dhara,
@FireFly Dzięki, masz rację, zredagowałem swoją odpowiedź. Najpierw przetestowałem kod w Pythonie 2, gdzie potrzebna była „0b”.
Dhara,
Wyzwanie wymaga również danych wejściowych, aby zaakceptować liczby od 0 do 5.
Peter Taylor
0

Java, 226 znaków

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
źródło
0

C 101 96

C, prawdopodobnie najbardziej trywialny przykład (niektóre operacje trójkowe):

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
źródło