Contexte
Dans le jeu de Nim , les joueurs alternent en retirant les "pierres" des "piles": à chaque tour, un joueur doit retirer entre une et toutes les pierres d'une seule pile. Le but de Nim est de prendre la dernière pierre ou, dans la variante misere, de forcer votre adversaire à le faire - cependant, il s'avère que les stratégies sont presque identiques.
Nim fait un jeu de bar amusant. Vous pouvez utiliser des allumettes ou des pièces pour les "pierres" et les "piles" sont généralement disposées en ligne. Vous trouverez ci-dessous une configuration classique avec des piles de 1, 3, 5 et 7:
Si vous n'avez jamais joué à Nim auparavant, vous pouvez vous y essayer avant de tenter ce défi. Voici une version appelée "Pearls Before Swine" .
Stratégie
La stratégie optimale dans Nim est suffisamment délicate pour que la plupart des profanes perdent systématiquement face à un expert, mais simple à décrire avec l' arithmétique binaire .
Cependant, effectuer des opérations XOR binaires mentales est difficile, donc heureusement, il existe un moyen équivalent de visualiser la bonne stratégie qui est plus facile à mettre en œuvre en temps réel, même lorsqu'il est ivre.
Il n'y a que trois étapes:
- Regroupez mentalement les "pierres" de chaque ligne en sous-groupes dont les tailles sont des puissances de 2, en commençant par la plus grande taille possible: 8, 4, 2 et 1 suffisent pour la plupart des jeux.
- Essayez de faire correspondre chaque groupe avec un jumeau d'une autre ligne, afin que chaque groupe ait une paire.
- Si ce n'est pas possible, supprimez les "pierres" non appariées d'une seule ligne (ce sera toujours possible - voir le lien Wikipedia pour savoir pourquoi) afin que l'étape 2. devienne possible.
Ou, a dit une autre façon: "Retirez des pierres d'une seule pile de sorte que si vous regroupez ensuite les piles en pouvoirs de 2, tous les groupes peuvent être associés à un groupe dans une autre pile." Avec la mise en garde que vous ne pouvez pas diviser des pouvoirs plus grands de 2 en plus petits - par exemple, vous ne pouvez pas grouper une ligne avec 8 pierres en deux groupes de 4.
Par exemple, voici comment vous visualisez le tableau ci-dessus:
Ce plateau est parfaitement équilibré, vous voudrez donc que votre adversaire bouge en premier.
Le défi
Étant donné une liste d'entiers positifs représentant la taille des "piles" Nim, renvoyez une visualisation en texte brut de la carte Nim vue par un expert.
Ce qui constitue une visualisation valide est mieux expliqué par l'exemple, mais vous devez:
- Attribuez un caractère distinct à chaque "sous-groupe power-of-2" et à sa paire (les sous-groupes non appariés ne sont pas qualifiés), et utilisez ce caractère pour représenter les "pierres" du sous-groupe et de la paire.
- Représenter les « pierres » non appariés (c. -à ceux d' un expert supprimerait lors de la lecture normale - pas misere - Nim) à l' aide d' un trait d' union:
-
.
Il y aura plusieurs façons d'obtenir une visualisation valide, et toutes sont valides. Passons en revue quelques cas de test:
Cas de test
Entrée: 1, 3, 5, 7
Résultat possible 1:
A
BBA
CCCCD
CCCCBBD
Vous pouvez éventuellement inclure des espaces entre les caractères, ainsi que des lignes vides entre les lignes:
Résultat possible 2:
A
B B A
C C C C D
C C C C B B D
Entrée: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
L'ordre et le choix des personnages peuvent être ceux que vous aimez:
Résultat possible 1:
G
E E
E E G
C C C C
C C C C F
B B B B D D
B B B B D D F
H H I - - - - -
A A A A A A A A I
A A A A A A A A H H
Les symboles Unicode sont également corrects:
Résultat possible 2:
◎
◈ ◈
◈ ◈ ◎
△ △ △ △
△ △ △ △ ◉
◐ ◐ ◐ ◐ ◀ ◀
◐ ◐ ◐ ◐ ◀ ◀ ◉
▽ ▽ ◒ - - - - -
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ◒
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ▽ ▽
Entrée: 7
Il résulte des règles que toute "pile unique" doit être complètement supprimée.
Résultat possible 1:
-------
Résultat possible 2:
- - - - - - -
Entrée: 5, 5
Sortie possible:
A A A A B
A A A A B
Règles supplémentaires
- C'est du golf de code avec des règles standard. Le code le plus court gagne.
- La saisie est flexible et peut être effectuée sous la forme de liste qui vous convient.
- La sortie est également flexible, comme l'illustrent les exemples ci-dessus. Les variations les plus raisonnables seront autorisées. Demandez si vous n'êtes pas sûr de quelque chose.
["H","EE","EEH","CCCC","CCCCI","DDDDFF","DDDDFFI","AAAAAAAA","AAAAAAAA-","----------"]
AAAABBBB
, ilABB
n'est pas valide et ne l'est pas - mais cela rend la sortie moins lisible, donc je pense que faire une décroissance dans une ligne est une règle explicite.Réponses:
Rubis,
169164148 octetsEssayez-le en ligne!
Tout d'abord, nous initialisons
s=eval a*?^
(qui est plus courte quea.reduce:^
)c
, qui stocke le premier caractère unique inutilisém
qui mappe des longueurs de puissance de deux aux caractères utilisés pour les représenterEnsuite, en bouclant sur chaque pile, nous exécutons ce qui suit:
Selon la stratégie de Wikipedia , si la pile XOR à somme nim est inférieure à la pile , nous devons retirer les pierres de cette pile de sorte que sa longueur devienne une pile XOR à somme nim . En stockant la différence dans la variable
z
, nous pouvons tester pour voir si cette différence est positive, et si c'est le cas 1.) imprimer autant de tirets, 2.) la soustraire de la pile, et 3.) définir la variable nim-sum sur zéro pour empêcher un retrait ultérieur de la pierre.Maintenant, nous "bouclons" sur chaque bit et gardons une trace de leurs valeurs en divisant
x
par2
et en multipliant l'accumulateurn
par2
. La boucle est en fait une chaîne évaluéex
fois, ce qui est bien plus long quelog2(x)
nécessaire, mais aucun mal n'est fait (à part l'inefficacité). Pour chaque bit, nous exécutons ce qui suit si le bit est 1 (x&1>0
):Imprimer un caractère
n
fois. Si nous avons déjà imprimé un groupe non apparié de ces nombreuses pierres, utilisez ce caractère; sinon, utilisez le prochain caractère inutilisé (avancementc
sur place en raison du!
).S'il
m[n]
existait (c'est-à-dire que nous venons de terminer une paire), ilm[n]
est réinitialisé. Sinon, nous venons de commencer une nouvelle paire, donc définissezm[n]
le caractère que nous avons utilisé (*1
c'est un moyen rapide de faire une copie dec
).la source
Python 2 ,
150196206 octetsEssayez-le en ligne!
la source
4, 9, 10
.14, 21, 35
.There will be multiple ways to achieve a valid visualization, and all are valid
JavaScript (ES6), 215 octets
Visualise uniquement jusqu'à 36 caractères différents. Je suis soulagé que cela fonctionne
1, 3, 4, 5
.la source
Nettoyer , 454 octets
toujours au golf
Essayez-le en ligne!
Définit la fonction
$ :: [Int] -> String
, en prenant les tailles de pile et en retournant une chaîne où-
dénoter les pierres à retirer, et les groupes sont représentés par des caractères ASCII ascendants-
. Si suffisamment de groupes sont nécessaires, les personnages finiront par revenir en arrière et, à cause defoldr
cela, il nécessite plus d'un gigaoctet de mémoire pour exécuter le deuxième cas de test.Version en retrait de la compréhension géante:
la source