L'accordéon est un jeu de cartes solitaire que j'ai récemment rencontré où presque toutes les mises en page sont résolubles, mais incroyablement difficiles. Vous pouvez y jouer ici .
Règles
52 cartes face sont placées face visible dans un ordre aléatoire. À chaque tour, vous remplacez une carte par une carte ultérieure, où les deux cartes :
- Partagez un costume ou un numéro et
- Sont à une distance de 1 (adjacent) ou 3 (deux cartes entre les deux).
La partie est gagnée lorsqu'il ne reste qu'une seule carte . Vous pouvez supposer que chaque entrée est résoluble. La carte remplacée doit toujours précéder la carte de remplacement.
Exemple
Par exemple, considérons la disposition suivante:
2H,2S,1S,2D (H: Hearts, S: Spades, D: Diamonds)
Il y a 3 mouvements possibles ici:
- Remplacez le
2H
par le adjacent2S
, donc nous nous retrouvons avec2S,1S,2D
- Remplacez le
2S
par le adjacent1S
, donc nous nous retrouvons avec2H,1S,2D
- Remplacez le
2H
par2D
(à une distance de 3), nous nous retrouvons donc avec2D,2S,1S
De ces 3 coups, seul le dernier a la possibilité de gagner (Vous gagnez en remplaçant 2D <- 2S
, alors 2S <- 1S
).
Entrée sortie
Votre travail consiste à écrire un solveur d'accordéon . Vous recevez une liste de cartes et vous devez renvoyer une liste de mouvements pour résoudre le jeu.
Vous recevez une liste de cartes sous forme de chaîne délimitée par des virgules, où chaque carte est transmise sous la forme d'un entier représentant leur valeur numérique, puis d'un caractère représentant leur couleur.
Vous devez renvoyer une liste de remplacements sous forme de chaîne délimitée par des virgules, où chaque remplacement est au format Card <- Card
(suivant le format de carte décrit ci-dessus). La première carte de chaque paire est la carte à remplacer.
Cas de test:
5H,1C,12S,9C,9H,2C,12C,11H,10C,13S,3D,8H,1H,12H,4S,1D,7H,1S,13D,13C,7D,12D,6H,10H,4H,8S,3H,5D,2D,11C,10S,7S,4C,2H,3C,11S,13H,3S,6C,6S,4D,11D,8D,8C,6D,5C,7C,5S,9D,10D,2S,9S
5H,9C,11H,7S,7D,12D,6H,10S,3H,4D,12C,2S,3C,5C,7H,6S,1H,8S,2H,11S,4C,10D,12H,9H,2D,4H,6C,13H,11C,2C,10H,8C,1S,11D,3S,12S,7C,5D,13S,8D,4S,6D,13C,3D,8H,13D,1D,9D,9S,1C,5S,10C
7H,11C,8C,7S,10D,13H,4S,10C,4D,2C,4H,13D,3C,2H,12C,6C,9H,4C,12H,11H,9S,5H,8S,13S,8H,6D,2S,5D,11D,10S,1H,2D,5C,1C,1S,5S,3H,6S,7C,11S,9C,6H,8D,12S,1D,13C,9D,12D,3D,7D,10H,3S
Bien que cette compétition soit un golf de code , je suis particulièrement intéressé par les solutions efficaces et je suis susceptible de récompenser les solutions ingénieuses avec des primes. Cela dit, les solutions qui prennent des quantités astronomiques de temps sont toujours acceptables (je recommanderais de tester avec un jeu plus petit, comme un jeu de 16 cartes et 4 combinaisons).
la source
Réponses:
Python 3,
274272271 octets2 octets enregistrés grâce à @orlp .
C'est extrêmement lent. Cependant, vous pouvez l'essayer avec un mémo . Cela a un peu supplémentaire
list
-tuple
conversions, mais est par ailleurs équivalente.Même celui-ci est astronomiquement lent avec certaines entrées.
Le code utilise des chaînes, pas des nombres, il prend donc également en charge la notation comme
KH
au lieu de13H
.Exemple:
la source
functools.lru_cache
au lieu d'écrire le vôtre.list
est inébranlable, cela ne fonctionne pas.str.split
retourslist
). Je préférerais que les deux programmes soient fonctionnellement équivalents.h=lambda p:lru_cache(None)(g)(''.join(p))
.