Schere, Stein, Papier

21

Implementiere die klassische Steinpapierschere.

Bedingungen:

  • Benutzer gibt 'r', 'p' oder 's' ein
  • Das Programm gibt 'r', 'p' oder 's' und das Ergebnis aus
  • Programmauswahl ('r', 'p' oder 's') muss pseudozufällig sein ( ich sehe dich an Howard )
  • Das Ergebnis kann mit jedem druckbaren Zeichen dargestellt werden. Es sollten immer drei mögliche Ergebnisse für die Eingaben des Benutzers vorliegen (der Benutzer gewinnt, verliert oder ist unentschieden).
  • Was passiert, wenn der Benutzer nichts eingibt oder etwas anderes, das "r", "p" oder "s" ist, nicht wichtig sein sollte?

Du brauchst:

  • Geben Sie den Golfcode an.
  • Der Code ohne Golf
  • Wie rufen Sie das Programm auf?
  • Ein Probelauf

Ich werde die Antwort mit weniger Zeichen wählen, wenn ein Unentschieden vorliegt, wird die am häufigsten gewählte Antwort gewählt.

Gutes Golfen und viel Glück für Sie.

Ich werde selbst eine Antwort in Java veröffentlichen.

Für diejenigen, die in einem Berg unter einem Felsen leben:

r = rock

p = Papier

s = Schere

Rock: gewinnt mit der Schere, verliert mit dem Papier, ein Unentschieden mit Rock.

Papier: gewinnt zu rocken, verliert mit einer Schere, ein Unentschieden mit Papier.

Schere: gewinnt zu Papier, verliert mit Stein, ein Unentschieden mit der Schere.

Aktuelle Positionen:

  • UN: Benutzername
  • PL: Programmiersprache
  • CC: Character Count
  • UV: Mehr Stimmen
╔══════════════════╦════════════╦══════╦════╗
║        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 ║
╚══════════════════╩════════════╩══════╩════╝

Ich kann Howards Antwort nicht auswählen, da es ein (erfolgreicher) Versuch war, die Regeln zu biegen, aber ich ändere sie, um sie besonders deutlich zu machen.

Die Antwort mit 27 Buchstaben kann nicht ausgewählt werden, da sie per se nicht pseudozufällig ist

primo -p antworte, ich gehe mit "-p würde als 3 Bytes gezählt: eins für das -, eins für das p und eins mehr für das notwendige Leerzeichen."

Vielen Dank an alle, die geantwortet haben, ich hoffe, Sie hatten eine gute Zeit!

HINWEIS: Ich werde versuchen, diese alle zwei Wochen zu bearbeiten, die Tabelle anzupassen und meine ausgewählte Antwort zu ändern, wenn jemand die aktuelle übertrifft. Wenn Sie gerade hier angekommen sind, posten Sie Ihre Antwort, wenn Sie möchten!

jsedano
quelle
2
Sie könnten eine Klausel hinzufügen, in der alle Ergebnisse - Gewinn, Verlust, Unentschieden - möglich sein müssen.
Primo
Da dies Popularität ist, habe ich mich für den LOLZ
jdstankosky
Ich habe die Regeln bearbeitet, bevor Sie Ihre Antwort übermittelt haben. Popularität wird nur der Krawattenbrecher sein.
Jsedano
1
Pfft, ist es keine Popularität mehr? Langweilig.
Jdstankosky
1
@anakata Nach traditionellen Perlgolf-Regeln (von niemand anderem als Ton Hospel selbst zusammengestellt) -pwerden 3 Bytes gezählt: eines für das -, eines für das pund eines für das notwendige Leerzeichen. Viele andere Wettbewerbe auf CG.SE haben jedoch jede Option als einzelnes Byte gezählt. In der Regel entscheidet der Fragesteller, welches System zu ehren ist.
Primo

Antworten:

9

APL, 31

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

x←'rps'Weisen Sie Zeichenfolge 'rps'zux

(?3)⌷ Wähle zufällige ganze Zahlen von 1 bis 3 und wähle den Index von x

⍞, Voranstellen der Benutzereingabe für die Maschinenauswahl

⎕← Die resultierende Zeichenfolge ausgeben

x⍳ Mit indexOf in ein numerisches Array konvertieren x

-/ Unterschied der beiden Zahlen

1+|3 Modul 3 und plus 1

'TWL'[...] Indizierung von 'TWL'

Probe

r
rp
L

