Rock Paper Scissors

21

Zaimplementuj klasyczne nożyczki z papieru kamiennego.

Warunki:

  • użytkownik wprowadzi „r”, „p” lub „s”
  • program wyświetli „r”, „p” lub „s” i wynik
  • wybór programu („r”, „p” lub „s”) musi być pseudolosowy ( patrzę na ciebie Howard )
  • wynik może być reprezentowany dowolnym znakiem do wydrukowania, zawsze powinny istnieć trzy możliwe wyniki tego, co użytkownik wprowadził (użytkownik wygrywa, przegrywa lub jest remis).
  • co się stanie, jeśli użytkownik nic nie wprowadzi lub coś innego, że „r”, „p” lub „s” nie powinny być ważne.

Musisz:

  • Podaj kod do gry w golfa.
  • Nieskluczony kod
  • Jak wywołać program
  • Przykładowy przebieg

Wybiorę odpowiedź z mniejszą liczbą postaci, jeśli remis zostanie wybrany, zostanie wybrana najbardziej głosowana odpowiedź.

Dobry golf i może być szczęście na twoją korzyść.

Będę publikować odpowiedź w języku Java.

Dla tych, którzy mieszkają w górach pod skałą:

r = kamień

p = papier

s = nożyczki

rock: wygrywa z nożyczkami, przegrywa z papierem, krawat ze skały.

papier: wygrywa do skały, przegrywa nożyczkami, krawat z papierem.

nożyczki: wygrywa na papier, przegrywa ze skałą, krawat z nożyczkami.

Obecne pozycje:

  • UN: nazwa użytkownika
  • PL: Język programowania
  • CC: liczba znaków
  • UV: Zwiększenie liczby głosów
╔══════════════════╦════════════╦══════╦════╗
║        UN        ║     PL     ║  CC  ║ UV ║
╠══════════════════╬════════════╬══════╬════╣
║ Howard           ║ GolfScript ║    6 ║ 15 ║
║ primo            ║ Perl       ║   27 ║  7 ║
║ TwiNight         ║ APL        ║   31 ║  4 ║
║ primo            ║ Perl       ║   33 ║  7 ║
║ marinus          ║ APL        ║   36 ║  5 ║
║ primo            ║ Perl       ║   38 ║  7 ║
║ primo            ║ Perl       ║   48 ║  7 ║
║ manatwork        ║ Ruby       ║   54 ║ 13 ║
║ w0lf             ║ GolfScript ║   62 ║  4 ║
║ tmartin          ║ K          ║   67 ║  2 ║
║ Abhijit          ║ Python 3   ║   74 ║  5 ║
║ beary605         ║ Python 3   ║   76 ║  4 ║
║ rlemon           ║ javascript ║   85 ║  4 ║
║ ugoren           ║ C          ║   86 ║  3 ║
║ Egor Skriptunoff ║ LUA        ║   87 ║  4 ║
║ Shmiddty         ║ javascript ║   87 ║  3 ║
║ Fors             ║ Befunge    ║  107 ║  3 ║
║ Briguy37         ║ javascript ║  117 ║  2 ║
║ Vi.              ║ Clojure    ║  129 ║  1 ║
║ Henrik           ║ C#         ║  167 ║  4 ║
║ dystroy          ║ Go         ║  169 ║  1 ║
║ Praveen          ║ javascript ║  250 ║  0 ║
║ ryan             ║ javascript ║  256 ║  1 ║
║ primo            ║ ferNANDo   ║  259 ║  5 ║
║ anakata          ║ Java       ║  259 ║  1 ║
║ epoch            ║ Java       ║  387 ║  1 ║
║ jdstankosky      ║ LOLCODE    ║ 1397 ║ 15 ║
╚══════════════════╩════════════╩══════╩════╝

Nie mogę wybrać odpowiedzi Howardsa, ponieważ była to (udana) próba zgięcia reguł, ale zmieniam je, aby były bardziej wyraźne.

Odpowiedź primo 27 znaków nie może zostać wybrana, ponieważ sama w sobie nie jest pseudolosowa

primo -p odpowiedz, pójdę z „-p będzie liczony jako 3 bajty: jeden dla -, jeden dla p, i jeszcze jeden niezbędny biały znak”.

Dzięki wszystkim, którzy odpowiedzieli, mam nadzieję, że dobrze się bawiłeś!

UWAGA: Będę próbował edytować to co drugi tydzień, aby dostosować tabelę i zmienić moją wybraną odpowiedź, jeśli ktoś pobije obecną, więc jeśli właśnie tu dotarłeś, opublikuj swoją odpowiedź, jeśli chcesz!

Jsedano
źródło
2
Możesz rozważyć dodanie klauzuli, że wszystkie wyniki - Wygrana, Przegrana, Remis - muszą być możliwe.
primo
Ponieważ jest to popularność, zdecydowałem się na LOLZ
jdstankosky
Edytowałem reguły przed przesłaniem odpowiedzi. Popularność będzie tylko rozstrzygaczem.
jsedano
1
Pfft, to już nie jest popularność? Nudny.
jdstankosky
1
@anakata Tradycyjne reguły Perlgolfa (opracowane przez samego Tona Hospela) -pbyłyby liczone jako 3 bajty: jeden dla -, jeden dla pi jeszcze jeden niezbędny biały znak . Jednak wiele innych konkursów na CG.SE liczyło każdą opcję jako jeden bajt. Zazwyczaj to autor pytania decyduje, który system honorować.
primo

Odpowiedzi:

9

APL, 31

'TWL'[1+3|-/x⍳⎕←⍞,(?3)⌷x←'rps']

x←'rps'Przypisz ciąg 'rps'dox

(?3)⌷ Wybierz losową liczbę całkowitą 1 ~ 3, wybierz ten indeks x

⍞, Przygotuj dane wejściowe użytkownika do wyboru maszyny

⎕← Wynikowy ciąg znaków

x⍳ Konwertuj na tablicę numeryczną według indexOf w x

-/ Różnica dwóch liczb

1+|3 Moduł 3 i plus 1

'TWL'[...] indeksowanie od 'TWL'

Próba

r
rp
L

Użytkownik wybiera kamień, program wybiera papier: Lose

TwiNight
źródło
42

LOLCODE, 1397

Uwaga: przesłałem to, zanim zauważyłem, że wymaganie wygranej zostało zmienione z popularności w przypadku remisu golfowego na golfa z remisem popularności.

Tak naprawdę nie ma ścisłej składni, ale jestem pewien, że jest to dopuszczalne.

