Istnieje kilka pytań dotyczących tej grze , nawet king-of-the-Hill konkurs tutaj . Myślę jednak, że wszystkie te wyzwania i konkursy potrzebują sposobu na automatyczne określenie zwycięzcy gry. Więc:
Wyzwanie
Biorąc pod uwagę dwa dane wejściowe w zakresie ["rock", "paper", "scissors", "lizard", "spock"]
reprezentującym wybory dla gracza 1 i gracza 2, określ zwycięzcę meczu.
Zasady
[Winner] [action] [loser]
-----------------------------
scissors cut paper
paper covers rock
rock crushes lizard
lizard poisons spock
spock smashes scissors
scissors decapitates lizard
lizard eats paper
paper disproves spock
spock vaporizes rock
rock crushes scissors
Ograniczenia
- Dane wejściowe będą parą ciągów w danym zakresie (nie można użyć innych ciągów). Możesz użyć tablic znaków, jeśli chcesz, o ile reprezentują one dowolną z wymienionych wartości.
- Możesz wybrać, czy chcesz używać małych liter, wielkich liter (
"ROCK"
) czy wielbłąda ("Rock"
) dla ciągów wejściowych, o ile wybrana wielkość jest taka sama dla wszystkich danych wejściowych. - Rezultatem będzie trio wartości, które określają zwycięzcę, którym może być cokolwiek chcesz, o ile odpowiedzi są spójne. Przykład:
1
jeśli pierwsze wejście wygrywa,2
jeśli drugie wejście wygrywa,0
jeśli jest remis. A możeA
jeśli pierwsze wejście wygrywa,B
jeśli drugie wejście wygrywa,<empty string>
jeśli jest remis.
Cel
To jest golf golfowy , więc może wygrać najkrótszy program / metoda / funkcja / lambda dla każdego języka!
Testy
[Input 1] [Input 2] [Output: 1/2/0]
-----------------------------------
rock paper 2
rock scissors 1
lizard spock 1
spock rock 1
spock paper 2
rock rock 0
cake
lewą).Odpowiedzi:
Python 3 ,
685048 bajtówEDYCJA: Dzięki 3 sztuczkom od Neila i 2 od pana Xcodera
Każdy ciąg wejściowy ma odrębny czwarty znak, więc używam go do ich rozróżnienia. Jeśli ułożysz elementy w cyklu (nożyczki, papier, kamień, jaszczurka, spock), wówczas każdy element bije element bezpośrednio za nim, a element 3 spotyka się cyklicznie. Odejmujemy więc pozycje wejść w cyklu. Jeśli ta liczba to 0, to remis. Jeśli jest to 1 lub 3, to wygrana dla pierwszego gracza. W moim oryginalnym rozwiązaniu różnica cyklu indeksowałaby się do ciągu „210100”, aby rozróżnić wyniki gry. Neil w jakiś sposób zorientował się, że można to osiągnąć bez indeksowania, dodając 7 i biorąc moduł przez 3. Edycja: Pierwotnie użyłem drugiego znaku do zidentyfikowania łańcucha, ale jeśli użyjesz czwartego i odwrócisz cykl, dostaniesz ciasto. I wszyscy moglibyśmy użyć więcej ciasta.
Wypróbuj online!
Starsza wersja:
Wypróbuj online!
Orginalna wersja:
Wypróbuj online!
źródło
.index
na.find
)p
,"chaoi"
wystarczy)JavaScript (ES6), 56 bajtów
Pobiera dane wejściowe w składni curry
(a)(b)
. Zwraca,0
jeśli wygra A,1
jeśli wygra B lubfalse
remis.Próbny
Pokaż fragment kodu
W jaki sposób?
Definiujemy funkcję skrótu H () jako:
To daje:
Biorąc pod uwagę dwa wejścia i b , uważamy następujące oświadczenia:
Z (1) i (2) wywnioskujemy, czy wynik a> b powinien zostać odwrócony, aby uzyskać prawidłowego zwycięzcę, i przechowujemy tę flagę w N-tej części maski wyszukiwania.
Stąd bity:
Czytanie tego od dołu do góry i ignorowanie zer wiodących daje 1001100110 , czyli 614 po przecinku.
źródło
05AB1E , 16 bajtów
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
Używa bardzo miłego
cake
tricka od user507295źródło
Rubinowy , 36 bajtów
Zwraca,
0
jeśli pierwszy gracz wygra,1
jeśli drugi gracz wygra i2
dla remisu.Oparty na odpowiedzi user507295, ale używa wzoru matematycznego do wykonania skrótu.
a.sum
jest sumą wszystkich kodów ASCII łańcuchaa
, mod1<<16
i jest przeznaczony jako podstawowa suma kontrolna. Hash został znaleziony przy użyciu następującego kodu:To
j
dało dwie wartości, które dały odpowiedni skrót dla małych liter, mianowicie 88 i 80, z których obie dały malejącą sekwencję[3,2,1,0,4]
(lub[4,3,2,1,0]
jeśli spock jest cyklicznie od początku do końca).Jak wyjaśniono w innych odpowiedziach, hash, który daje stałą różnicę modulo 5 dla kolejnych elementów w powyższej sekwencji, jest potrzebny do działania
(h[a]-h[b])%5
formuły. Każdy element bije element 1 lub 3 miejsca po prawej stronie i przegrywa z elementem 2 lub 4 miejsca po prawej stronie.Wypróbuj online!
źródło
JavaScript (ES6),
63545349 bajtówPort mojego golfa na odpowiedź @ WhatToDo. Uwaga: fragment kodu dekoduje wynik liczbowy na coś nieco mniej nieczytelnego. Edycja: Zapisano 1 bajt dzięki @Arnauld. Zaoszczędź 4 bajty dzięki @ovs.
źródło
C, 53 bajtów
Problem ten potraktowałem jako maszynę stanu, której jest 25 stanów określonych przez dwa, pięć stanów wejściowych.
Poprzez zdefiniowanie wyników stanów w tablicy bitów. Sprawdzam wyniki wewnątrz, używając unikalnych znaczników w danych wejściowych.
Jak zauważono w innych rozwiązaniach, znaki 2, 3 i 4 są unikalne pomiędzy możliwymi danymi wejściowymi. Skoncentrowałem się na znakach 2 i 3, których używam, aby wybrać odpowiedni bit w mojej tablicy odpowiedzi.
W znaku 2 bity od 1 do 4 wyraźnie identyfikują dane wejściowe. Maskując te bity i odpowiednio przesuwając [to jest „* y & 47 >> 1”], dane wejściowe można zapisać jako 0, 1, 4, 7 lub 8. Stąd mój ciąg odpowiedzi ma 9 znaków. (oddzielne interesujące bity)
W znaku 3 bity 0, 1 i 2 wyraźnie identyfikują dane wejściowe. Maskując te bity (przesunięcie nie jest wymagane) [to jest „* x i 7”], dane wejściowe można zapisać jako 0, 1, 2, 3 lub 7. (oddzielne interesujące bity)
Łańcuch odpowiedzi można następnie obliczyć, po prostu wypełniając bity dla odpowiednich znaków.
Więc ustaw bit w char, gdzie wygrywa Y
Zatem logika jest prosta: jeśli drugi znak jest taki sam, to narysuj, w przeciwnym razie zdobądź znak ascii na podstawie drugiego znaku y i przesuń bity o trzeci znak x i dodaj jeden. To powoduje, że odpowiedzi 0 dla remisu, 1 dla x wygranej i 2 dla y wygranej.
źródło
Clojure,
130118 bajtów-12 bajtów, pozbywając się mojego dziwnego użycia
comp
.Myślałem, że jestem sprytny, ale skończyło się to naiwnością w porównaniu z innymi odpowiedziami i znacznie dłużej.
Pobiera pierwsze 2 litery każdego ciągu ruchu, pobiera kody znaków i sumuje je. Następnie odejmuje sumy, aby uzyskać
d
. Jeślid
wynosi 0, to remis (0), jeśli jest w zbiorze#{5 -16 12 -14 13 1 4 -18 2 11}
, p1 wygrywa (1), w przeciwnym razie p2 wygrywa (2).Uzyskałem „magiczne liczby”, które określają, czy P1 wygra
Która generuje listę
d
wartości dla każdego możliwego scenariusza:Następnie porównałem tabelę wygranych z tym wynikiem. Na szczęście nie było żadnych „kolizji” innych niż 0.
źródło