Pierre papier ciseaux

21

Mettez en œuvre les ciseaux classiques en papier de roche.

Conditions:

  • l'utilisateur saisira «r», «p» ou «s»
  • programme affichera «r», «p» ou «s» et le résultat
  • le choix du programme ('r', 'p' ou 's') doit être pseudo aléatoire ( je vous regarde Howard )
  • Le résultat peut être représenté avec n'importe quel caractère imprimable, il devrait toujours y avoir trois résultats possibles pour ce que l'utilisateur a entré (l'utilisateur gagne, perd ou est une égalité).
  • que se passe-t-il si l'utilisateur ne saisit rien, ou quelque chose de différent que «r», «p» ou «s» ne devrait pas être important.

Tu dois:

  • Fournissez le code du golf.
  • Le code non golfé
  • Comment invoquez-vous le programme
  • Un échantillon

Je choisirai la réponse avec moins de caractères, si une égalité présente la réponse la plus votée sera choisie.

Bon golf et que la chance soit toujours en votre faveur.

Je publierai une réponse moi-même, en Java.

Pour ceux qui vivent dans une montagne sous un rocher:

r = roche

p = papier

s = ciseaux

rock: gagne aux ciseaux, perd avec du papier, une cravate avec du rock.

papier: gagne à basculer, perd avec des ciseaux, une cravate avec du papier.

ciseaux: gagne au papier, perd avec la roche, une cravate avec des ciseaux.

Positions actuelles:

  • UN: Nom d'utilisateur
  • PL: langage de programmation
  • CC: nombre de caractères
  • UV: Up votes
╔══════════════════╦════════════╦══════╦════╗
║        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 ║
╚══════════════════╩════════════╩══════╩════╝

Je ne peux pas sélectionner la réponse de Howards, car c'était une tentative (réussie) de contourner les règles, mais je les change, pour les rendre plus explicites.

la réponse à 27 caractères primo ne peut pas être sélectionnée car elle n'est pas pseudo aléatoire en soi

primo -p réponse, je vais aller avec "-p serait compté comme 3 octets: un pour le -, un pour le p, et un de plus les espaces nécessaires."

Merci à tous ceux qui ont répondu, j'espère que vous avez passé un bon moment!

REMARQUE: j'essaierai de modifier cela toutes les deux semaines, d'ajuster le tableau et de modifier ma réponse sélectionnée si quelqu'un bat la réponse actuelle, donc si vous venez d'arriver ici, postez votre réponse si vous le souhaitez!

jsedano
la source
2
Vous pourriez envisager d'ajouter une clause stipulant que tous les résultats - gagner, perdre, tirer - doivent être possibles.
primo
Puisque c'est la popularité, j'ai décidé d'aller avec le LOLZ
jdstankosky
J'ai modifié les règles avant de soumettre votre réponse. La popularité ne fera que briser l'égalité.
jsedano
1
Pfft, ce n'est plus de la popularité? Ennuyeuse.
jdstankosky
1
@anakata Selon les règles traditionnelles de Perlgolf (compilées par nul autre que Ton Hospel lui-même) -pseraient comptées comme 3 octets: un pour le -, un pour le p, et un de plus les espaces nécessaires. Cependant, de nombreuses autres compétitions sur CG.SE ont compté chaque option comme un seul octet. C'est généralement à l'auteur de la question de décider quel système honorer.
primo

Réponses:

9

APL, 31

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

x←'rps'Attribuer une chaîne 'rps'àx

(?3)⌷ Choisissez un entier aléatoire 1 ~ 3, choisissez cet indice de x

⍞, Ajout d'une entrée utilisateur au choix de la machine

⎕← Sortie de la chaîne résultante

x⍳ Convertir en tableau numérique par indexOf in x

-/ Différence des deux nombres

1+|3 Module 3 et plus 1

'TWL'[...] indexation à partir de 'TWL'

Échantillon

r
rp
L

L'utilisateur choisit la roche, le programme choisit le papier: perdre

TwiNight
la source
42

LOLCODE, 1397

Remarque: J'ai soumis ceci avant de remarquer que l'exigence de gagner était passée de la popularité avec le tie-break de golf au golf avec le tie-break de popularité.

Il n'y a pas vraiment de syntaxe stricte, mais je suis sûr que c'est acceptable.

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

Si cela devait être exécuté avec succès RockPaperScissors.LOL, voici ce que pourraient être des résultats aléatoires possibles:

  • Entrée: Rock- Sortie:I GUESSED SCIZZORS U WONNED
  • Entrée: Paper- Sortie:I GUESSED PAPER NOWAI TIED
  • Entrée: Scissors- Sortie:I GUESSED ROCK LOL U LOZED
  • Entrée: Tuna- Sortie:WHAT U SAYZ? YOU BURNTED MAH TREAT!
jdstankosky
la source
6
+1 juste pour être LOLCODE. On dirait quelque chose que je devrais apprendre un jour, juste pour le LOLz.
Iszi
23

GolfScript

n"Draw"

Le code ci-dessus implémente les fonctionnalités requises. De plus, cela garantit que le joueur ne sera jamais en colère à cause d'une injustice (perçue) de la stratégie de l'ordinateur.

Version non golfée

n"Draw"

Comment appeler le programme

L'entrée (un seul caractère de 'r', 'p', 's') doit être fournie sur STDIN, éventuellement terminée par une nouvelle ligne.

Un échantillon

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

Explication du code

Pour tous ceux qui ne connaissent pas GolfScript, j'ajouterai une explication détaillée du fonctionnement de ce code. Le code se compose essentiellement de trois parties.

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

Remarques

Comme ce n'est pas du golf de code mais un concours de popularité, je n'ai pas choisi la version la plus courte. Peut-être qu'en cas d'égalité, un code plus court éliminera ma solution. Néanmoins, pour ceux qui s'intéressent au golf, les possibilités suivantes sont offertes:

  • Traitez uniquement avec une entrée appropriée et forcez l'utilisateur à fournir une nouvelle ligne. Cela sauvera un caractère.
  • Les règles ont une petite insuffisance qui permet de sauver un autre personnage en pliant les règles. Le résultat peut toujours être imprimé comme "Win" - il n'a pas été spécifié que le résultat correct doit être imprimé. Mais notez que les joueurs se mettront bientôt en colère si vous choisissez de mettre en œuvre un programme de triche.
  • Le format de sortie n'est pas bien spécifié. Nous pouvons choisir 0comme sortie pour le tirage. Ainsi, le programme valide le plus court est le code à un caractère 0.
Howard
la source
1
OK, j'ai ajouté plus de verbosité aux règles! J'avoue avoir commis deux erreurs de recrue.
jsedano
"Le seul coup gagnant n'est pas de jouer." : P
Viezevingertjes
1
+1 pour la version non golfée et la très bonne explication
izlin
Je suggère n"d", comme la question disait que la sortie doit être n'importe quel caractère imprimable, cela ne dit rien sur l'utilisation de mots entiers.
ender_scythe
20

Rubis: 61 54 caractères

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

En quelque sorte expliqué:

L'ensemble du problème est réduit au calcul des résultats suivants:

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

Où les chiffres signifient:

  • choix: 0 pierre, 1 papier, 2 ciseaux
  • résultat: 0 nul, 1 victoire, 2 défaites

Pour cela, j'ai utilisé la formule: machine_choice - human_choice. Il en résulte parfois une valeur négative, mais comme il n'est utilisé que comme index et que l'index négatif est compté en arrière, il choisira l'élément de tableau correct.

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

Méthodes utilisées (d'autres alors Fixnumévidentes):

Non golfé:

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]

Exemple d'exécution:

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"
homme au travail
la source
1
Très similaire au mien. [(c-o.index($_)+3)%3]peut être remplacé par [c.-o.index$_]pour 7 octets. En outre, vous devez ajouter au moins deux à votre score -nl.
primo
1
Ah! C'était ma toute première intention, d'utiliser des indices négatifs. Il semble que j'ai oublié de réessayer cette approche après avoir résolu un problème d'ordre d'opérande. Merci, @primo. Et encore un merci pour l' c.astuce.
manatwork
Je dois dire que j'aime cette réponse !!
jsedano
2
@manatwork l'astuce est en fait .-. Les opérateurs pointillés ont une priorité beaucoup plus faible que leurs homologues non pointillés. Par exemple, a/(b+c)peut être remplacé par a./b+c.
primo
9

C # (167 caractères)

Mon tout premier essai de golf.

Golfé

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

Non golfé

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

Exemple d'exécution L'application nécessite des entrées de caractère unique comme argument 1 de l'application, soit r, ssoit p.

cmd > app.exe r

Tous les résultats possibles

  • cmd > app.exe rdonne une sortie r T(rock, tie)
  • cmd > app.exe rdonne une sortie p L(papier, perdu)
  • cmd > app.exe rdonne une sortie s W(ciseaux, victoire)
  • cmd > app.exe pdonne une sortie r W(rock, win)
  • cmd > app.exe pdonne la sortie p T(papier, cravate)
  • cmd > app.exe pdonne une sortie s L(ciseaux, perdu)
  • cmd > app.exe sdonne une sortie r L(rock, perdu)
  • cmd > app.exe sdonne une sortie p W(papier, gagner)
  • cmd > app.exe sdonne la sortie s T(ciseaux, cravate)
Henrik
la source
9

Perl 48 octets

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

Le script imprime le résultat du point de vue de l'ordinateur, par exemple si le joueur choisit ret l'ordinateur choisit s, le résultat est Lose. $%(format de numéro de page) est utilisé pour stocker le déplacement de l'ordinateur, car il ne peut contenir qu'une valeur entière, ce qui enregistre une conversion int.

Non golfé:

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

Exemple d'utilisation:

$ echo p | perl rps.pl
s
Win

$ echo r | perl rps.pl
r
Draw

$ echo s | perl rps.pl
p
Lose

Le script peut également être exécuté de manière interactive, en tapant votre mouvement suivi de Enter:

$ perl rps.pl
r
s
Lose

Étirement des règles

Perl 35 +3 octets

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

Nécessite le -pcommutateur de ligne de commande (compté comme 3 octets). Chacun des résultats Win, Loseet Drawont été mis en correspondance W, L, D. La nouvelle ligne entre le choix de l'ordinateur et le résultat a été exclue.

Exemple d'utilisation:

$ echo r | perl -p rps.pl
sL

Perl 30 +3 octets

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

Encore une fois, il faut -p. Ici Win, Loseet Drawont été mappés à 2, 1et 0respectivement. C'est toujours techniquement conforme, car ce sont des caractères imprimables.

Exemple d'utilisation:

$ echo r | perl -p rps.pl
s1

Perl 24 +3 octets

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

Nécessite -p, WLD mis en correspondance 2, 1, 0comme avant. Chacun ^Tdoit être remplacé par un caractère ascii littéral 20. Celui-ci est certes un peu étiré; $^Trenvoie le nombre de secondes écoulées depuis l'époque du démarrage du script. Tous les résultats sont possibles, mais ce n'est pas tout à fait qualifié de pseudo-aléatoire.

Exemple d'utilisation:

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

APL ( 38 36)

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

Sorties 'T', 'W' et 'L' pour égalité, victoire et perte.

Exemple d'exécution:

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

(L'utilisateur tape 'p' pour le papier. L'ordinateur choisit 'r' (rock), l'utilisateur gagne)

Explication:

  • ⌽↑⌽∘'TWL'¨⍳3: génère la matrice suivante:
TLW
WTL
LWT
  • ⍞⍳⍨c←'rps': définissez cla chaîne 'rps', lisez l'entrée utilisateur et obtenez l'index de l'entrée utilisateur dans la chaîne (ce sera une valeur de 1 à 3). Cet indice est utilisé comme coordonnée Y dans la matrice.
  • i←?3: obtenir un nombre aléatoire de 1 à 3 et le stocker i, c'est le choix de l'ordinateur. Ceci est utilisé comme coordonnée X dans la matrice.
  • c[i]: utiliser icomme index dans c, affichant le choix de l'ordinateur sous la forme «r», «p» ou «s».
marinus
la source
6

ferNANDo 1184 (259 golfés) octets

Un interpréteur écrit en Python se trouve au bas de la page liée.

ferNANDo est un langage ésotérique qui prend en charge un seul type de variable, booléen, et une seule opération, NAND. Comme vous pouvez l'imaginer, cela peut conduire à une logique assez longue pour accomplir des tâches apparemment simples. Il prend en charge la lecture depuis stdin (un octet à la fois), l'écriture vers stdout (également un octet à la fois), les boucles conditionnelles et également un générateur booléen aléatoire.

Il n'y a aucun mot-clé; tout est une variable. La fonction d'une instruction est déterminée uniquement par le nombre de variables qu'elle contient. Il n'y a également aucun commentaire, j'ai donc fait de mon mieux pour que le code soit auto-commenté. Les quatre dernières lignes pourraient être un peu déroutant, mais il suffira probablement dire qu'il imprime Win!, Loseou en Drawfonction des résultats.

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

Le script peut être exécuté de manière interactive, en tapant votre mouvement suivi de Enter.

Exemple d'utilisation (en supposant que vous avez nommé l'interprète 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

Edit: Juste pour prouver que ferNANDo peut rivaliser avec Java, voici une version «golfée» à 259 octets . La logique est visiblement différente; il vérifie not winet not tie, ce qui enregistre quelques portes NAND (car alors je n'ai besoin que des notversions des mouvements du joueur, et parce qu'il not losen'était pas requis pour la sortie). Mais pas aussi intéressant à lire.

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
la source
2
HAHAHA o_shi- o_shi- o_shi-C'était un commentaire hilarant.
jdstankosky
1
@jdstankosky peut-être un peu une réaction excessive au roulement d'un q, mais il fait la chose sensée et relance.
primo
5

Python 3.x: 74 caractères

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

Comment ça marche

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

En fonction du destin, il détermine ce que son choix doit être basé sur la formule

result = (User_choice + machines_fate) % no_of_choices

machine_choice = "psr"[result]

Version sans golf

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)

Exemple d'exécution

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
la source
2
intéressant, décider à l'avance du résultat, puis lancer n'importe quel signe pour obtenir ce résultat ...
acolyte
1
Je ne suis pas sûr que le temps en secondes se qualifie sous "le choix du programme ('r', 'p' ou 's') doit être pseudo aléatoire" . Mais des millisecondes le feraient probablement.
primo
4

Lua, 87

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

Usage:

$ lua rps.lua p
s   Defeat

Non golfé:

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
la source
Vous pouvez enregistrer 3 caractères en utilisant «Lose» au lieu de «Defeat» et «Tie» au lieu de «Draw». ;)
Roddy des Frozen Peas
4

GolfScript 62

Une solution GolfScript alternative, beaucoup plus ennuyeuse que Howard :).