HAI
    I HAS A CRAZY, LUCKY, CHALLENGE, TREAT
    I HAS YUMMY ITZ "LOL U LOZED"
    I HAS MEH ITZ "NOWAI TIED"
    I HAS GROSS ITZ "OMG U WONNED"
    I HAS BURNT ITZ "LAME"
    GIMMEH CHALLENGE
    BTW I HOPE I R TEH WINZ
    LOL CRAZY IZ BETWEEN 1 AN 3
    I HAS A SUPA ITZ A BUKKIT
    LOL SUPA'Z 1 R "ROCK"
    LOL SUPA'Z 2 R "PAPER"
    LOL SUPA'Z 3 R "SCIZZORS"
    LOL LUCKY R SUPA'Z CRAZY
    GOT CHALLENGE, WTF?
        OMG "Rock"
            GOT LUCKY, WTF?
                OMG ROCK, LOL TREAT R MEH, GTFO
                OMG PAPER, LOL TREAT R YUMMY, GTFO
                OMG SCIZZORS, LOL TREAT R GROSS, GTFO
            OIC
        OMG "Paper"
            GOT LUCKY, WTF?
                OMG ROCK, LOL TREAT R GROSS, GTFO
                OMG PAPER, LOL TREAT R MEH, GTFO
                OMG SCIZZORS, LOL TREAT R YUMMY, GTFO
            OIC
        OMG "Scissors"
            GOT LUCKY, WTF?
                OMG ROCK, LOL TREAT R YUMMY, GTFO
                OMG PAPER, LOL TREAT R GROSS, GTFO
                OMG SCIZZORS, LOL TREAT R MEH, GTFO
            OIC
        OMGWTF
            VISIBLE "WHAT U SAYZ?", LOL TREAT R BURNT
            GTFO
    OIC
        BOTH SAEM TREAT AN BURNT, O RLY?
            YARLY
                VISIBLE "YOU BURNTED MAH TREAT!"
            NOWAI
                VISIBLE SMOOSH "I GUESSED " AN LUCKY
                VISIBLE TREAT
        KTHX
KTHXBAI

Jeśli RockPaperScissors.LOLmiałoby to zostać pomyślnie wykonane jako , oto niektóre możliwe losowe wyniki:

  • Wejście: Rock- Wyjście:I GUESSED SCIZZORS U WONNED
  • Wejście: Paper- Wyjście:I GUESSED PAPER NOWAI TIED
  • Wejście: Scissors- Wyjście:I GUESSED ROCK LOL U LOZED
  • Wejście: Tuna- Wyjście:WHAT U SAYZ? YOU BURNTED MAH TREAT!
jdstankosky
źródło
6
+1 za bycie LOLKODEM. Wygląda na coś, czego powinienem się kiedyś nauczyć, tylko dla LOLz.
Iszi
23

GolfScript

n"Draw"

Powyższy kod implementuje wymaganą funkcjonalność. Dodatkowo zapewnia, że ​​gracz nigdy nie będzie zły, ponieważ (postrzegana) niesprawiedliwość strategii komputera.

Wersja bez golfa

n"Draw"

Jak wywołać program

Dane wejściowe (pojedynczy znak „r”, „p”, „s”) należy podać na STDIN, ewentualnie zakończone znakiem nowej linii.

Przykładowy przebieg

> echo r | ruby golfscript.rb rockpaperscissors.gsc
r
Draw

Objaśnienie kodu

Dla wszystkich tych, którzy nie znają GolfScript, dodam szczegółowe objaśnienie działania tego kodu. Kod zasadniczo składa się z trzech części.

### Computer's strategy ###
# The strategy used to play r/p/s. 
# The computer is so fast, it can really guess in an instance 
# what the player has played. Since the computer should 
# not play unfair, the best strategy is to always go for a 
# draw and choose the same move.
        # on the stack is player's move
        # choose to play the same -> now the computer's move is on the stack

### Fiddle with input ###
# The input may of may not be delimited by newline.
# In order to make the output readable, we'll give
# a newline here.
n       # Push a newline onto the stack

### Give the result ###
# We can skip a complicated calculation of the result
# since we chose to play draw anyways.
"Draw"  # Push the result onto the stack

# Output is printed automatically when GolfScript code terminates.

Notatki

Ponieważ nie jest to golf golfowy, ale konkurs popularności, nie wybrałem najkrótszej wersji. Może w przypadku remisu krótszy kod znokautuje moje rozwiązanie. Niemniej jednak dla osób zainteresowanych golfem istnieją następujące możliwości:

  • Postępuj tylko z odpowiednim wejściem i zmuś użytkownika do podania nowego wiersza. To uratuje jedną postać.
  • Reguły mają niewielką niedoskonałość, która pozwala uratować inną postać, wyginając reguły. Wynik zawsze można wydrukować jako „Win” - nie określono, że należy wydrukować poprawny wynik. Pamiętaj jednak, że gracze wkrótce się zdenerwują, jeśli zdecydujesz się wprowadzić program oszukiwania.
  • Format wyjściowy nie jest dobrze określony. Możemy wybrać 0jako wyjście dla losowania. Zatem najkrótszym prawidłowym programem jest kod jednoznakowy 0.
Howard
źródło
1
OK, dodałem więcej gadatliwości do zasad! Przyznaję, że popełniłem dwa błędy debiutanta.
jsedano
„Jedynym zwycięskim ruchem jest nie grać”. : P
Viezevingertjes
1
+1 za wersję bez golfa i naprawdę dobre wytłumaczenie
izlin
Sugeruję n"d", ponieważ pytanie mówiło, że wynik musi być dowolnym znakiem do wydrukowania, nie mówi nic o używaniu pełnych słów.
ender_scy6
20

Rubin: 61 54 znaków

o="rps";p o[c=rand(3)],%w{Draw Win Lose}[c.-o.index$_]

Jakoś wyjaśnione:

Cały problem sprowadza się do obliczenia następujących wyników:

  ╲ machine
h  ╲| 0 1 2
u ──┼──────
m 0 │ 0 1 2 
a 1 │ 2 0 1
n 2 │ 1 2 0

Gdzie liczby oznaczają:

  • wybór: 0 kamieni, 1 papier, 2 nożyczki
  • wynik: 0 remis, 1 wygrana, 2 przegrane

W tym celu użyłem wzoru: machine_choice - human_choice. Czasami powoduje to ujemną wartość, ale ponieważ jest używana tylko jako indeks, a ujemny indeks jest liczony do tyłu, wybierze właściwy element tablicy.

# ┌── choosable object type
# │           ┌── machine's choice numeric code
# │           │                  ┌── result type
# │           │                  │                   ┌── human's choice
# │           │          ┌───────┴───────┐           │
  o="rps";p o[c=rand(3)],%w{Draw Win Lose}[c.-o.index$_]
