Étant donné deux listes de lancers de dés pour une bataille à risque, votre programme ou fonction doit générer le nombre de troupes perdues par chaque joueur.
Contexte
Vous n'êtes pas obligé de lire ceci, car ce n'est qu'un arrière-plan. Passez à la sous-rubrique "Tâche" pour continuer sans relâche.
Dans le jeu de Risque , un joueur peut attaquer un autre joueur (en fait, c'est nécessaire pour gagner). Le résultat d'une bataille est déterminé par le lancer de dés. Chaque bataille se déroule comme une succession de sous-batailles dans lesquelles chaque joueur peut perdre jusqu'à 2
ses pièces d'armée.
Dans une sous-bataille, le défenseur et l'attaquant lancent chacun plusieurs dés dont le nombre peut varier en fonction de circonstances non pertinentes pour ce défi. Le dé le plus précieux de l'attaquant est comparé au dé le plus précieux du défenseur. Si le dé de l'attaquant est supérieur au dé du défenseur, le défenseur perd une pièce. Sinon, l'attaquant perd une pièce.
Ensuite, si les deux joueurs ont au moins deux dés, les deuxièmes dés les plus élevés des deux joueurs sont comparés. Encore une fois, si le dé de l'attaquant est supérieur au dé du défenseur, le défenseur perd une pièce. Sinon, l'attaquant perd une pièce.
(Le défenseur gagne des égalités. Si le défenseur et l'attaquant réussissent tous les deux 4
, l'attaquant perd un morceau.)
Dans cette sous-bataille de l'article de Wikipédia, les dés de l'attaquant sont rouges et les dés du défenseur sont blancs. Le plus haut des dés de l'attaquant est 4
le plus élevé des dés du défenseur 3
. Comme l'attaquant était plus haut, le défenseur perd un morceau. Les deuxièmes plus élevés sont 3
pour l'attaquant et 2
pour le défenseur. Comme l'attaquant était à nouveau plus haut, le défenseur perd un autre morceau. Ainsi, dans cette sous-bataille, l'attaquant ne perd aucune pièce et le défenseur perd des 2
pièces.
Notez que les troisièmes pièces les plus élevées ne sont pas comparées. En effet, le défenseur n'a pas plus de deux dés sur une seule sous-bataille, il n'y a donc pas de troisième pièce la plus élevée à comparer.
Tâche
Compte tenu des lancers de dés non triés (nombres entiers compris entre 1 et 6 inclus) de l'attaquant et du défenseur d'une sous-bataille de Risk sous n'importe quelle forme pratique, affichez le nombre de pièces d'armée que chaque joueur perd. La sortie peut être sous n'importe quelle forme pratique, tant qu'elle a des sorties différentes pour indiquer les cinq possibilités. Vous devez indiquer quelles sont ces différentes sorties dans votre question.
La sortie est déterminée comme suit: Commencez par def=0
et atk=0
. Si la plus grande valeur de la liste des dés de l'attaquant est supérieure à la plus grande valeur de la liste des dés du défenseur, alors incrémentez def
. Sinon, incrémentez atk
.
Si les deux listes de lancers de dés ont au moins une longueur 2
, alors: si la deuxième plus grande valeur de la liste des lancers de dés de l'attaquant est supérieure à la deuxième plus grande valeur de la liste, alors incrémentez def
et augmentez autrement atk
.
Enfin, le programme ou la fonction doit sortir un identifiant unique pour chacune des 5 possibilités de sortie suivantes:
╔═══╦═══╗
║atk║def║
╠═══╬═══╣
║ 1 ║ 0 ║
║ 0 ║ 1 ║
║ 2 ║ 0 ║
║ 1 ║ 1 ║
║ 0 ║ 2 ║
╚═══╩═══╝
Exemple
Défenseur: [3, 2]
Attaquant: [2, 4, 1]
Max du défenseur est 3
et max de l'attaquant 4
. 4>3
, donc le def=1
deuxième du défenseur est 2
et le deuxième de l'attaquant 2
. Not(2>2)
, donc atk=1
. La sortie pourrait alors être [1,1]
.
Cas de test
Defender
Attacker
Output (as [def,atk])
-----
[1]
[1]
[0,1]
-----
[6,6]
[1,1,1]
[0,2]
-----
[1,2]
[5,2,3]
[2,0]
-----
[5]
[3,4]
[0,1]
-----
[4]
[4,5]
[1,0]
-----
[1,3]
[1,2,3]
[1,1]
-----
[4]
[4,5,6]
[1,0]
-----
[4,5]
[6,2]
[1,1]
-----
[5]
[6,1,3]
[1,0]
-----
[5,5]
[4,4,1]
[0,2]
-----
[2,5]
[2,2]
[0,2]
-----
[6,6]
[4,4,3]
[0,2]
-----
[2,1]
[4,3]
[2,0]
-----
[4]
[1,5]
[1,0]
-----
[1]
[5,2]
[1,0]
-----
[6,2]
[4]
[0,1]
-----
[4,2]
[2,5,5]
[2,0]
-----
[2]
[6,6,2]
[1,0]
-----
[6]
[2,6]
[0,1]
-----
[3,1]
[1]
[0,1]
-----
[6,2]
[3,5,2]
[1,1]
-----
[4,2]
[1,1]
[0,2]
-----
[4,3]
[5,4,1]
[2,0]
-----
[5,6]
[1,2]
[0,2]
-----
[3,2]
[4,4]
[2,0]
-----
[2]
[6,3,4]
[1,0]
-----
[1,4]
[6,2,4]
[2,0]
-----
[4,2]
[2,5,4]
[2,0]
-----
[5]
[6,2,1]
[1,0]
-----
[3]
[2,5,4]
[1,0]
-----
[5,4]
[2]
[0,1]
-----
[6,3]
[2,6,5]
[1,1]
-----
[3,1]
[4]
[1,0]
-----
[4]
[6,6,5]
[1,0]
-----
[6,3]
[4,2]
[0,2]
-----
[1,6]
[5,4]
[1,1]
-----
[3,6]
[4,4]
[1,1]
-----
[5,4]
[5,1,1]
[0,2]
-----
[6,3]
[5,4]
[1,1]
-----
[2,6]
[1,2]
[0,2]
-----
[4,2]
[3,5,5]
[2,0]
-----
[1]
[1,2,1]
[1,0]
-----
[4,5]
[1,6]
[1,1]
-----
[1]
[3,5,1]
[1,0]
-----
[6,2]
[6,2]
[0,2]
Exemple d'implémentation
Python 2 ou 3
def risk(atk_rolls,def_rolls):
# set the rolls in descending order, e.g. [5,3,2]
atk_rolls = sorted(atk_rolls,reverse = True)
def_rolls = sorted(def_rolls,reverse = True)
# minimum length.
minlen = min(len(atk_rolls),len(def_rolls))
atk_lost = 0
def_lost = 0
# compare the highest-valued rolls
if atk_rolls[0]>def_rolls[0]:
def_lost += 1
else:
atk_lost += 1
if minlen == 2:
# compare the second-highest-valued rolls
if atk_rolls[1] > def_rolls[1]:
def_lost += 1
else:
atk_lost += 1
return [def_lost, atk_lost]
Caractéristiques
- L'entrée peut être prise sous n'importe quelle forme qui code clairement uniquement les rôles du défenseur et les rôles de l'attaquant.
- La sortie peut être sous n'importe quelle forme qui fournit une sortie unique pour chacune des cinq possibilités énumérées ci-dessus.
- Les jets du défenseur sont une liste
1
ou des2
entiers dans l'ensemble[1,2,3,4,5,6]
. Les rouleaux de l'attaquant sont une liste1
d'3
entiers dans l'ensemble[1,2,3,4,5,6]
. - Puisqu'il s'agit de code-golf , le code le plus court dans chaque langue gagne! Ne laissez pas les réponses dans les langues de golf vous décourager de publier des réponses dans d'autres langues.
la source
Réponses:
Portes NAND, 237
Créé avec Logisim
Les entrées sont des binaires non signés de 3 bits, saisis à gauche. Les sorties (2 bits) sont à droite.
Il est trop grand pour tenir sur l'écran et Logisim ne peut pas zoomer, donc l'image est en noir et blanc. Pardon :(
Fonctionne pour tous les cas de test.
Il existe probablement un meilleur moyen de le faire en utilisant un circuit de mémoire, permettant de réutiliser de grandes sections.
la source
Gelée ,
1211 octetsUn lien monadique prenant une liste de
Defender, Attacker
rôles (chacun sous forme de listes), renvoyant un entier entre-2
et2
inclus (pertes défenseur - pertes attaquant):Essayez-le en ligne! ou consultez une suite de tests (qui mappe les résultats au format OP).
Comment?
la source
Rétine , 82 octets
Essayez-le en ligne! La première ligne d'entrée est les dés de l'attaquant, la seconde est les dés du défenseur. Retours (sur des lignes séparées)
AA
,AD
,DD
,A
ou ,D
selon le cas.la source
Python 2 ,
8375 octetsEssayez-le en ligne!
La sortie est les pertes du défenseur - les pertes de l'attaquant
la source
MATL , 23 octets
Essayez-le en ligne!
Je ne sais pas pourquoi les défenseurs ont plus de dés que les attaquants, mais peut-être que je ne connais pas très bien le risque. Le programme de base est juste
>t~,sD
, tous les autres octets sont là pour permettre différentes longueurs d'entrée, avec un peu de tri. L'entrée est l'attaquant suivi du défenseur, la sortie est les pertes de l'attaquant suivies des pertes du défenseur.la source
JavaScript (SpiderMonkey) ,
978378 octetsEssayez-le en ligne!
-4 octets et fixe grâce à @ovs et @Craig Ayre
-1 octet grâce à @Shaggy
la source
d=>a=>{for(u=v=0;d.sort()>[]&a.sort()>[];)a.pop()>d.pop()?u++:v++;return[u,v]}
Husk , 10 octets
Essayez-le en ligne!
Entrez comme deux listes distinctes de rouleaux, sortez comme dans l'op.
Explication
¤z>Ö>
trie chaque liste par ordre décroissant puis les zippe en comparant les éléments correspondants (et en tronquant la liste la plus longue).M#eI¬
crée une liste à 2 éléments (e
) avec les décomptes (#
) des valeurs véridiques (grâce à l'identitéI
) et des valeurs fausses (via la négation logique¬
)la source
Perl 5 , 66 + 1 (-a) = 67 octets
Essayez-le en ligne!
Contribution:
Deux lignes. La première ligne est le défenseur (joueur 1), la deuxième est l'attaquant (joueur 2). Rouleaux individuels séparés par des espaces.
Production:
Indique un changement efficace de la force du défenseur par rapport à l'attaquant.
la source
Gelée , 30 octets
Essayez-le en ligne!
Veeeeeeeery non golfé! > _ <
Affiche les valeurs exactement comme dans les cas de test.
la source
R , 46 octets
Essayez-le en ligne!
Tout cela ne fait que trois sortes et une comparaison ... plus l'extraction des deux premiers éléments au milieu.
L'entrée est deux vecteurs de lancers de dés.
Sortie codée comme suit:
Fonctionne car l'extraction dans R ne recycle pas son argument, mais remplit le résultat avec
NA
pour obtenir la longueur demandée.la source