Benutzer wählen Rock, Programm wählen Papier: Verlieren

TwiNight
quelle
42

LOLCODE, 1397

Hinweis: Ich reichte dies ein, bevor ich bemerkte, dass die Gewinnanforderung von Popularität mit Golf-Tie-Break zu Golf mit Popularität-Tie-Break geändert wurde.

Es gibt eigentlich keine strikte Syntax, aber ich bin mir sicher, dass dies akzeptabel ist.

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

Wenn dies erfolgreich ausgeführt werden würde RockPaperScissors.LOL, könnten folgende zufällige Ergebnisse vorliegen:

  • Eingabe: Rock- Ausgabe:I GUESSED SCIZZORS U WONNED
  • Eingabe: Paper- Ausgabe:I GUESSED PAPER NOWAI TIED
  • Eingabe: Scissors- Ausgabe:I GUESSED ROCK LOL U LOZED
  • Eingabe: Tuna- Ausgabe:WHAT U SAYZ? YOU BURNTED MAH TREAT!
jdstankosky
quelle
6
+1 nur weil du LOLCODE bist. Sieht aus wie etwas, das ich irgendwann lernen sollte, nur für die LOLz.
Iszi
23

GolfScript

n"Draw"

Der obige Code implementiert die erforderliche Funktionalität. Darüber hinaus wird sichergestellt, dass der Spieler aufgrund einer (wahrgenommenen) Ungerechtigkeit der Computerstrategie niemals wütend wird.

Ungolfed-Version

n"Draw"

So rufen Sie das Programm auf

Die Eingabe (ein einzelnes Zeichen von 'r', 'p', 's') muss in STDIN erfolgen, möglicherweise mit Zeilenumbruch abgeschlossen.

Ein Probelauf

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

Erklärung des Codes

Für alle, die nicht mit GolfScript vertraut sind, füge ich eine detaillierte Erklärung hinzu, wie dieser Code funktioniert. Der Code besteht im Wesentlichen aus drei Teilen.

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

Anmerkungen

Da dies kein Code-Golf sondern ein Beliebtheitswettbewerb ist, habe ich nicht die kürzeste Version gewählt. Im Falle eines Unentschieden könnte ein kürzerer Code meine Lösung zunichte machen. Für Golfliebhaber bieten sich jedoch folgende Möglichkeiten:

  • Gehen Sie nur mit der richtigen Eingabe um und zwingen Sie den Benutzer, eine neue Zeile einzugeben. Dadurch wird ein Zeichen gespeichert.
  • Die Regeln weisen eine kleine Unzulänglichkeit auf, die es ermöglicht, ein anderes Zeichen durch Verbiegen der Regeln zu speichern. Das Ergebnis kann immer als "Win" ausgedruckt werden - es wurde nicht festgelegt, dass das richtige Ergebnis ausgedruckt werden muss. Beachten Sie jedoch, dass die Spieler schnell wütend werden, wenn Sie ein Betrugsprogramm implementieren.
  • Das Ausgabeformat ist nicht gut spezifiziert. Wir können 0als Ausgabe für die Auslosung wählen . Das kürzeste gültige Programm ist daher der Ein-Zeichen-Code 0.
Howard
quelle
1
OK, ich habe den Regeln mehr Ausführlichkeit hinzugefügt! Ich gebe zu, ich habe zwei Anfängerfehler gemacht.
Jsedano
"Der einzige Gewinnzug ist, nicht zu spielen." : P
Viezevingertjes
1
+1 für die ungolfed Version und die wirklich gute Erklärung
izlin
Ich schlage vor n"d", da die Frage besagt, dass die Ausgabe ein beliebiges druckbares Zeichen sein muss, sagt sie nichts über die Verwendung vollständiger Wörter aus.
ender_scythe
20

Ruby: 61 54 Zeichen

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

Irgendwie erklärt:

Das gesamte Problem beschränkt sich auf die Berechnung der folgenden Ergebnisse:

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

Wo die Zahlen bedeuten:

  • Auswahl: 0 Steine, 1 Papier, 2 Scheren
  • Ergebnis: 0 Unentschieden, 1 Sieg, 2 Niederlagen

Dafür habe ich die Formel verwendet: machine_choice - human_choice. Dies führt gelegentlich zu einem negativen Wert. Da er jedoch nur als Index verwendet wird und der negative Index rückwärts gezählt wird, wird das richtige Array-Element ausgewählt.

# ┌── 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