Le programme choisit un mouvement au hasard et affiche le résultat du point de vue de l'utilisateur.

Le code

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

Exemple d'exécution

> échos | ruby golfscript.rb rps.gs

r "Perdre"

Test en ligne

Vous pouvez exécuter le programme et expérimenter avec différentes entrées ici: http://golfscript.apphb.com/?c=OydzJwoKJ3Jzc3BwcicuWzZyYW5kPV0nJys6wqdAKy4uJiwoez8pwqdcJ0xvc2UnJ1dpbidpZnpZZCJ3

Notez, cependant, que le paramètre (déplacement de l'utilisateur) qui est généralement passé dans la ligne de commande est maintenant ajouté à la pile dans le code lui-même (il n'y a aucun moyen de fournir de "vrais" paramètres de ligne de commande dans cet outil en ligne).

Version "non golfée"

Je n'ai aucune idée de ce que signifie non golfé en ce qui concerne GolfScript, j'ai donc essayé d'ajouter des commentaires. J'espère que cela clarifiera le fonctionnement du code et le rendra un peu plus lisible:

# 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
la source
4

C, 92 86 caractères

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

Imprime le choix de l'ordinateur et le résultat du point de vue de l'utilisateur - W = vous gagnez, L = vous perdez, T = égalité.
La formule simple x-y, étant donné les valeurs ASCII des choix, donne 0 au tirage (évidemment) et une valeur unique dans chaque cas.

