Mancala est le nom d'une famille de jeux de société qui impliquent généralement une série de tasses remplies de perles que les joueurs manipulent. Ce défi utilisera un ensemble de règles spécifiques pour une variante solitaire du jeu.
Le plateau se compose d'un "panier" à une extrémité, suivi d'un nombre infini de tasses, numérotées à partir de 1. Certaines tasses contiennent un certain nombre de perles. Si la n
troisième tasse contient exactement des n
perles, vous pouvez en "semer" les perles. Semer signifie retirer toutes les n
billes de la tasse, puis les déposer une par une dans chaque tasse en direction du panier. La dernière perle ira dans le panier. Le joueur gagne lorsque toutes les billes du plateau sont dans le panier.
De toute évidence, il existe de nombreuses planches qui ne peuvent pas être gagnées, comme s'il y a exactement une perle dans la deuxième tasse. Il n'y a pas de jeux légaux car toutes les tasses avec 0 perles ne peuvent pas être semées, et la deuxième tasse n'a pas assez de perles pour être semées. Ce n'est évidemment pas amusant, donc votre tâche sera de créer des planches gagnables.
Tâche
Étant donné un entier positif représentant un certain nombre de billes, une liste d'entiers non négatifs représentant le nombre de billes qui devraient être placées dans chaque tasse pour faire une planche gagnable, comme décrit ci-dessus. Cette liste ne doit pas contenir de zéros de fin.
Pour un nombre donné de billes, il y a toujours exactement une configuration de carte gagnable.
Manifestation
Ceci est une démonstration de la façon de jouer la carte gagnable pour et l'entrée de 4. La carte gagnable est [0, 1, 3]
. Nous commençons par le seul mouvement disponible, semant les perles de la troisième tasse pour l'obtenir [1, 2, 0]
. Maintenant , nous avons en fait un choix, mais le seul correct on sème la première coupe, obtenir: [0, 2, 0]
. Ensuite, nous semons la deuxième tasse en donnant [1, 0, 0]
et finalement nous semons à nouveau la première tasse pour obtenir toutes les tasses vides.
Cas de test:
1 => [1]
2 => [0, 2]
3 => [1, 2]
4 => [0, 1, 3]
5 => [1, 1, 3]
6 => [0, 0, 2, 4]
7 => [1, 0, 2, 4]
8 => [0, 2, 2, 4]
9 => [1, 2, 2, 4]
10 => [0, 1, 1, 3, 5]
11 => [1, 1, 1, 3, 5]
12 => [0, 0, 0, 2, 4, 6]
13 => [1, 0, 0, 2, 4, 6]
14 => [0, 2, 0, 2, 4, 6]
15 => [1, 2, 0, 2, 4, 6]
16 => [0, 1, 3, 2, 4, 6]
17 => [1, 1, 3, 2, 4, 6]
18 => [0, 0, 2, 1, 3, 5, 7]
19 => [1, 0, 2, 1, 3, 5, 7]
20 => [0, 2, 2, 1, 3, 5, 7]
Un grand merci à PeterTaylor pour avoir proposé un programme pour générer des cas de test!
la source
Réponses:
CJam (21 octets)
Démo en ligne
Explication
J'ai dérivé de façon indépendante la technique du "non-jeu" mentionnée dans cet article . Nous prouvons par induction qu'il existe exactement une planche gagnante pour un nombre donné de billes.
Cas de base: avec 0 perles, la seule planche gagnante est la vide.
Étape inductive: si nous semons à partir d'une tasse,
k
au prochain coup, la tassek
sera vide et chaque tasse plus proche du panier contiendra au moins une perle. Par conséquent, nous pouvons trouver le plateau gagnant unique avec desn
perles du plateau gagnant avec desn-1
perles en recherchant la tasse vide numérotée la plus basse, en prenant une perle du panier et une de chaque tasse en dessous de cette tasse vide, et en les plaçant toutes dans la tasse vide.Dissection
la source
Python,
4241 octetsla source
JavaScript (ES6),
6337 octetsPort de la réponse Python de @ orlp. Explication: Tenez compte du nombre total de billes dans les
i
tasses Th et supérieures. Chaque jeu de l'une de ces tasses enlèvera desi
perles de ce total. (Par exemple, sii
est 3 et que vous jouez à partir de la cinquième tasse, vous réduisez le nombre de perles dans cette tasse de cinq, mais vous ajoutez également une à la quatrième et à la troisième tasse.) Le total doit donc être un multiple dei
. Maintenant, lei-1
th cup ne peut pas conteniri
plus de perles, donc pour qu'il en laisse un multiple,i
il doit contenir le reste des perles moduloi
.Explication précédente (du lien @ xnor): L'approche naïve est la technique du "jeu inversé". Cela utilise l'observation selon laquelle faire un jeu vide une tasse, donc le jeu inversé recueille une perle de chaque tasse et les place dans la première tasse vide, comme ceci (63 octets):
Maintenant, pensez aux premières
i
tasses. Dans le cas où l'un d'eux est vide, le jeu inversé ajoutera1
au nombre total de perles dans ces tasses, tandis que dans le cas où aucun d'entre eux n'est vide, le jeu inversé soustrairai
le total, mais cela équivaut à ajouter du1
moduloi+1
. Aprèsn
les jeux inversés, la somme des perles dans les premièresi
tasses sera donc équivalente àn
moduloi+1
, ou autrement dit, le nombre de perles dans lai
e tasse sera équivalent àn
moins la somme des perles dans les tasses précédentes, moduloi+1
. Maintenant, pour que lai
e tasse soit jouable, le nombre de perles ne peut pas dépasseri
, donc en fait, il sera égal au nombre de perles restantes moduloi+1
. (Notez que j'utilised=i+1
car il utilise moins d'octets.)la source
+
pas une chose dans ES6?Rubis, 36 octets
Un portage de la réponse de @ orlp parce que c'est beaucoup trop de génie pour moi de penser à quelque chose de mieux.
la source