#           └─────┬────┘                   └─────┬────┘  
#                 └── machine's choice letter    │
#                                                └── result numeric code

Zastosowane metody (inne wówczas Fixnumoczywiste):

Nie golfowany:

object_type = "rps";
result_type = %w{Draw Win Lose}

machine_choice = rand(3)
human_choice = $_

p object_type[machine_choice]

result_code = machine_choice - object_type.index(human_choice)
p result_type[result_code]

Przykładowy przebieg:

bash-4.2$ ruby -nle 'o="rps";p o[c=rand(3)],%w{Draw Win Lose}[c.-o.index$_]'
r
"p"
"Win"
p
"p"
"Draw"
s
"p"
"Lose"
człowiek w pracy
źródło
1
Bardzo podobny do mojego. [(c-o.index($_)+3)%3]można zastąpić [c.-o.index$_]na 7 bajtów. Powinieneś również dodać dwa do swojego wyniku -nlprzynajmniej.
primo
1
Doh! To był mój pierwszy zamiar wykorzystania ujemnych indeksów. Wygląda na to, że zapomniałem spróbować tego podejścia po rozwiązaniu problemu z kolejnością operandów. Dziękuję, @primo. I jeszcze jedno dziękuję za c.wskazówkę.
manatwork
Muszę powiedzieć, że uwielbiam tę odpowiedź !!
jsedano
2
@manatwork sztuczka jest w rzeczywistości .-. Kropkowane operatory mają znacznie niższy priorytet niż ich odpowiedniki bez kropek. Na przykład a/(b+c)można zastąpić a./b+c.
primo
9

C # (167 znaków)

Moja pierwsza próba gry w golfa.

Grał w golfa

using System;class P{static void Main(string[] i){var m="rspr";var a=m[Environment.TickCount%3];Console.WriteLine(a+" "+(i[0][0]==a?"T":m.Contains(i[0]+a)?"W":"L"));}}

Nie grał w golfa

using System;

class P
{
    static void Main(string[] i)
    {
        var m = "rspr";
        var a = m[Environment.TickCount % 3];
        Console.WriteLine(a + " " + (i[0][0] == a ? "T" : m.Contains(i[0] + a) ? "W" : "L"));
    }
}

Przykładowy przebieg Aplikacja wymaga wprowadzenia pojedynczego znaku jako argumentu 1 do aplikacji albo r, salbo p.

cmd > app.exe r

Wszystkie możliwe wyniki

  • cmd > app.exe rdaje wynik r T(rock, remis)
  • cmd > app.exe rdaje wynik p L(papier, zgubiony)
  • cmd > app.exe rdaje wynik s W(nożyczki, wygrana)
  • cmd > app.exe pdaje wynik r W(rock, win)
  • cmd > app.exe pdaje wynik p T(papier, krawat)
  • cmd > app.exe pdaje wynik s L(nożyczki, zgubiony)
  • cmd > app.exe sdaje wynik r L(rock, lost)
  • cmd > app.exe sdaje wynik p W(papier, wygrana)
  • cmd > app.exe sdaje wynik s T(nożyczki, krawat)
Henrik
źródło
9

Perl 48 bajtów

$%=rand 3;print"$%
"^B,(Draw,Lose,Win)[$%-=<>^B]

Skrypt wypisuje wynik z perspektywy komputera, na przykład jeśli gracz wybierze, ra komputer wybierze s, wynikiem jest Lose. $%(Formatuj numer strony) służy do przechowywania ruchu komputera, ponieważ może zawierać tylko wartość całkowitą, która zapisuje rzutowanie int.

Nie golfowany:

# choose a random move index 0, 1, or 2
$cindex = int(rand 3);
# convert this index to a move
# 0 => r, 1 => s, 2 => p
$cmove = "$cindex" ^ B;

# read the player's move
$pmove = <>;
# convert this move to its index
$pindex = $pmove ^ B;

# print computer's move
print $cmove, $/;
# compare indices, and output result
@result = (Draw, Lose, Win);
print $result[$cindex - $pindex];

Przykładowe użycie:

$ echo p | perl rps.pl
s
Win

$ echo r | perl rps.pl
r
Draw

$ echo s | perl rps.pl
p
Lose

Skrypt można również uruchomić interaktywnie, wpisując swój ruch, a następnie Enter:

$ perl rps.pl
r
s
Lose

Rozciąganie reguł

Perl 35 +3 bajtów

$_=($%=rand 3).(D,L,W)[$%-($_^B)]^B

Wymaga -pprzełącznika wiersza poleceń (liczonego jako 3 bajty). Każdy z efektów Win, Losea Drawzostały odwzorowane na W, L, D. Nowa linia między wyborem komputera a wynikiem została wykluczona.

Przykładowe użycie:

$ echo r | perl -p rps.pl
sL

Perl 30 +3 bajtów

$_=($%=rand 3).($%-($_^B))%3^B

Jeszcze raz wymaga -p. Tutaj Win, Losea Drawzostały odwzorowane na 2, 1i 0odpowiednio. Jest to nadal technicznie zgodne, ponieważ są to znaki do wydrukowania.

Przykładowe użycie:

$ echo r | perl -p rps.pl
s1

Perl 24 +3 bajtów

$_=$^T%3 .($^T-($_^B))%3^B

Wymaga -p , WLD odwzorowane na 2, 1, 0jak wcześniej. Każdy ^Tpowinien zostać zastąpiony dosłownym znakiem ascii 20. Ten jest wprawdzie nieco rozciągnięty; $^Tzwraca liczbę sekund od epoki od uruchomienia skryptu. Wszystkie wyniki są możliwe, ale nie do końca kwalifikuje się jako pseudolosowe.

Przykładowe użycie:

$ echo r | perl -p rps.pl
s1
primo
źródło
7

APL ( 38 36)

c[i],(⌽↑⌽∘'TWL'¨⍳3)[⍞⍳⍨c←'rps';i←?3]

Wysyła „T”, „W” i „L” dla remisu, wygranej i przegranej.

Przykładowy przebieg:

      c[i],(⌽↑⌽∘'TWL'¨⍳3)[⍞⍳⍨c←'rps';i←?3]
p    
rW

(Typy użytkownika „p” dla papieru. Komputer wybiera „r” (kamień), użytkownik wygrywa)

Wyjaśnienie:

  • ⌽↑⌽∘'TWL'¨⍳3: generuje następującą macierz:
TLW
WTL
LWT
  • ⍞⍳⍨c←'rps': ustaw cna ciąg 'rps', odczytaj dane wejściowe użytkownika i uzyskaj indeks danych wejściowych użytkownika w ciągu (będzie to wartość od 1 do 3). Ten indeks jest używany jako współrzędna Y w macierzy.
  • i←?3: zdobądź losową liczbę od 1 do 3 i zapisz ją i, wybór należy do komputera. Jest to używane jako współrzędna X w matrycy.
  • c[i]: użyj ijako indeksu do c, wyświetlając wybór komputera jako „r”, „p” lub „s”.