ugoren
la source
4

Python 2 ( 86 84 80 78), Python 3-76 caractères

0 - égalité, 1 - défaite, 2 - victoire

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)

Non golfé

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

Comment exécuter: python file_name_here.py

Problèmes:
Computer AI: 35 caractères

beary605
la source
1
Agréable! Je ne pense pas que vous en ayez besoin A, et vous pouvez enregistrer un autre caractère avec from random import*.
grc
@grc: merci, je n'ai pas essayé from random, car je pensais que ça ne changeait rien ...
beary605
Vous pouvez supprimer 2 autres caractères en changeant (a == b) * 2 en (a! = B) et en changeant les résultats en "0 égalité, 1 victoire, 2 défaites"
Dhara
Désolé, signifiait "" 0 match nul, 1 défaite, 2 victoires "
Dhara
@Dhara: Merci, je n'aurais pas compris ça. manatwork: Oh! Je vais arranger ça.
beary605
4

Essayez d'abord sans revoir les autres.

golfé: 107 85 octets

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

la sortie est [npc-choice] [1: victoire, 2: perte, 3: égalité]

non golfé:

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
la source
4

PowerShell: 144 133 117 111 92 73

Changements par rapport à l'original:

Tout compte fait, presque coupé la longueur de moitié de ma réponse originale!