Verwendete Methoden (andere sind Fixnumnaheliegend):

Ungolfed:

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]

Probelauf:

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"
Mann bei der Arbeit
quelle
1
Sehr ähnlich zu mir. [(c-o.index($_)+3)%3]kann durch [c.-o.index$_]für 7 Bytes ersetzt werden. Außerdem sollten Sie -nlmindestens zwei Punkte zu Ihrer Punktzahl hinzufügen .
Primo
1
Doh! Das war meine allererste Absicht, negative Indizes zu verwenden. Scheint, als hätte ich vergessen, diesen Ansatz zu wiederholen, nachdem ein Problem mit der Operandenreihenfolge behoben wurde. Vielen Dank, @primo. Und noch ein Dankeschön für den c.Tipp.
Handarbeit
Ich muss sagen, dass ich diese Antwort liebe !!
Jsedano
2
@manatwork der Trick ist eigentlich .-. Gepunktete Operatoren haben eine viel geringere Priorität als ihre nicht gepunkteten Gegenstücke. Beispielsweise a/(b+c)kann durch ersetzt werden a./b+c.
Primo
9

C # (167 Zeichen)

Mein allererster Versuch beim Golfen.

Golf gespielt

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

Nicht golfen

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

Probenlauf Die App erfordert einzelne char Eingänge als Argument 1 zur Anwendung, entweder r, soder p.

cmd > app.exe r

Alle möglichen Ergebnisse

  • cmd > app.exe rgibt Output r T(Rock, Tie)
  • cmd > app.exe rgibt eine Ausgabe aus p L(Papier, verloren)
  • cmd > app.exe rgibt Output s W(Schere, Gewinn)
  • cmd > app.exe pgibt Output r W(Rock, Win)
  • cmd > app.exe pgibt Ausgabe p T(Papier, Krawatte)
  • cmd > app.exe pgibt Ausgabe s L(Schere, verloren)
  • cmd > app.exe sgibt ausgang r L(rock, lost)
  • cmd > app.exe sgibt eine Ausgabe aus p W(Papier, Gewinn)
  • cmd > app.exe sgibt Ausgang s T(Schere, Krawatte)
Henrik
quelle
9

Perl 48 Bytes

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

Das Skript druckt das Ergebnis aus der Perspektive des Computers aus. Wenn beispielsweise der Spieler rund der Computer auswählen s, lautet das Ergebnis Lose. $%(Seitenzahl formatieren) wird verwendet, um den Umzug des Computers zu speichern, da er möglicherweise nur einen ganzzahligen Wert enthält, der eine Ganzzahl-Umwandlung speichert.

Ungolfed:

# 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];

Beispielnutzung:

$ echo p | perl rps.pl
s
Win

$ echo r | perl rps.pl
r
Draw

$ echo s | perl rps.pl
p
Lose

Das Skript kann auch interaktiv ausgeführt werden, indem Sie Ihren Zug eingeben, gefolgt von Enter:

$ perl rps.pl
r
s
Lose

Regel-Stretching

Perl 35 +3 Bytes

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

Erfordert die -pBefehlszeilenoption (3 Byte). Jedes der Ergebnisse Win, Loseund Drawwurden abgebildet W, L, D. Der Zeilenumbruch zwischen der Wahl des Computers und dem Ergebnis wurde ausgeschlossen.

Beispielnutzung:

$ echo r | perl -p rps.pl
sL

Perl 30 +3 Bytes

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

Nochmals benötigt -p. Hier Win, Loseund Drawwurde abgebildet 2, 1und 0jeweils. Dies ist technisch immer noch kompatibel, da es sich um druckbare Zeichen handelt.

Beispielnutzung:

$ echo r | perl -p rps.pl
s1

Perl 24 +3 Bytes

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

Erfordert -p, abgebildet WLD auf 2, 1, 0wie zuvor. Jedes ^Tsollte durch ein buchstäbliches ASCII-Zeichen 20 ersetzt werden. $^TGibt die Anzahl der Sekunden seit dem Start des Skripts zurück. Alle Ergebnisse sind möglich, aber nicht ganz als pseudozufällig zu qualifizieren.

Beispielnutzung:

$ echo r | perl -p rps.pl
s1
primo
quelle
7

APL ( 38 36)

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

Ausgänge 'T', 'W' und 'L' für Gleichstand, Sieg und Niederlage.

Probelauf:

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

(Benutzer gibt 'p' für Papier ein. Computer wählt 'r' (rock), Benutzer gewinnt)