marinus
źródło
6

ferNANDo 1184 (259 golfowych) bajtów

Tłumacz napisany w języku Python można znaleźć na dole połączonej strony.

ferNANDo jest językiem ezoterycznym, który obsługuje tylko jeden typ zmiennej, boolean i tylko jedną operację, NAND. Jak można sobie wyobrazić, może to prowadzić do dość długiej logiki do wykonywania pozornie prostych zadań. Obsługuje odczytywanie ze stdin (jeden bajt na raz), pisanie na stdout (także jeden bajt na raz), pętle warunkowe, a także losowy generator boolean.

Nie ma żadnych słów kluczowych; wszystko jest zmienną. Funkcja instrukcji zależy wyłącznie od liczby zawartych w niej zmiennych. Nie ma też komentarzy, więc dołożyłem wszelkich starań, aby kod sam się komentował. Ostatnie cztery linie mogą być nieco mylące, ale będzie to prawdopodobnie wystarczy powiedzieć, że drukuje Win!, Loselub Draww zależności od wyników.

not sure, but right now i'm guessing you're_not_paper you're_scissors
you're_paper not you're_not_paper
you're_not_scissors not you're_scissors
you're_rock you're_not_paper you're_not_scissors
you're_rock you're_rock

o_shi-
i'm_not_paper right ?
i'm_scissors right ?
i'm_paper not i'm_not_paper
i'm_not_scissors not i'm_scissors
o_shi- i'm_paper i'm_scissors
o_shi- o_shi-
o_shi-
i'm_rock i'm_not_paper i'm_not_scissors
i'm_rock i'm_rock

print right now but only if i'm_not_paper i'm_scissors
print a newline here, not more, not less

i_win_if i'm_scissors you're_paper
or_if i'm_rock you're_scissors
or_even_if i'm_paper you're_rock

i_win i_win_if or_if
i_win i_win
i_win or_even_if

i_lose_if i'm_paper you're_scissors
or_if i'm_scissors you're_rock
or_even_if i'm_rock you're_paper

i_lose i_lose_if or_if
i_lose i_lose
i_lose or_even_if

i_don't_win not i_win
i_don't_lose not i_lose
we_tie i_don't_win i_don't_lose
we_tie we_tie
we_don't_tie not we_tie

print now if i_win i_lose not i_win i_win
print but not we_tie we_don't_tie i_lose i_don't_win we_don't_tie
print right now i_lose i_win i_win we_don't_tie i_don't_win
print i_don't_win but we_tie or i_don't_win we_tie now

Skrypt można uruchomić interaktywnie, wpisując swój ruch, a następnie Enter.

Przykładowe użycie (zakładając, że nazwałeś tłumacza nand.py):

$ python nand.py rps.nand
p
s
Win!

$ python nand.py rps.nand
r
r
Draw

$ python nand.py rps.nand
s
p
Lose

Edycja: Aby udowodnić, że ferNANDo może konkurować z Javą, oto wersja „golfowa” o wielkości 259 bajtów . Logika jest wyraźnie inna; sprawdza not wini not tie, co oszczędza kilka bramek NAND (ponieważ wtedy potrzebuję tylko notwersji ruchów gracza i ponieważ not losenie było to wymagane do wyjścia). Jednak nie tak interesujące do przeczytania.

1 _ _ _ _ _ _ A b
B 1 b
C A B
o
P 1 ?
s 1 ?
p 1 P
S 1 s
o p s
o o
o
r P S
r r
0 1 1 1 0 0 P s
0 0 0 0 1 0 1 0
t s A
u r B
v p C
W t u
W W
W v
t p A
u s B
v r C
D t u
D D
D v
w 1 W
d 1 D
l W D
l l
0 1 0 w l 1 w w
0 1 1 d D l W D
0 1 1 l w w D W
0 W 1 d 0 W d 1
primo
źródło
2
HAHAHA o_shi- o_shi- o_shi-To było przezabawne komentowanie.
jdstankosky
1
@ jdstankosky może trochę przesadziła z rzuceniem q, ale robi rozsądną rzecz i wraca.
primo
5

Python 3.x: 74 znaków

import time
A,f="psr",time.gmtime()[5]%3
print(A[(A.find(input())+f)%3],f)

Jak to działa

Before Machine Proceeds it determines the outcome of the game and based 
on the outcome, it determines the choice which would result in the outcome
viz Human's choice


\     Outcome
 \    0  1  2
  \_____________
H  | 
U 0|  0  1  2
M 1|  1  2  0
A 2|  2  0  1
N  |

Where Choices are represented as 
0 --> Paper
1 --> Scissor
2 --> Rock

Outcome (From Computer's Perspective)
0 --> Draw
1 --> Win
2 --> Fail

Given the sequence of choices as a string
"psr"
So its easy to see, if computer needs to win, it needs to choose the character
next to what human chooses. 
If computer needs to loose, it needs to choose the previous character to what
human chooses


MACHINE's|      CHOICES    |  Formulation
FATE     |-----------------|  For Machine's
         |  P     S      R |  Choice
---------|-----------------|-----------------------------
WIN(1)   |        H ---> M | (CHOICE+1) % 3 = (CHOICE+WIN)%3 
---------|-----------------|-----------------------------
LOSS(2)  |  M     H -----\ | (CHOICE+2)%3   = (CHOICE+LOSS)%3 
         |  ^            | |
         |  |____________| |
---------|-----------------|------------------------------       
DRAW(0)  |        H        | (CHOICE+0)%3   = (CHOICE+DRAW)%3
         |        M        |  
---------|-----------------|         

Combining all the above we have

MACHINE's CHOICE = (HUMAN CHOICE + MACHINE's FATE) % 3

Na podstawie losu określa, jaki powinien być jego wybór na podstawie formuły

result = (User_choice + machines_fate) % no_of_choices

machine_choice = "psr"[result]

Wersja bez gry w golfa

import time
choices = "psr"
#time.gmtime() returns the time structure in gmt
#time.gmtime()[5] is the current second tick
fate = time.gmtime()[5]%3
user_choice = input()
result = (choices.find(user_choice)+fate)%len(choices)
machine_choice = choices[result]
print(machine_choice, fate)

Przykładowy przebieg

D:\temp\rivalry>rps.py
r
r 0

D:\temp\rivalry>rps.py
r
p 1

D:\temp\rivalry>rps.py
p
r 2

D:\temp\rivalry>rps.py
p
r 2

