Bulgarian Solitaire est un jeu solo rendu populaire par Martin Gardner dans sa chronique mathématique de Scientific American .
Vous avez des N
cartes identiques, divisées en piles. Vous prenez une carte de chaque pile et formez une nouvelle pile avec les cartes retirées. Vous répétez ce processus jusqu'à ce que vous atteigniez un état que vous avez déjà vu et continuer ainsi répéterait la boucle.
Par exemple, disons que vous avez des 8
cartes, divisées en une pile de 5
et une pile de 3
. Nous écrivons les tailles de pile dans l' ordre décroissant: 5 3
. Voici une transcription du jeu:
5 3
4 2 2
3 3 1 1
4 2 2
Vous retirez d'abord une carte de chacune des deux piles, laissant des piles de 4
et 2
, et une pile nouvellement créée de 2
, donnant 4 2 2
. Dans l'étape suivante, ces diminutions sont 3 1 1
suivies d'un nouveau tas de 3
. Enfin, la dernière étape vide les piles de taille 1
et produit 4 2 2
ce qui est déjà apparu, alors on s'arrête.
Notez que la somme des tailles de pile reste la même.
Votre objectif est d'imprimer une telle transcription du jeu à partir d'une configuration de départ donnée. C'est le golf de code, donc le moins d'octets gagne.
Contribution
Une liste de nombres positifs par ordre décroissant représentant les tailles de pieux initiales. Prenez l'entrée via STDIN ou l'entrée de fonction. Vous pouvez utiliser n'importe quelle structure de type liste que vous souhaitez.
Vous n'obtenez pas le nombre total de cartes N
en entrée.
Production
Imprimez la séquence des tailles de pile que traverse le jeu Bulgarian Solitaire. Notez que l'impression est requise, pas de retour. Chaque étape doit être sa propre ligne.
Chaque ligne doit avoir une séquence de nombres positifs dans l'ordre décroissant sans aucun 0
. Vous pouvez avoir des séparateurs et des jetons de début et de fin (par exemple, [3, 3, 1, 1]
). Les numéros peuvent avoir plusieurs chiffres, ils doivent donc être séparés d'une manière ou d'une autre.
Imprimez les fractionnements de la taille des piles que vous voyez jusqu'à ce que la répétition soit incluse. Ainsi, la première ligne doit être l'entrée et la dernière ligne doit être une répétition d'une ligne précédente. Il ne devrait pas y avoir d'autres répétitions.
Cas de test
>> [1]
1
1
>> [2]
2
1 1
2
>> [1, 1, 1, 1, 1, 1, 1]
1 1 1 1 1 1 1
7
6 1
5 2
4 2 1
3 3 1
3 2 2
3 2 1 1
4 2 1
>> [5, 3]
5 3
4 2 2
3 3 1 1
4 2 2
>> [3, 2, 1]
3 2 1
3 2 1
>> [4, 4, 3, 2, 1]
4 4 3 2 1
5 3 3 2 1
5 4 2 2 1
5 4 3 1 1
5 4 3 2
4 4 3 2 1
v$input()$
parQ
. 2. Si vous stockez la liste par ordre décroissant, vous n'avez pas besoinN
du tout:W!}QYQ~Y]Q=Q_S+fTmtdQ]lQ;Q
QW!}QY~Y]Q=Q_S+]lQfTmtdQQ
. C'est exactement la même chose, caractère pour caractère, jusqu'à la commutativité.CJam, 26 octets
Essayez-le en ligne.
Exemple d'exécution
la source
:p
je travaillais, je pourrais ...:p
Rubis, 98
Explication
Array
.Hash
g
.Array#map
pour diminuer chaque élément de 1, ajoutez la longueur de l'Array
élément en tant qu'élément, triez-le dans l'ordre décroissant et supprimez l'élément0
.g
suffit de vérifier s'il possède une clé pour un nouvel état de jeu.la source
sort_by
chose soit certainement intelligente,sort.reverse
est en fait un caractère plus court ^^CJam,
35 3433 octets(Merde, cette coupure de courant que je n'étais pas le premier à poster dans CJam)
Contribution:
Production:
Essayez-le en ligne ici
la source
Python 2 - 103
Similaire à la réponse de Quincunx, mais remplace les ajouts par des ajouts et supprime les deux dernières lignes.
Exemple de sortie:
la source
GolfScript,
5046Peut presque certainement être joué plus loin. Essayez-le ici.
la source
Haskell, 99
la source
CJam,
403634 octetsTestez-le ici. Entrez l'entrée comme un tableau de style CJam, comme
[5 3]
dans le champ STDIN. Le format de sortie est similaire, donc les crochets et les espaces comme délimiteurs.Même si je joue plus loin (ce qui est certainement possible), il n'y a aucun moyen de battre Pyth avec ça. Il est peut-être temps d'apprendre J. Explication plus tard.
la source
JavaScript (E6) 113
Pire entrée jusqu'à présent :(
Test dans la console FireFox / FireBug
Production
la source
Python 2,
148130101 101Cela se souvient simplement de toutes les itérations précédentes et vérifie si la nouvelle est dans cette liste. Ensuite, il l'imprime.
Exemple d'exécution:
Contribution:
Production:
Edit: J'ai relu les spécifications pour le golf, et appliqué beaucoup de golf.
la source
[4,2,2]
. Il existe cependant une solution simple.Python 3: 89 caractères
Tout comme les solutions Python déjà publiées, mais avec des appels de fonction récursifs plutôt que des boucles. La liste
s
stocke les divisions déjà vues et court-circuite la récursion en cas de répétition.La fonction
print()
(c'est Python 3) doit juste être appelée d'une manière ou d'une autre dans chaque boucle. La chose délicate est que alambda
ne permet qu'une seule expression, donc nous ne pouvons pas le faireprint(l);...
. En outre, il génère des résultatsNone
, ce qui est difficile à utiliser. Je finis par mettreprint(l)
d'un côté une inégalité;==
ne fonctionne pas pour une raison que je ne comprends pas.Une approche alternative de le coller dans une liste utilise autant de caractères.
L'utilisation
print(*l)
formaterait les sorties comme4 2 2
plutôt que[4,2,2]
.la source