Erläuterung:

  • ⌽↑⌽∘'TWL'¨⍳3: generiert die folgende Matrix:
TLW
WTL
LWT
  • ⍞⍳⍨c←'rps': cauf die Zeichenfolge setzen 'rps', Benutzereingabe lesen und den Index der Benutzereingabe in der Zeichenfolge abrufen (dies ist ein Wert von 1 bis 3). Dieser Index wird als Y-Koordinate in der Matrix verwendet.
  • i←?3: Erhalte eine Zufallszahl von 1 bis 3 und speichere sie in i, dies ist die Wahl des Computers. Dies wird als X-Koordinate in der Matrix verwendet.
  • c[i]: Verwenden Sie diese Option ials Index für cund zeigen Sie die Computerauswahl als 'r', 'p' oder 's' an.
Marinus
quelle
6

ferNANDo 1184 (259 golfen) Bytes

Ein in Python geschriebener Interpreter befindet sich unten auf der verlinkten Seite.

ferNANDo ist eine esoterische Sprache, die nur einen Variablentyp (Boolean) und nur eine Operation (NAND) unterstützt. Wie Sie sich vorstellen können, kann dies zu einer ziemlich langen Logik führen, um scheinbar einfache Aufgaben zu erledigen. Es unterstützt das Lesen von stdin (jeweils ein Byte), das Schreiben in stdout (jeweils ein Byte), bedingte Schleifen und einen Zufallsgenerator.

Es gibt überhaupt keine Schlüsselwörter. alles ist eine Variable. Die Funktion einer Anweisung wird ausschließlich durch die Anzahl der darin enthaltenen Variablen bestimmt. Es gibt auch keine Kommentare, deshalb habe ich mein Bestes getan, um den Code selbstkommentierend zu machen. Die letzten vier Zeilen mögen etwas verwirrend sein, aber es wird wahrscheinlich genügen zu sagen, dass es gedruckt Win!wird Lose, oder Drawabhängig vom Ergebnis.

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

Das Skript kann interaktiv ausgeführt werden, indem Sie Ihren Zug gefolgt von eingeben Enter.

Beispielnutzung (vorausgesetzt, Sie haben den Interpreter benannt 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

Bearbeiten: Nur um zu beweisen, dass ferNANo mit Java konkurrieren kann, ist hier eine 'Golf'-Version mit 259 Bytes . Die Logik ist auf den ersten Blick anders. es prüft not winund not tie, was ein paar NAND-Gatter spart (weil ich dann nur die notVersionen der Züge des Spielers brauche und weil not losesie für die Ausgabe nicht benötigt wurden). Nicht annähernd so interessant zu lesen.

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
quelle
2
HAHAHA o_shi- o_shi- o_shi-Das war komisch, sich selbst zu kommentieren.
Jdstankosky
1
@jdstankosky vielleicht ein bisschen überreagiert auf ein Würfeln q, aber er macht das Vernünftige und rerollt.
Primo
5

Python 3.x: 74 Zeichen

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

Wie es funktioniert

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

Auf der Grundlage des Schicksals wird festgelegt, welche Auswahl anhand der Formel getroffen werden soll

result = (User_choice + machines_fate) % no_of_choices

machine_choice = "psr"[result]

Ungolf Version

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)

Probelauf

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
quelle
2
interessant, vorher das Ergebnis der Entscheidung, dann , was Zeichen zu werfen , dieses Ergebnis zu bekommen ...
acolyte
1
Ich bin nicht sicher, ob die Zeit in Sekunden unter "Programmwahl ('r', 'p' oder 's') muss pseudozufällig sein" qualifiziert ist . Aber Millisekunden würden es wahrscheinlich tun.
Primo
4

Lua, 87

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

Verwendung:

$ lua rps.lua p
s   Defeat

Ungolfed:

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
quelle
Sie können 3 Zeichen speichern, indem Sie "Verlieren" anstelle von "Niederlage" und "Unentschieden" anstelle von "Zeichnen" verwenden. ;)
Roddy der gefrorenen Erbsen
4

GolfScript 62

Eine alternative GolfScript-Lösung, viel langweiliger als die von Howard :).

Das Programm wählt zufällig einen Zug aus und zeigt das Ergebnis aus Sicht des Benutzers an.

Der Code

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

Probelauf

> echo s | ruby golfscript.rb rps.gs

r "verlieren"

Online-Test