D:\temp\rivalry>rps.py
p
s 1

D:\temp\rivalry>rps.py
p
s 1

D:\temp\rivalry>rps.py
p
p 0
Abhijit
źródło
2
ciekawe, wcześniej decydując o wyniku, a następnie rzucając dowolny znak, aby uzyskać ten wynik ...
akolita
1
Nie jestem pewien, czy czas w sekundach kwalifikuje się jako „wybór programu („ r ”,„ p ”lub„ s ”) musi być pseudolosowy” . Prawdopodobnie milisekundy.
primo
4

Lua, 87

c,n=os.time()%3+1,'rps'print(n:sub(c,c),({'Draw','Win','Defeat'})[(n:find(...)-c)%3+1])

Stosowanie:

$ lua rps.lua p
s   Defeat

Nie golfowany:

names = 'rps'
comp_idx = os.time()%3 + 1                -- 1, 2 or 3 (depends on timer)
comp_move = names:sub(comp_idx, comp_idx) -- 'r', 'p' or 's'
user_move = ...                           -- input parameter: 'r', 'p' or 's'
user_idx = names:find(user_move)          -- 1, 2 or 3
delta_idx = (user_idx - comp_idx) % 3     -- 0, 1 or 2
all_results = {'Draw', 'Win', 'Defeat'}   -- [1]=='Draw', [2]=='Win', [3]=='Defeat'
game_result = all_results[delta_idx + 1]
print(comp_move, game_result)
Egor Skriptunoff
źródło
Możesz zapisać 3 postacie, używając „Przegrać” zamiast „Pokonaj” i „Remis” zamiast „Remis”. ;)
Roddy z mrożonego groszku,
4

GolfScript 62

Alternatywne rozwiązanie GolfScript, o wiele bardziej nudne niż Howarda :).

Program wybiera ruch losowo i wyświetla wynik z perspektywy użytkownika.

Kod

'rssppr'.[6rand=]''+:§@+..&,({?)§\'Lose''Win'if}{;;§'Draw'}if`

Przykładowy przebieg

> echo | ruby golfscript.rb rps.gs

r „Stracić”

Test online

Możesz uruchomić program i eksperymentować z różnymi danymi wejściowymi tutaj: http://golfscript.apphb.com/?c=OydzJwoKJ3Jzc3BwcicuWzZyYW5kPV0nJys6wqdAKy4uJiwoez8pwqdcJ0xvc2UnJ1dpbidpZn17EzFD

Zauważ jednak, że parametr (ruch użytkownika), który zwykle jest przekazywany w wierszu poleceń, jest teraz dodawany do stosu w samym kodzie (nie ma możliwości podania „rzeczywistych” parametrów wiersza poleceń w tym narzędziu online).

Wersja „bez golfa”

Nie mam pojęcia, co ungolfed środki, jeśli chodzi o GolfScript, więc próbowałem dodawać komentarze. Mamy nadzieję, że wyjaśni to działanie kodu i uczyni go nieco bardziej czytelnym:

# initially, the input (user's move) is on the stack

'rssppr'                # push the string 'rsspr' on the stack...
.                       # ...twice.

[
    6rand               # get a pseudo-random integer in the [0-5] range
    =                   # use the random index to get 
                        # a letter from the string above

]''+                    # workaroud to get the actual letter instead of the
                        # ASCII code

:§                      # assign the randomly chosen letter (computer's move)
                        # to a nice variable called "§"

@                       # rotates last 3 elements on the stack, bringing
                        # the user input in the uppermost position
                        # So, now we have: "rssppr" <computer_move> <user_move>
                        # on the stack

+                       # concatenate the two moves, so now we have a string
                        # that contains both (ex: "rs")

..                      # copy the move string twice
&                       # do a setwise AND to get the DISTINCT elements
,(                      # get the length of the resulting string and subtract 1
                        # (now we have 0 if the letters were equal and non-zero otherwise)

{                       # beginning of block to execute when the moves are different:

                        # now we have on the stack two strings:
                        #     - the string 'rssppr'
                        #     - the string containing the moves (ex: 'rs')

    ?                   # find the second string inside the first one,
                        # and get the index at which it occurs
                        # (or -1 if it does not)

    )                   # increment that number (we now get 0 if no occurrence, 1 otherwise)

    §                   # recall the § variable (so we display the computermove)
    \                   # rotate the uppermost two stack entries

    'Lose''Win'if       # if the move pair is found in the 'rssppr' string, 
                        # then print 'Lose', otherwise print 'Win'
}

{                       # beginning of block to execute when the moves are identical:

    ;;                  # discard the latest two stack items (not needed in this case)
    §                   # display computer's move
    'Draw'              # display the text 'Draw'
}
if                      # if computer's and user's moves were NOT equal, 
                        # execute the first block.
                        # if they were, execute the second block

`                       # put the last word in quotes to separate it from computer's move
Cristian Lupascu
źródło
4

C, 92 86 znaków

main(y){
    srand(time(0));
    y="rps"[rand()%3];
    printf("%c%c\n",y,"LWWTLLW"[getchar()-y+3]);
}

Drukuje wybór komputera i wynik z punktu widzenia użytkownika - W = wygrywasz, L = przegrywasz, T = remis.
Prosta formuła x-y, biorąc pod uwagę wartości ASCII wyborów, daje 0 przy losowaniu (oczywiście) i niepowtarzalną wartość w każdym innym przypadku.

ugoren
źródło
4

Python 2 ( 86 84 80 78), Python 3-76 znaków

0 - remis, 1 - przegrana, 2 - wygrana

from random import*
a=raw_input()
b=choice('psr')
print(a!=b)+(b+a in'rpsr'),b

from random import*
a=input()
b=choice('psr')
print((a!=b)+(b+a in'rpsr'),b)

Nie golfił

from random import*
moves = 'psr'
inp   = raw_input()
comp  = choice(moves)
match = comp+inp
is_not_tie = inp!=comp
wins = 'r' + moves         #rpsr; rock beats scissors, scissors beats paper, paper beats rock
print is_not_tie + (match in wins), comp

Jak uruchomić: python file_name_here.py

Problemy:
AI komputera: 35 znaków

beary605
źródło
1
Miły! Nie sądzę, żebyś Ajednak potrzebował i możesz uratować kolejny znak from random import*.
grc 10.04.13
@grc: dziękuję, nie próbowałem from random, bo myślałem, że to nie zmieniło ...
beary605 10.04.13
Możesz rozebrać kolejne 2 znaki, zmieniając (a == b) * 2 na (a! = B) i zmieniając wyniki na „0-remis, 1-wygrana, 2-przegrane”
Dhara
Przepraszam, oznaczało „0-remis, 1-przegrany, 2-wygrany”
Dhara,
@Dhara: Dzięki, nie wymyśliłbym tego. manatwork: Oh! Naprawię to.
beary605 10.04.13
4

