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.


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.

Ł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"&


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


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


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à!


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


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

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]

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

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 .


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.


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


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”


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

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.


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

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ą


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>


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

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


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


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

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


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

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

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);}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.