Sie können das Programm ausführen und mit verschiedenen Eingaben experimentieren: http://golfscript.apphb.com/?c=OydzJwoKJ3Jzc3BwcicuWzZyYW5kPV0nJys6wqdAKy4uJiwoez8pwqdcJ0xvc2UnJ1dpbidpZn17EzF3Fcv

Beachten Sie jedoch, dass der Parameter (Benutzerumzug), der normalerweise in der Befehlszeile übergeben wird, jetzt im Code selbst zum Stapel hinzugefügt wird (es gibt keine Möglichkeit, in diesem Online-Tool "echte" Befehlszeilenparameter bereitzustellen).

"Ungolfed" Version

Ich habe keine Ahnung, was ungolfed bedeutet, wenn es um GolfScript geht, also habe ich versucht, Kommentare hinzuzufügen. Hoffentlich wird dadurch die Funktionsweise des Codes verdeutlicht und die Lesbarkeit verbessert:

# 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
quelle
4

C 92 86 Zeichen

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

Druckt die Wahl des Computers und das Ergebnis aus Sicht des Benutzers - W = Sie gewinnen, L = Sie verlieren, T = Unentschieden.
Die einfache Formel ergibt x-yunter Berücksichtigung der ASCII-Werte der Auswahl (offensichtlich) 0 beim Zeichnen und in jedem anderen Fall einen eindeutigen Wert.

ugoren
quelle
4

Python 2 ( 86 84 80 78), Python 3 - 76 Zeichen

0 - Unentschieden, 1 - Niederlage, 2 - Sieg

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)

Ungolfed

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

Wie läuft man: python file_name_here.py

Probleme:
Computer AI: 35 Zeichen

beary605
quelle
1
Nett! Ich glaube aber nicht, dass du es brauchst Aund du kannst einen anderen Char mit retten from random import*.
Grc
@grc: danke, ich habe es nicht versucht from random, weil ich dachte, es hat sich nicht geändert ...
beary605
Sie können weitere 2 Zeichen entfernen, indem Sie (a == b) * 2 in (a! = B) ändern und die Ergebnisse in "0-Unentschieden, 1-Sieg, 2-Niederlage" ändern
Dhara
Entschuldigung, meinte "" 0-Unentschieden, 1-Niederlage, 2-Sieg "
Dhara
@ Dhara: Danke, hätte das nicht herausgefunden. Handarbeit: Oh! Ich werde das reparieren.
beary605
4

Versuchen Sie es zunächst, ohne andere zu überprüfen.

gespielt: 107 85 Bytes

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

Ausgabe ist [NPC-Wahl] [1: Gewinn, 2: Verlust, 3: Unentschieden]

ungolfed:

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
quelle
4

PowerShell: 144 133 117 111 92 73

Änderungen gegenüber dem Original:

Alles in allem hat sich die Länge meiner ursprünglichen Antwort beinahe halbiert!

Golf Code:

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

Kann direkt von der Konsole ausgeführt werden.

Ungolfed, mit Kommentaren:

# 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

Einige Beispiele laufen an der Konsole:

Bildbeschreibung hier eingeben

Iszi
quelle
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]);}}

Hochgradig ungolfter Code:

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

Probeläufe:

C:> Java Cr

s: 1

C:> java cp

p: T

C:> java cs

s: T

jsedano
quelle
3

Befunge: 107 Zeichen

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

Etwas klobig. Es ist schrumpfbar, die Frage ist, um wie viel.

Fors
quelle
3

JavaScript (87)

Golf gespielt:

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

Ungolfed:

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

Sie können den Code einfach in die Javascript-Konsole Ihres Browsers einfügen, um ihn auszuführen.

Wenn ich das Ergebnis ausdrucken darf, bevor ich die Auswahl des Computers drucke (83) :

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

K, 67

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

Druckt W, L, D für Gewinn / Verlust / Unentschieden.

Ungolfed:

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

Oder in Q, was besser lesbar ist:

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

Probelauf:

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"
tmartin
quelle
2

Javascript, 117 Zeichen

Hier ist ein datengesteuerter Ansatz für das Problem. Dies kann wahrscheinlich optimiert werden, indem die Gewinn- / Verlust- / Zeichnungsdaten generiert werden, anstatt sie manuell abzubilden, aber es ist ein Anfang :)

Golf gespielt:

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

Ungolfed:

//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()]
);

Schließlich ist hier eine Geige mit beiden.