Najpierw spróbuj bez recenzowania innych.

grał w golfa: 107 85 bajtów

i=prompt(),c="rps"[new Date%3],w={r:"s",p:"r",s:"p"};alert(c+(i==w[c]?2:w[i]==c?1:3))

wyjście to [npc-wybór] [1: wygrana, 2: przegrana, 3: remis]

bez golfa:

var input = prompt(),
    choices = ["r","p","s"],
    computer_choice = choices[Math.floor(Math.random() * 3)],
    outcomes = {'r':'s','p':'r','s':'p'},
    winner;

    if( input == outcomes[computer_choice] ) {
        winner = 'NPC';
    } else if ( computer_choice == outcomes[input] ) {
        winner = 'You';
    } else {
        winner = 'No one, it was a Tie!';
    }

    alert('Computer chose: ' + computer_choice + '\n' +
          'The winner is: ' + winner);
Rlemon
źródło
4

PowerShell: 144 133 117 111 92 73

Zmiany w stosunku do oryginału:

Mówiąc wszystko, prawie skróciłem długość o połowę z mojej oryginalnej odpowiedzi!

Kod do gry w golfa:

$p=($s='rps').IndexOf((read-host));$s[($c=Random 3)];"TWLLTWWLT"[$p+$c*3]

Można uruchomić bezpośrednio z konsoli.

Niegolfowany, z komentarzami:

# Variable $p will store the player's selection as a ternary digit by finding its position in a string containing the possible choices.
$p=(
    # Possible choices will be stored in a variable, $s, for later reuse.
    $s='rps'
# Get the position of the player's choice from $s.
).IndexOf((read-host));

# Express the computer's choice by outputting the appropriate character from $s.
$s[(
    # Computer's choice will be stored as a ternary digit in $c.
    $c=Random 3
)];

# Outcome for the player will be chosen from a string of possible outcomes by looking up the decimal repesentation of a two-digit ternary number.
# The threes digit is represented by $c, ones digit by $p.
"TWLLTWWLT"[$p+$c*3]

# Variable cleanup - do not include in golfed code.
rv p,s,c

Niektóre próbki działają na konsoli:

wprowadź opis zdjęcia tutaj

Iszi
źródło
3

JAVA 259 :(

class c {public static void main(String[]a){char y=a[0].charAt(0);char m="rps".charAt(new java.util.Random().nextInt(3));if(y==m)a[0]="T";else if((y=='r'&& m=='s')||(y=='s'&& m=='p')||(y=='p'&& m=='r'))a[0]="1";else a[0]="0";System.out.println(m+":"+a[0]);}}

Kod wysoce nie golfowy:

class c {
    public static void main(String[] a) {
        char y = a[0].charAt(0);
        char m = "rps".charAt(new java.util.Random().nextInt(3));
        if (y == m) {
            a[0] = "T";
        } else if ((y == 'r' && m == 's') || (y == 's' && m == 'p') || (y == 'p' && m == 'r')) {
            a[0] = "1";
        } else {
            a[0] = "0";
        }
        System.out.println(m + ":" + a[0]);
    }
}

Przykładowe przebiegi:

C:> java cr

s: 1

C:> java cp

p: T

C:> java cs

s: T

Jsedano
źródło
3

Befunge: 107 znaków

~v@,"w"<   <   <  <
v?v3.14159265@,"l"<
"""358979323846>3-|
rps26433832>:1+|
"""7950>:2+|
>>>:,-:|
28@,"t"<

Nieznacznie niezgrabny. Można go zmniejszyć, pytanie o to, ile.

Fors
źródło
3

JavaScript (87)

Gra w golfa:

o='LDW'[2*((a=prompt())+(b='prs'[new Date%3])!='ps'&a<b|a+b=='sp')+ +(a==b)];alert(b+o)

Nie golfowany:

var player = prompt(), 
    computer = 'prs'[new Date%3], // Date mod 3 "pseudo-random"
    outcome = 'LDW'[2*(player+computer != 'ps' 
                    & player < computer 
                    | player + computer == 'sp') // convert boolean W/L outcome to int (0,2)
              +
              +(player == computer)]; // convert D outcome to int (0,1)
alert(computer + outcome);

Możesz po prostu wkleić kod w konsoli javascript przeglądarki, aby go uruchomić.

Jeśli mogę wydrukować wynik przed wydrukowaniem wyboru komputera (83) :

alert('LDW'[2*((a=prompt())+(b='prs'[new Date%3])!='ps'&a<b|a+b=='sp')+ +(a==b)]+b)
Shmiddty
źródło
2

K, 67

{-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}

Drukuje W, L, D dla wygranej / przegranej / remisu.

Nie golfowany:

rps:{[x]
    res:x,*1?"rps";        // join user input to random selection of r,p,s
    -1'f;                  // print the user input and the program selection to stdout
    wins:("pr";"rs";"sp"); // the universe of winning combinations
    losses:|:'wins;        // reverse each win to the get losses

    $[f in wins;    
        "win";
    f in losses;
        "lose";
    "draw"]
    }

Lub w Q, który jest bardziej czytelny:

rps:{[x]
    res:x,rand["rps"];        // join user input to random selection of r,p,s
    -1 each f;                // print the user input and the program selection to stdout
    wins:("pr";"rs";"sp");    // the universe of winning combinations
    losses:reverse each wins; // reverse each win to the get losses

    $[f in wins;    
        "win";
    f in losses;
        "lose";
    "draw"]
    }

Przykładowy przebieg:

k){-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}"r"
r
s
"W"
k){-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}"s"
s
s
"D"
k){-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}"p"
p
s
"L"
tartin
źródło
2

JavaScript, 117 znaków

Oto podejście problemu oparte na danych. Prawdopodobnie można to zoptymalizować, generując dane wygranej / przegranej / losowania zamiast ręcznie mapować, ale to jest początek :)

Gra w golfa:

alert((r=[{v:"r",r:d="D",p:w="W",s:l="L"},{v:"p",r:l,p:d,s:w},{v:"s",r:w,p:l,s:d}][Math.random()*3|0]).v+r[prompt()])

Nie golfowany:

//Output the result to the user
alert(
    (
        //Store the random computer outcome data
        randomRPSData =
            //Create the data for if the computer chooses r, p, or s
            [
                {
                    value: "r",
                    r: (d = "Draw"),
                    p: (w = "Win"),
                    s: (l = "Lose")},
                {
                    value: "p",
                    r: l,
                    p: d,
                    s: w},
                {
                    value: "s",
                    r: w,
                    p: l,
                    s: d}
            ]
            //Have the computer pick a random variable
            [Math.random() * 3 | 0]

    //Output the value the computer chose
    ).value

    //Output whether the user won or not
    + r[prompt()]
);

