Planches Mancala Solitaire Winnable

10

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 ntroisième tasse contient exactement des nperles, vous pouvez en "semer" les perles. Semer signifie retirer toutes les nbilles 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!

FryAmTheEggman
la source

Réponses:

5

CJam (21 octets)

M{_0+0#_Wa*\)+.+}ri*`

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, kau prochain coup, la tasse ksera vide et chaque tasse plus proche du panier contiendra au moins une perle. Par conséquent, nous pouvons trouver le plateau gagnant unique avec des nperles du plateau gagnant avec des n-1perles 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

M           e# Start with an empty board
{           e# Loop
  _0+0#     e#   Find position of first 0 (appending to ensure that there is one)
  _Wa*      e#   Make array of that many [-1]s
  \)+       e#   Append the index plus 1 (since board is 1-indexed)
  .+        e#   Pointwise addition
}
ri*         e# Read integer from stdin and execute loop that many times
`           e# Format for display
Peter Taylor
la source
9

Python, 42 41 octets

m=lambda n,i=2:n*[1]and[n%i]+m(n-n%i,i+1)
orlp
la source
4

JavaScript (ES6), 63 37 octets

f=(n,d=2)=>n?[n%d,...f(n-n%d,d+1)]:[]

Port de la réponse Python de @ orlp. Explication: Tenez compte du nombre total de billes dans les itasses Th et supérieures. Chaque jeu de l'une de ces tasses enlèvera des iperles de ce total. (Par exemple, si iest 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 de i. Maintenant, le i-1th cup ne peut pas contenir iplus de perles, donc pour qu'il en laisse un multiple, iil doit contenir le reste des perles modulo i.

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):

f=n=>n?[...a=f(n-1),0].some((m,i)=>(m?a[i]--:a[i]=i+1)>m)&&a:[]

Maintenant, pensez aux premières itasses. Dans le cas où l'un d'eux est vide, le jeu inversé ajoutera 1au nombre total de perles dans ces tasses, tandis que dans le cas où aucun d'entre eux n'est vide, le jeu inversé soustraira ile total, mais cela équivaut à ajouter du 1modulo i+1. Après nles jeux inversés, la somme des perles dans les premières itasses sera donc équivalente à nmodulo i+1, ou autrement dit, le nombre de perles dans la ie tasse sera équivalent à nmoins la somme des perles dans les tasses précédentes, modulo i+1. Maintenant, pour que la ie tasse soit jouable, le nombre de perles ne peut pas dépasser i, donc en fait, il sera égal au nombre de perles restantes moduloi+1. (Notez que j'utilise d=i+1car il utilise moins d'octets.)

Neil
la source
Vous avez oublié d'assigner la fonction dans la version en utilisant la solution de @ orlp, empêchant la récursivité de fonctionner. En ce qui concerne également cette solution, la concaténation de tableaux n'est-elle +pas une chose dans ES6?
Value Ink
@KevinLau Oups, et qu'après avoir pris la peine de l'inclure aussi dans le nombre d'octets! Mais non, + est une concaténation de chaînes, sauf si les deux paramètres sont des nombres ou des booléens, auquel cas il s'agit de l'addition. Heureusement, les compréhensions de tableaux facilitent la concaténation arbitraire.
Neil
2

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.

m=->n,i=2{n>0?[n%i]+m[n-n%i,i+1]:[]}
Encre de valeur
la source