Briguy37
quelle
1

Javascript: 256

Golf gespielt:

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

ungolfed:

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

Mini-Version (129 Code-Zeichen):

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.
quelle
1

JAVA (387) erster Code Golf!

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

Ungolfed

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 |
        +---------------+
     */
}

Golf (Abstand / Einrückung)

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

Nicht der kürzeste Code, aber mein erster Versuch

Epoche
quelle
1
Einige Verbesserungen, die Sie anwenden können: 1) import java.util.*2) HashMap l-> Map l3) Wirken auf (int)anstatt (Integer)4) new Random().nextInt(3)5) Weglassen new int[][]6) (Character)Wirken auf 7) Verwenden Sie Ints anstelle von Zeichen.
Howard
1

Los (169)

Golf gespielt:

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

Ungolfed (wie formatiert von 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])
}

Lauf :

go run main.go p

s

W

Denys Séguret
quelle
1

Pyth , 23

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

Die Ausgabe erfolgt in der Form:

Gleichstand: 0 Sieg: 1 Niederlage: 2

Erläuterung:

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

Gehen Sie wie folgt vor:

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

Für nur 4 weitere Zeichen können wir T für Gleichstand, W für Gewinn und L für Verlust verwenden:

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

Bis auf den Unterschied der Indizes ist alles gleich. An diesem Punkt verwenden wir den Unterschied als Index für den String "TWL".


Hinweis: Während ich diese Sprache entwickelt habe, nachdem die Herausforderung veröffentlicht wurde, hatte ich sie bis heute nicht gesehen. Die Herausforderung hat keinen Aspekt der Sprache beeinflusst.

isaacg
quelle
0

Groovy, 89

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

Übernimmt die Benutzerauswahl als Argument. Beispiel:

groovy rps.groovy p
sL
Roger Lindsjö
quelle
0

C # & LinqPad 133

Golf gespielt:

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

ungolfed:

        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

Beispielausgabe (Eingabe war s): r> L // Computer wählt rock (r) -> also haben wir verloren

EvilFonti
quelle
0

JavaScript (79)

Ich stoße auf einen alten, aber jetzt geht's los ...

Mit dem zusätzlichen Bonus, dass Sie jedes Gestein verwenden können, das Sie mögen: Pegnatit, Pyroxenit, Scoria, Sovit, Kimberlit, Trondjemit, Tuff oder jedes andere. Einzige Einschränkung ist, dass man nicht poder verwenden kann s ;-)


Eingang:

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

Ausgabe:

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

Beispiel:

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

Golf Code:

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

Die wichtigsten Tricks sind:

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

       Objekt verwenden {}und Wert durch Benutzereingabe von abrufen prompt(). So weit, ist es gut. Dann r : 0können wir stattdessen die Konvertierung erzwingen, indem wir 0den ~~NOT-Operator verwenden. Es wird häufig für Stockwerksnummern verwendet, hat aber auch den (Vorteil), dass es nicht zurückgegeben wird, NaNwenn andere Betreiber dies wünschen, z +{a:1, b:2}['c'].

2. c = new Date%3

       Das Datum wird häufig ausgetrickst, indem zB verwendet wird +new Date, um es direkt in einen Zeitstempel umzuwandeln, andernfalls würde man eine Zeichenfolgendarstellung erhalten. Hier erreicht man mit Mod den gleichen Effekt.

3. 'rps'[c]

       Indizierter Zugriff auf Zeichenfolgen, bei denen der Computer die Wahl 0 = rhat 1 = poder 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


...

Der ungolfed Code kann ungefähr so ​​aussehen:

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
quelle
0

Golfscript - 29

Dies ist eine tatsächliche Antwort dieses Mal (dich ansehend,: n"Draw"P).

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

Ungolfed:

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

Sie können es mit ausführen ruby golfscript.rb MyCode.txt, wo MyCode.txtist der Programmcode.

Beispielläufe (alle mit Eingabe "r", aber es funktioniert mit allem) (Gleichstand ist 0, Gewinn ist 2, Verlust ist 1):

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

Wenn Sie eine Erklärung für eine der Versionen wünschen und / oder eine mögliche Verbesserung sehen möchten, sagen Sie es mir.

Josiah Winslow
quelle
0

Javascript, 65 71 70

Ohne Computerausgabe: 65

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

Nur um diese Lösung zu testen, ist es richtig:

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

Bei Computerausgabe: 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]))

und der 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
quelle