Wreszcie, oto skrzypce z obu.

Briguy37
źródło
1

JavaScript: 256

grał w golfa:

i=prompt(),a=['p','r','s'];a=a[Math.floor(Math.random()*(3-1+1))+1];if(i==a){alert('d');}else if(i=='p'){if(a=='s'){alert('l');}else{alert('w');}}else if(i=='r'){if(a=='s'){alert('w');}else{alert('l');}}else if(i=='s'){if(a=='r'){alert('l');}else{alert('w')}}

bez golfa:

i=prompt(),a=['p','r','s'];
a=a[Math.floor(Math.random()*(3-1+1))+1];
if(i==a){
    alert('d');
}
else if(i=='p'){
    if(a=='s'){
        alert('l');
    }else{alert('w');}
}else if(i=='r'){
    if(a=='s'){
        alert('w');
    }else{alert('l');}
}else if(i=='s'){
    if(a=='r'){
        alert('l');
    }else{alert('w')}
} 
Ryan
źródło
1

Clojure:

(def r 0) (def s 1) (def p 2)
(def object-name #(get {'p "Paper", 's "Scissors", 'r "Rock"} %))
(def result-name #(get {\d "Draw", \w "Win", \l "Lose"} %))
(defn computer-choice [] (nth ['r 's 'p] (int (rand 3))))
(defn game [a b] (get "dwlldwwld" (+ (* 3 a) b) ))
(defn print-game [user comp result] (print (format
  "User: %s\nComputer: %s\nResult: %s\n" 
  (object-name user) (object-name comp) (result-name result))))
(println "Enter 'p', 's' or 'r' and press return")
(let [comp (computer-choice),  user (read)]  (print-game user comp (game (eval user) (eval comp))))

Wersja mini (129 znaków kodowych):

java -jar clojure.jar -e \
"(def r 0)(def s 1)(def p 2)(let[u(read),c(nth['r 's 'p](int(rand 3)))](print c)(print (get \"dwlldwwld\"(+(* 3(eval u))(eval c)))))"
Vi.
źródło
1

JAVA (387) pierwszy kod golfa!

import java.util.HashMap;public class _ {public static void main(String i[]){HashMap l = new HashMap(){{put('r',0);put('p',1);put('s',2);put(0,'T');put(1,'L');put(2,'W');}};char u =i[0].charAt(0);char c ="rps".charAt((int)(Math.random()*3)%3);int[][] m =new int[][]{{0,1,2},{2,0,1},{1,2,0}};System.out.println("U"+u+"C"+c+"R"+(Character)l.get(m[(Integer)l.get(u)][(Integer)l.get(c)]));}}

Nie golfił

import java.util.HashMap;
public class _ {
    public static void main(String[] input) {
       input = new String[] {"s"};
       HashMap lookup = new HashMap(){{
           put('r', 0);
           put('p', 1);
           put('s', 2);
           put(0, 'T');
           put(1, 'L');
           put(2, 'W');
       }};
       char user = input[0].charAt(0);
       char computer = new char[] {'r', 'p', 's'}[(int)(Math.random()*3)%3];
       int[][] matrix = new int[][] {{0,1,2}, {2,0,1}, {1,2,0}};

       Integer userChoice = (Integer) lookup.get(user);
       Integer computerChoice = (Integer) lookup.get(computer);
       Character result = (Character) lookup.get(matrix[userChoice][computerChoice]);

       System.out.println("u:" + user + ",c:" + computer + ",r:" + result);
    }
    /*
     t = 0, l = 1, w = 2
     *
        +---------------+
        | * | r | p | s |
        +---------------+
        | r | 0 | 1 | 2 |
        +---------------+
        | p | 2 | 0 | 1 |
        +---------------+
        | s | 1 | 2 | 0 |
        +---------------+
     */
}

Gra w golfa (odstępy / wcięcia)

import java.util.HashMap;
public class _ {
public static void main(String i[]) {
    HashMap l = new HashMap(){{
        put('r',0);put('p',1);put('s',2);put(0,'T');put(1,'L');put(2,'W');
    }};

    char u =i[0].charAt(0);char c = "rps".charAt((int)(Math.random()*3)%3);
    int[][] m =new int[][]{{0,1,2},{2,0,1},{1,2,0}};

    System.out.println("U"+u+"C"+c+"R:"+(Character)l.get(m[(Integer)l.get(u)][(Integer)l.get(c)]));
}}

Nie najkrótszy kod, ale moja pierwsza próba

epoka
źródło
1
Niektóre ulepszenia, które możesz zastosować: 1) import java.util.*2) HashMap l-> Map l3) rzuć na (int)zamiast (Integer)4) new Random().nextInt(3)5) pomiń new int[][]6) usuń rzuty na (Character)7) użyj ints zamiast znaków.
Howard,
1

Idź (169)

Gra w golfa:

package main
import("fmt";"os")
func main(){v:=map[uint8]int{114:0,112:1,115:2}
u:=os.Args[1][0]
c:="rps"[os.Getpid()%3]
fmt.Printf("%c\n%c\n",c,"TWL"[(3+v[c]-v[u])%3])}

Niegolfowany (w formacie sformatowanym przez go fmt):

package main

import (
    "fmt"
    "os"
)

func main() {
    v := map[uint8]int{114: 0, 112: 1, 115: 2}
    u := os.Args[1][0]
    c := "rps"[os.Getpid()%3]
    fmt.Printf("%c\n%c\n", c, "TWL"[(3+v[c]-v[u])%3])
}

Biegać :

idź uruchomić main.go p

s

W.

Denys Séguret
źródło
1

Pyth , 23

J"rps"K+wOJK%-XJ'KXJtK3

Dane wyjściowe mają postać:

Remis: 0 Wygrana: 1 Przegrana: 2

Wyjaśnienie:

J"rps"             J="rps"
K+wOJ              K=input()+random_choice(J)
K                  print K
  XJ'K             index of K[0] in J
      XJtK         index of K[1] in J
 -XJ'KXJtK         difference of above indexes
%-XJ'KXJtK3        above difference mod 3

Uruchom w następujący sposób:

$ cat rps
J"rps"K+wOJK%-XJ'KXJtK3
s
$ cat rps | python3 pyth.py
< Extraneous debug output removed>
sp
1

Tylko dla 4 dodatkowych postaci możemy użyć T dla remisu, W dla wygranej i L dla przegranej:

