Donner un défi impliquant une référence Star Trek juste après le 4 mai peut être mal vu, mais c'est parti.
Vous, Luke, Anakin, Palpatine, Yoda et Han Solo êtes impliqués dans un tournoi fou de Rock, Paper, Scissor, Lizard, Spock.
Le problème ici est que vous n'êtes autorisé à utiliser qu'un ordre fixe de mouvements. Si votre commande est "R", alors vous devez utiliser Rock, jusqu'à ce que vous perdiez ou gagniez contre tout le monde. Si votre commande est RRV, vous devez utiliser 2 Roches suivies d'un Spock et continuer à répéter jusqu'à ce que vous ayez gagné ou perdu.
Luke, Anakin, Palpatine, Yoda et Han Solo ont soumis leurs commandes respectives et vous, en tant que hacker expert, avez mis la main sur chacune de leurs commandes!
Avec cette connaissance, vous devez concevoir votre commande pour le tournoi. Puisque tout le monde veut gagner, vous voulez créer un ordre tel que vous gagnez le tournoi en battant tout le monde. Mais cela peut ne pas être possible en toutes circonstances.
Au cas où il y aurait une commande gagnante possible, imprimez-la. S'il n'y a aucun moyen possible de gagner, imprimez -1 (ou 0 ou Faux ou "impossible")
Entrée : une liste de 5 commandes
Sortie : une seule commande ou -1
Exemple d'entrée 1
R
P
S
L
V
Exemple de sortie 1
-1
Explication 1
Peu importe ce que vous jouez lors de votre premier coup, il y aura au moins une personne qui vous battra, il n'est donc pas possible pour vous de gagner.
Exemple d'entrée 2
RPS
RPP
R
SRR
L
Exemple de sortie 2
RPSP
Explication 2
Une fois que vous jouez Rock dans votre premier coup, vous finissez par battre "L" et "SRR" et vous égalisez contre les autres. C'est parce que le lézard et les ciseaux perdent contre Rock. Lorsque vous jouez à Paper ensuite, vous battrez "R" et vous égalerez contre les 2 restants. C'est parce que Rock perd contre Paper. La prochaine fois que vous jouerez à Ciseaux, vous gagnerez contre "RPP" alors que Scissor bat Paper.
Enfin, vous battrez "RPS" avec votre Paper comme Paper bat Rock.
Voici une liste de notations (vous pouvez utiliser n'importe quel 5 littéraux, mais veuillez préciser dans votre réponse):
R : Rock
P : Paper
S : Scissor
L : Lizard
V : Spock
Voici une liste de tous les résultats possibles:
winner('S', 'P') -> 'S'
winner('S', 'R') -> 'R'
winner('S', 'V') -> 'V'
winner('S', 'L') -> 'S'
winner('S', 'S') -> Tie
winner('P', 'R') -> 'P'
winner('P', 'V') -> 'P'
winner('P', 'L') -> 'L'
winner('P', 'S') -> 'S'
winner('P', 'P') -> Tie
winner('R', 'V') -> 'V'
winner('R', 'L') -> 'R'
winner('R', 'S') -> 'R'
winner('R', 'P') -> 'P'
winner('R', 'R') -> Tie
winner('L', 'R') -> 'R'
winner('L', 'V') -> 'L'
winner('L', 'S') -> 'S'
winner('L', 'P') -> 'L'
winner('L', 'L') -> Tie
winner('V', 'R') -> 'V'
winner('V', 'L') -> 'L'
winner('V', 'S') -> 'V'
winner('V', 'P') -> 'P'
winner('V', 'V') -> Tie
C'est du code-golf , donc moins d'octets gagnent.
PS: dites-moi si vous avez besoin de plus de cas de test.
Réponses:
Gelée , 29 octets
Un lien monadique qui accepte une liste de listes d'entiers (dont chacun est la stratégie d'un adversaire) qui produit une liste de listes d'entiers - dont chacune est une stratégie gagnante (donc une liste vide si aucune n'est possible).
(Ajoutez simplement
Ḣ
pour ne générer qu'une seule liste de stratégies ou0
si cela est impossible.)Essayez-le en ligne! (les formats de pied de page pour toujours afficher les listes)
Ou essayez une version mappée de lettres (où les stratégies sont prises et affichées sur leurs propres lignes en utilisant la
RPSVL
notation).Comment?
Les numéros sont choisis de telle sorte que tous ceux qui sont un nombre impair supérieur à un autre modulo cinq gagnent (c'est-à-dire qu'ils sont numérotés en contournant le bord d'un pentagone inscrit des lancers).
Le code joue chaque stratégie contre chaque stratégie (y compris eux-mêmes) pour deux fois plus de lancers que la stratégie la plus longue afin de s'assurer de trouver des perdants gardant ceux qui ne sont pas vaincus. La liste de stratégies qui en résulte contiendra une seule stratégie s'il y a un vainqueur absolu; pas de stratégies s'il n'y avait pas de gagnant; ou plusieurs stratégies s'il y a des joueurs de dessin. Après cela, un ensemble de mouvements gagnants est ajouté à chacune de ces stratégies.
la source
ZLḤ
parLÄ
.Ɗ
votre code, il ne fait même pas ce que vous avez pu penser - il moule chacun comme sa propre longueur, puis obtient les sommes cumulées de ces résultats, donc il comparera également les valeurs incorrectes. Essayez ceci par exemple - cela prend[[1,2,3,4,5],[6,7],[8]]
, moule chacun par la longueur de la liste entière (3) pour obtenir[[1,2,3],[6,7,6],[8,8,8]]
puis effectue une accumulation pour obtenir[[1,1+2,1+2+3],[6,6+7,6+7+8],[8,8+8,8+8+8]]
=[[1,3,6],[6,13,19],[8,16,24]]
.JavaScript (ES6),
122 115112 octetsPrend l'entrée comme un tableau de chaînes de chiffres, avec:
Essayez-le en ligne!
Comment?
Il s'agit d'une recherche en premier: nous essayons d'abord tous les coups à une étape donnée pour voir si nous pouvons gagner la partie. Si nous ne pouvons pas gagner maintenant, nous essayons d'ajouter un autre coup à chaque coup non perdant.
où
and
etxor
sont des opérateurs au niveau du bit.Commenté
la source
test(['P','P','S','P','P'])
la réponse doit être "SR" ou "SV".R ,
213190 octets-23 octets grâce à Giuseppe.
Essayez-le en ligne!
Si une solution existe, elle en génère une. S'il n'y a pas de solution, il génère une ligne de
NA
. Si ce format de sortie n'est pas acceptable, je peux le changer au prix de quelques octets.Les mouvements sont codés comme 1 = R, 2 = S, 3 = P, 4 = L, 5 = V, de sorte que la matrice des résultats est
(0 = pas de gagnant; 1 = joueur 1 gagne; 2 = joueur 2 gagne)
Une limite supérieure sur la longueur de la solution si elle existe est
n=sum(lengths(L))
où seL
trouve la liste des mouvements des adversaires. Le code crée toutes les stratégies de longueur possiblesn
(stockées dans la matricev
), les essaie toutes et affiche toutes les stratégies gagnantes.Notez que cette valeur de
n
rend le code très lent sur TIO, j'ai donc codé en dur dans le TIO,n=4
ce qui est suffisant pour les cas de test.Pour le premier cas de test, la sortie est
correspondant à la solution RLSL.
Pour le deuxième cas de test, la sortie est
ce qui signifie qu'il n'y a pas de solution.
Explication d'une version précédente (sera mise à jour lorsque je le pourrai):
Il
which
est nécessaire de se débarrasser des NA qui se produisent lorsque les deux joueurs tirent pour toujours.Je ne suis pas convaincu que ce soit la stratégie la plus efficace. Même si c'est le cas, je suis sûr que le code pour
m
pourrait être joué un peu.la source
lengths()
alias pour toujours revenir4
?v
...lengths
n=4
Emacs Lisp, 730 octets
Je n'ai pas trouvé d'interprète en ligne d'Emacs Lisp :( Si Emacs est installé, vous pouvez copier du code dans un
.el
fichier, copier quelques lignes de test ci-dessouset l'exécuter
$ emacs --script filename.el
.Comment ça fonctionne
Mon programme effectue d'abord une recherche approfondie avec parfois à comprendre qu'il est impossible de gagner et de mettre fin à la branche sur laquelle il se trouve.
Vous pouvez voir l'explication complète dans la version non abrégée du code:
la source