Construisons une simulation pour un aspect du jeu de cartes, que je connais personnellement sous le nom néerlandais 'Oorlog' (qui se traduit par 'War').
Comment fonctionne 'Oorlog'?
Deux jeux de cartes (comprenant chacun deux Jokers) sont également répartis entre le nombre de joueurs jouant. Chaque joueur mélange son propre stock, le place à l'envers devant lui, et tous les joueurs ouvrent la première carte du stock en même temps.
Le vainqueur de cette «bataille» est déterminé par les valeurs des cartes suivant ces règles: Joker / Ace bat King; Le roi bat la reine; La reine bat Jack; Jack bat 10; 10 défaites 9; .... De plus, les 2 et 3 battent Ace / Joker. La dernière règle peut conduire à un cycle où 2 ou 3 bat Ace ou Joker, Ace ou Joker bat une autre carte, qui à son tour bat 2 ou 3. Dans ce cas, le 2 ou 3 gagne la bataille.
(Le costume n'est pas pertinent dans ce jeu de cartes.)
Lorsque deux joueurs ou plus ont les cartes les plus élevées égales, ils ont une «guerre». Cela signifie qu'ils mettent une carte à l'envers, puis chacun ouvre une nouvelle carte de leur stock, recherchant à nouveau qui a la carte la plus élevée. Cela continue jusqu'à ce qu'un seul joueur remporte la bataille entière.
(Toutes les cartes de cette bataille vont dans la pile de défausse du joueur qui a gagné la bataille. Ensuite, tout le monde ouvre une nouvelle carte. Lorsque le stock d'un joueur n'a plus de cartes, il retourne sa pile de défausse et continue avec ce nouveau stock. Cela continue jusqu'à ce qu'un joueur ait épuisé toutes ses cartes, puis le joueur avec le plus grand nombre de cartes gagne.)
Exemple de «batailles» avec trois joueurs:
- 4, 8, Jack:
Jack gagne. - 7, Ace, Queen:
Ace gagne. - 10, 10, King:
King gagne. - 3, Joker, 2:
3 victoires. - Ace, Joker, 2:
2 gagne. - 3, Queen, Ace:
3 victoires. - Queen, Queen, 9:
Queen & Queen ont une «guerre», elle continue donc avec deux nouvelles cartes: 4, 8;
8 victoires. - 4, 4, 4:
Tous mènent une «guerre», donc cela continue avec trois nouvelles cartes: 8, Ace, 2;
2 victoires. - Jack, 5, Jack:
Jack et Jack ont une «guerre», donc ça continue avec deux nouvelles cartes: 5, 5;
5 et 5 sont également égaux, la «guerre» continue donc avec deux nouvelles cartes: 10, King;
Le roi gagne. - Joker, Joker, Ace:
Tous ont une «guerre», donc ça continue avec trois nouvelles cartes: 9, 7, 9;
9 et 9 sont également égaux, donc la «guerre» continue avec deux nouvelles cartes: Jack, 3;
Jack gagne.
Alors, sur le défi du code:
Contribution:
STDIN avec un tableau ou une chaîne simulant un tableau (votre appel - même si votre langue prend en charge les tableaux). Ce tableau contient les cartes d'une bataille dans l'ordre chronologique (voir les cas de test pour une meilleure compréhension de cela).
Production:
STDOUT l'index du joueur qui a gagné la bataille.
Vous pouvez choisir si vous voulez un (c. -à -indexé zéro 0
, 1
ou 2
) ou une sortie indexée ( par exemple 1
, 2
, 3
).
Règles du défi:
- L'entrée sera un seul tableau / chaîne représentant un tableau. Vous ne pouvez donc pas avoir un tableau de tableaux pour le simplifier. Vous ne pouvez pas non plus avoir d'objets de substitution pour les cartes ne participant pas à la guerre.
- Nous utilisons des notations numériques pour les faces-cartes au lieu de la notation des lettres. Donc Ace / Joker =
1
; Jack =11
; Reine =12
; et King =13
. - Dans ce défi, nous pouvons supposer que nous jouons toujours avec 3 joueurs .
- Les trois premiers indiquent le début de la «bataille». Lorsque deux joueurs ou plus ont une «guerre», les cartes continues dans le tableau indiquent leur bataille (voir les cas de test pour une meilleure compréhension de cela).
Règles générales:
- Il s'agit du code-golf , donc la réponse la plus courte en octets l'emporte.
Cela ne signifie pas que les langues qui ne jouent pas au golf ne devraient pas entrer. Essayez de trouver une réponse code-golf aussi courte que possible pour «chaque» langage de programmation. - Veuillez indiquer quelle indexation (zéro ou un indexé) vous avez utilisée pour la sortie.
Cas de test:
Test case 1: [4, 8, 11] -> 2 (or 3)
Test case 2: [7, 1, 12] -> 1 (or 2)
Test case 3: [10, 10, 13] -> 2 (or 3)
Test case 4: [3, 1, 2] -> 0 (or 1)
Test case 5: [1, 1, 2] -> 2 (or 3)
Test case 6: [3, 12, 1] -> 0 (or 1)
Test case 7: [12, 12, 9, 4, 8] -> 1 (or 2)
Test case 8: [4, 4, 4, 8, 1, 2] -> 2 (or 3)
Test case 9: [11, 5, 11, 5, 5, 10, 13] -> 2 (or 3)
Test case 10: [1, 1, 1, 9, 7, 9, 11, 3] -> 0 (or 1)
Test case 11: [13, 13, 4, 1, 3] -> 1 (or 2)
Test case 12: [13, 4, 13, 2, 3] -> 2 (or 3)
la source
Réponses:
q - 142 caractères
Remarque: zéro indexé.
Il n'y a aucune notion de lecture de stdin dans q, vous devriez donc l'appeler comme une fonction:
{p:til 3;while[1<(#:)p;h:(n:(#:)p)#x;x:n _x;$[1~min h;p:$[max a:h in(2;3);$[1<(#:)(?:)h(&:)a;p(&:)h=3;p(&:)a];p(&:)h=1];p:p(&:)h=max h]];(*:)p}[1,2,3]
Assez long, en fait, mais il y a beaucoup de cas d'angle. Il conserve une liste de joueurs actifs et consomme la liste des cartes en boucle. La chose la plus problématique est de détecter le bon gagnant dans les mains
[13, 2, 3]
, comme les3
battements2
, comme d'habitude, mais il a dû être dupliqué pour être placé dans le boîtier du coin.la source
JavaScript (ES6), 146 octets
Renvoie un index de base zéro. 127 octets si on me permet l'accord initial en tant que tableau séparé (cela fonctionne aussi pour un nombre arbitraire de mains bien sûr):
la source
Java 8, 257 octets
Ok, mon défi est plus difficile que je ne le pensais avec tout dans un seul tableau comme ça. ;) Mais comme cela fait plus d'un an que j'ai posté ce challenge, j'ai décidé de l'essayer moi-même. Cela m'a pris un bon moment avec plusieurs solutions de rechange et bizarreries .. Donc, il peut certainement être joué au golf encore plus, mais j'examinerai cela une autre fois. Cela a déjà pris beaucoup plus de temps que prévu.
Explication:
Essayez-le ici.
la source