Code golf:

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

Peut être exécuté directement à partir de la console.

Non golfé, avec commentaires:

# 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

Quelques exemples d'exécutions sur la console:

entrez la description de l'image ici

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

Code très non golfé:

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

Exemples de cycles:

C:> java cr

s: 1

C:> java cp

p: T

C:> java cs

s: T

jsedano
la source
3

Befunge: 107 personnages

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

Légèrement maladroit. Il est rétractable, la question est de savoir combien.

Fors
la source
3

JavaScript (87)

Golfé:

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

Non golfé:

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

Vous pouvez simplement coller le code dans la console javascript de votre navigateur pour l'exécuter.

Si je suis autorisé à imprimer le résultat avant d'imprimer la sélection de l'ordinateur (83) :

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

K, 67

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

Imprime W, L, D pour gagner / perdre / match nul.

Non golfé:

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

Ou en Q, qui est plus lisible:

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

Exemple d'exécution:

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
la source
2

Javascript, 117 caractères

Voici une approche du problème basée sur les données. Cela peut probablement être optimisé en générant les données gagnant / perdant / tirant au lieu de les mapper manuellement, mais c'est un début :)

Golfé:

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

Non golfé:

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

Enfin, voici un violon avec les deux.

Briguy37
la source
1

Javascript: 256

