Il y a plusieurs questions concernant ce jeu , même un concours de roi de la colline ici . Mais je pense que tous ces défis et concours nécessitent un moyen de déterminer automatiquement le vainqueur d'un match. Alors:
Défi
Étant donné deux entrées dans la plage ["rock", "paper", "scissors", "lizard", "spock"]
représentant les sélections pour le joueur 1 et le joueur 2, déterminez le vainqueur du match.
Règles
[Winner] [action] [loser]
-----------------------------
scissors cut paper
paper covers rock
rock crushes lizard
lizard poisons spock
spock smashes scissors
scissors decapitates lizard
lizard eats paper
paper disproves spock
spock vaporizes rock
rock crushes scissors
Restrictions
- L'entrée sera une paire de chaînes dans la plage donnée (aucune autre chaîne ne peut être utilisée). Vous pouvez utiliser des tableaux de caractères si vous le souhaitez, tant qu'ils représentent l'une des valeurs mentionnées.
- Vous pouvez choisir d'utiliser des minuscules, des majuscules (
"ROCK"
) ou des majuscules ("Rock"
) pour les chaînes d'entrée, tant que la casse choisie est la même pour toutes les entrées. - La sortie sera un trio de valeurs qui détermineront le gagnant, qui peut être tout ce que vous voulez tant que les réponses sont cohérentes. Exemple:
1
si la première entrée gagne,2
si la deuxième entrée gagne,0
s'il y a égalité. Ou peutA
- être si la première entrée gagne,B
si la deuxième entrée gagne,<empty string>
s'il y a égalité.
Objectif
C'est du golf de code , donc le programme / méthode / fonction / lambda le plus court pour chaque langue peut gagner!
Les tests
[Input 1] [Input 2] [Output: 1/2/0]
-----------------------------------
rock paper 2
rock scissors 1
lizard spock 1
spock rock 1
spock paper 2
rock rock 0
cake
astuce).Réponses:
Python 3 ,
685048 octetsEDIT: Merci à 3 tours de Neil, et 2 de M. Xcoder
Chaque chaîne d'entrée a un quatrième caractère distinct, donc je l'utilise pour les distinguer. Si vous organisez les éléments dans le cycle (ciseaux, papier, roche, lézard, spock), chaque élément bat l'élément directement après lui et l'élément 3 se place à droite, cycliquement. Nous soustrayons donc les positions des entrées dans le cycle. Si ce nombre est 0, c'est une égalité. Si c'est 1 ou 3, c'est une victoire pour le premier joueur. Dans ma solution d'origine, la différence de cycle serait indexée dans la chaîne "210100" pour distinguer les résultats du jeu. Neil a en quelque sorte compris que cela peut être accompli sans indexation en ajoutant 7 et en prenant le module par 3. Edit: À l'origine, j'ai utilisé le deuxième caractère pour identifier la chaîne, mais si vous utilisez le quatrième et inversez le cycle, vous obtenez un gâteau. Et nous pourrions tous utiliser plus de gâteau.
Essayez-le en ligne!
Ancienne version:
Essayez-le en ligne!
Version originale:
Essayez-le en ligne!
la source
.index
à.find
)p
,"chaoi"
suffit)JavaScript (ES6), 56 octets
Prend une entrée dans la syntaxe de curry
(a)(b)
. Renvoie0
si A gagne,1
si B gagne oufalse
pour une égalité.Démo
Afficher l'extrait de code
Comment?
Nous définissons la fonction de hachage H () comme:
Cela donne:
Étant donné deux entrées a et b , nous considérons les déclarations suivantes:
De (1) et (2), nous déduisons si le résultat de a> b doit être inversé pour obtenir le bon gagnant et nous stockons cet indicateur dans le N-ème bit d'un masque de bits de recherche.
D'où les bits:
En lisant ceci de bas en haut et en ignorant les zéros en tête, cela donne 1001100110 , ou 614 en décimal.
la source
05AB1E , 16 octets
Essayez-le en ligne! ou comme suite de tests
Explication
Utilise la très belle
cake
astuce de user507295la source
Rubis , 36 octets
Renvoie
0
si le 1er joueur gagne,1
si le 2ème joueur gagne et2
pour un match nul.Basé sur la réponse de user507295 mais utilise une formule mathématique pour effectuer le hachage.
a.sum
est la somme de tous les codes ASCII de la chaînea
, mod1<<16
et est conçu comme une somme de contrôle rudimentaire. Le hachage a été trouvé à l'aide du code suivant:Cela a produit deux valeurs
j
qui ont donné un hachage approprié pour les lettres minuscules, à savoir 88 et 80, qui ont toutes deux donné la séquence décroissante[3,2,1,0,4]
(ou[4,3,2,1,0]
si spock est cyclé au début.)Comme expliqué dans d'autres réponses, un hachage qui donne une différence constante modulo 5 pour les éléments consécutifs dans la séquence ci-dessus est nécessaire pour faire fonctionner la
(h[a]-h[b])%5
formule. Chaque élément bat l'élément 1 ou 3 places à droite et perd à l'élément 2 ou 4 places à droite.Essayez-le en ligne!
la source
JavaScript (ES6),
63545349 octetsPort de mon golf à la réponse de @ WhatToDo. Remarque: l'extrait de code décode le résultat numérique en quelque chose d'un peu moins illisible. Edit: 1 octet enregistré grâce à @Arnauld. 4 octets enregistrés grâce à @ovs.
la source
C, 53 octets
J'ai traité ce problème comme une machine à états, dont 25 états sont définis par les deux, cinq entrées d'état.
En définissant les résultats des états dans un tableau de bits. Je regarde les résultats à l'intérieur en utilisant des marqueurs uniques dans les entrées.
Comme indiqué dans d'autres solutions, les caractères 2, 3 et 4 sont uniques entre les entrées possibles. J'ai concentré l'utilisation sur les caractères 2 et 3 que j'utilise pour sélectionner le bit approprié dans mon tableau de réponses.
Dans le caractère 2, les bits 1 à 4 identifient clairement l'entrée. En masquant ces bits et en décalant de façon appropriée [c'est le "* y & 47 >> 1"], l'entrée peut être notée comme 0, 1, 4, 7 ou 8. Par conséquent, ma chaîne de réponse a 9 caractères. (bits intéressants séparés)
Dans le caractère 3, les bits 0, 1 et 2 identifient clairement l'entrée. En masquant ces bits (décalage non requis) [c'est le "* x & 7"], l'entrée peut être notée comme 0, 1, 2, 3 ou 7. (bits intéressants séparés)
La chaîne de réponse peut ensuite être calculée en remplissant simplement les bits pour les caractères appropriés.
Donc, mettez le bit dans le caractère où Y gagne
Ensuite, la logique est simple: si le deuxième caractère est le même, dessinez, sinon, obtenez le caractère ascii basé sur le deuxième caractère de y et décalez les bits par le troisième caractère de x et ajoutez-en un. Cela rend les réponses 0 pour le tirage au sort, 1 pour x victoire et 2 pour y victoire.
la source
Clojure,
130118 octets-12 octets en se débarrassant de mon utilisation bizarre de
comp
.Je pensais que j'étais intelligent, mais cela a fini par être naïf par rapport à d'autres réponses, et beaucoup plus longtemps.
Prend les 2 premières lettres de chaque chaîne de déplacement, obtient les codes de caractères et les additionne. Il soustrait ensuite les sommes à obtenir
d
. Sid
est 0, c'est une égalité (0), s'il est dans l'ensemble de#{5 -16 12 -14 13 1 4 -18 2 11}
, p1 gagne (1), sinon, p2 gagne (2).Pour obtenir les "nombres magiques" qui définissent si P1 gagne, j'ai couru
Ce qui génère une liste de
d
valeurs pour chaque scénario possible:J'ai ensuite comparé le graphique des gains avec cette sortie. Heureusement, il n'y a pas eu de "collisions" autres que 0.
la source