J"rps"K+wOJKr@"TWL"-XJ'KXJtK

Wszystko jest takie samo aż do różnicy indeksów, w którym to momencie używamy różnicy jako indeksu w ciągu "TWL".


Uwaga: chociaż rozwijałem ten język po opublikowaniu wyzwania, nie widziałem go do dziś. Wyzwanie nie wpłynęło na żaden aspekt języka.

isaacg
źródło
0

Groovy, 89

v='rps'
r=new Random().nextInt(3)
print"${v[r]}${'TLW'[((r-v.indexOf(this.args[0]))%3)]}"

Jako argument przyjmuje wybór użytkownika. Przykład:

groovy rps.groovy p
sL
Roger Lindsjö
źródło
0

C # i LinqPad 133

grał w golfa:

char i,c,r;i=Console.ReadLine()[0];var a="prsp";c="prs"[new Random().Next(3)];r=i==c?'T':a.Contains(""+i+c)?'W':'L';(c+">"+r).Dump();

bez golfa:

        char i, c, r; // i for input / c for choosen by computer / r for result
        i = Console.ReadLine()[0]; //getting input in LinqPad
        var a = "prsp"; 
        c = "prs"[new Random().Next(3)]; // Computer choose a random string
        r = i == c ? 'T' : a.Contains("" + i + c) ? 'W' : 'L'; (c + ">" + r).Dump(); //check for win - dump for output in LinqPad

przykładowe wyjście (dane wejściowe były): r> L // Komputer wybiera rock (r) -> więc przegraliśmy

EvilFonti
źródło
0

JavaScript (79)

Wpadłem na stary, ale zaczynamy ...

Z dodatkową premią, że możesz użyć dowolnej skały, którą lubisz pegnatite, piroksenit, scoria, sovite, kimberlite, trondjemite, tuf lub dowolny inny. Jedynym ograniczeniem jest to, że nie możesz używać plub s ;-)


Wkład:

r = rock      (Or , ...)
p = paper
s = scissors

Wydajność:

[computers choice][0=Loss, 1=Win, 2=Draw]

Przykład:

User  Computer  Result
r     r         r2
r     p         p0
r     s         s1

Kod do gry w golfa:

u=~~{p:1,s:2}[prompt()],c=new Date%3;alert('rps'[c]+(u==c?2:!u&c>1|u&!c|u>1&c))

Główne stosowane sztuczki to:

1. u = ~~{}[prompt()]

       Korzystanie z obiektu {}i pobieranie wartości z danych wejściowych użytkownika prompt(). Jak na razie dobrze. Zamiast tego r : 0możemy zmusić go do konwersji 0za pomocą ~~operatora NOT. Jest to często wykorzystywane do numerów podłogowych, ale także ma (korzyść) z nie wraca NaN, gdy inni operatorzy, jak np +{a:1, b:2}['c'].

2. c = new Date%3

       Data jest często oszukiwana, np +new Date. Poprzez bezpośrednie przekonwertowanie jej na znacznik czasu, w przeciwnym razie można uzyskać ciąg znaków. Tutaj przy użyciu mod można osiągnąć ten sam efekt.

3. 'rps'[c]

       Indeksowany dostęp do ciągu znaków, umożliwiający komputerom wybór 0 = r, 1 = plub 2 = s.

4. (u==c ? 2 : !u&c>1 | u&!c | u>1&c )

   IF  u == c
       Draw                    (aka 2)
   ELSE IF !u&c>1|u&!c|u>1&c 
       Win                     (aka 1)
   ELSE
       Loss                    (aka 0)
   ENDIF


...

Nieskluczony kod może wyglądać mniej więcej tak:

function rock_paper_scissors() {
    var choices = {
            r : 0,
            p : 1,
            s : 2,
        },
        tr_table = ['Rock','Paper','Scissors'],
        user, pc, result
    ;

    function get_input() {
        var input = prompt("Enter your choice `r', `p' or `s':")
                    .toLowerCase();

        if (!/^[rps]/.test(input)) {
            console.warn("Bad input. Please choose `r', `p' or `s'.");
            // return get_input();
            return null;
        }
        return input[0];
    }
    function report(c1, c2) {
        if (c1 === pc) {
            return 'Draw';
        } else if (
            (c1 === 0 && c2  >  1) ||
            (c2 === 0 && c1 === 1) ||
            (c1  >  1 && c2  >  0)
        ) {
            return 'Win';
        } else {
            return 'Loss';
        }
    }

    if ((user = get_input())) {
        user = choices[user];
        pc = Math.floor(Math.random() * 3);
        result  = 
            'Computers choice: ' + tr_table[pc] + ', ' +
            'Your choice: ' + tr_table[user] + ', ' +
            'Result=' +  report(user, pc);
        console.log(result);
    }
    return result;
}

rock_paper_scissors();
Runium
źródło
0

Golfscript - 29

To jest faktyczna odpowiedź tym razem (patrząc na ciebie n"Draw": P).

'rps'.@\?3rand.@- 3%@@[=]''+\

Nie golfowany:

'rps'3rand[=]''+.2$={\;'
T'}{.@'rspr'.@?@@(;\?='
L''
W'if=}if

Możesz go uruchomić za pomocą ruby golfscript.rb MyCode.txt, gdzie MyCode.txtjest kod programu.

Przykładowe przebiegi (wszystkie z wejściem „r”, ale działa ze wszystkim) (remis to 0, wygrana to 2, strata to 1):

ruby golfscript.rb MyCode.txt
r0
ruby golfscript.rb MyCode.txt
p2
ruby golfscript.rb MyCode.txt
s1

Jeśli chcesz wyjaśnić którąkolwiek wersję i / lub zobaczyć potencjalną poprawę, powiedz mi.

Josiah Winslow
źródło
0

JavaScript, 65 71 70

Bez wyjścia komputerowego: 65

alert('-+0+0+0'['rppssrr'.indexOf('rps'[new Date%3]+prompt())+1])

Wystarczy przetestować, czy to rozwiązanie jest poprawne:

for(x in {r:0,p:0,s:0})
  for(y in {r:0,p:0,s:0})
    console.log("%s %s %s", x, y, '-+0+0+0'['rppssrr'.indexOf(x+y)+1])

Z wyjściem komputerowym: 71

alert((c='rps'[new Date%3])+'-+0+0+0'['rppssrr'.indexOf(c+prompt())+1])

70

alert((g='rps'[new Date%3]+prompt())+-('srps'.match(g)?-1:g[0]!=g[1]))

i test:

for(x in {r:0,p:0,s:0})
  for(y in {r:0,p:0,s:0})
    console.log((g=x+y)+-('srps'.match(g)?-1:g[0]!=g[1]))
Qwertiy
źródło