golfé:

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

non golfé:

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

Version mini (129 caractères de code):

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.
la source
1

JAVA (387) premier 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)]));}}

Non golfé

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é (espacement / indentation)

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

Pas le code le plus court, mais mon premier essai

époque
la source
1
Quelques améliorations que vous pouvez appliquer: 1) import java.util.*2) HashMap l-> Map l3) transtyper au (int)lieu de (Integer)4) new Random().nextInt(3)5) omettre new int[][]6) supprimer le transtypage en (Character)7) utiliser des caractères au lieu de caractères.
Howard
1

Aller (169)

Golfé:

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

Non golfé (tel que formaté par 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])
}

Courir :

lancez main.go p

s

W

Denys Séguret
la source
1

Pyth , 23

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

La sortie est sous la forme:

Égalité: 0 Victoire: 1 Défaite: 2

Explication:

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

Exécutez comme suit:

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

Pour seulement 4 caractères supplémentaires, nous pouvons utiliser T pour égalité, W pour victoire et L pour perte:

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

Tout est le même jusqu'à la différence d'index, auquel point nous utilisons la différence comme index dans la chaîne "TWL".


Remarque: bien que j'aie développé ce langage après la publication du défi, je n'avais pas vu le défi jusqu'à aujourd'hui. Le défi n'a influencé aucun aspect de la langue.

isaacg
la source
0

Groovy, 89

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

Prend le choix de l'utilisateur comme argument. Exemple:

groovy rps.groovy p
sL
Roger Lindsjö
la source
0

C # et LinqPad 133

golfé:

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

non golfé:

        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

exemple de sortie (entrée était s): r> L // L'ordinateur choisit rock (r) -> donc nous avons perdu

EvilFonti
la source
0

JavaScript (79)

Se cogner un vieux, mais c'est parti ...

Avec le bonus supplémentaire que vous pouvez utiliser n'importe quelle roche que vous aimez, pegnatite, pyroxénite, scorie, sovite, kimberlite, trondjemite, tuf ou tout autre. La seule limitation est que vous ne pouvez pas utiliser pou s ;-)


Contribution:

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

Sortie:

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

Exemple:

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

Code golf:

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

Les principales astuces utilisées sont:

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

       Utilisation de l'objet {}et récupération de la valeur par entrée utilisateur à partir de prompt(). Jusqu'ici tout va bien. Ensuite, au lieu de l'avoir, r : 0nous pouvons le forcer à être converti 0en utilisant l' ~~opérateur NOT. Il est souvent utilisé pour les numéros de sol, mais a aussi (avantage) de ne pas revenir NaNalors que d' autres opérateurs serait, comme par exemple: +{a:1, b:2}['c'].

2. c = new Date%3

       La date est fréquemment trompée en utilisant par exemple la +new Dateconversion directe en horodatage, sinon on obtiendrait une représentation sous forme de chaîne. Ici, en utilisant le mod one, on obtient le même effet.

3. 'rps'[c]

       Accès indexé sur chaîne donnant le choix aux ordinateurs 0 = r, 1 = pou 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


...

Le code non golfé peut ressembler à ceci:

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
la source
0

Golfscript - 29

C'est une vraie réponse cette fois (en vous regardant,: n"Draw"P).

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

Non golfé:

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

Vous pouvez l'exécuter avec ruby golfscript.rb MyCode.txt, où MyCode.txtest le code du programme.

Échantillons exécutés (tous avec entrée "r", mais cela fonctionne avec tout) (égalité 0, victoire 2, perte 1):

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

Si vous voulez une explication de l'une ou l'autre version et / ou voyez une amélioration potentielle, dites-le-moi.

Josiah Winslow
la source
0

Javascript, 65 71 70

Sans sortie choix ordinateur: 65

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

Juste pour tester cette solution est correcte:

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

Avec sortie choix ordinateur: 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]))

et le 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
la source