Dans les Dames chinoises , une pièce peut se déplacer en sautant sur n'importe quelle autre pièce ou en faisant une séquence de tels sauts. Votre tâche consiste à trouver la séquence de sauts la plus longue possible.
Contribution
Une séquence de 121 zéros ou uns, chacun représentant une place sur une planche. Un zéro signifie que l'endroit est vide; un signifie que la place est occupée. Les postes sont répertoriés de gauche à droite; de haut en bas. Par exemple, l'entrée de cette configuration serait
1011110011000001000000000000000000000000100000000001000000000000000000000000000001000000000000000000000001000001100111111
Explication:
L'endroit le plus haut est occupé par une pièce verte, donc le premier chiffre de l'entrée est
1
. La deuxième ligne a une position vide puis une position occupée,01
vient ensuite. La troisième rangée est donc entièrement occupée111
. La quatrième rangée a deux espaces vides et deux espaces occupés (de gauche à droite)0011
. Viennent ensuite cinq0
, a1
et sept0
pour la ligne suivante, et ainsi de suite.
Comme dans cette configuration, il y a un coin pointé vers le haut. Il peut y avoir n'importe quel nombre de pièces sur le plateau (de 1 à 121). Notez que les pièces de couleurs différentes ne sont pas représentées différemment.
Production
La longueur maximale d'un saut légal, en utilisant n'importe quelle pièce du plateau. Vous ne pouvez pas visiter le même endroit plus d'une fois (y compris les positions de départ et de fin). Cependant, vous pouvez sauter plusieurs fois sur la même pièce. S'il n'y a pas de saut légal, sortez 0
. Ne considérez pas s'il existe un mouvement légal de non-saut.
Par exemple, la sortie de la configuration décrite ci-dessus est 3
.
L'entrée et la sortie peuvent être effectuées via stdin et stdout, via des arguments de ligne de commande, via des appels de fonction ou toute autre méthode similaire.
Cas de test
Contribution:
0100000010000000000000000100000000000000000000000000000001010010000000000000000000000101000000000000000000100000000100001
Sortie: 0
(pas deux pièces côte à côte)
Contribution:
0000000000111100000000011100000000011000000000100000000000000000000000000000000000000000000000000000000000000000000000000
Sortie: 1
(configuration initiale pour un joueur dans le coin supérieur gauche)
Réponses:
Perl,
345322Edit: golfé, légèrement.
Plus de cas de test seraient bien, mais pour l'instant, il semble que cela fonctionne. J'ajouterai des commentaires plus tard si nécessaire. Avec des nouvelles lignes et un retrait pour la lisibilité:
la source
C,
262260Code golfé ( code de débogage et espaces inutiles supprimés. Changé de l'entrée via stdin en entrée via la ligne de commande, et a profité de l'occasion pour y déclarer la variable i. Dernière modification: le code a été placé entre crochets de
for
boucles pour enregistrer deux points-virgules.)Explication
Cela repose sur une carte 20x21 qui ressemble à ceci, initialement remplie de zéros au démarrage du programme (cet art ASCII a été généré par une version modifiée du programme, et comme la
i
boucle compte vers le bas, zéro est dans le coin inférieur droit):La boucle
i
parcourt ce tableau deux fois, en utilisant x et y pour calculer si un carré appartient réellement au damier ou non (cela nécessite 6 inégalités distinctes en x et y.)Si c'est le cas, la première fois, il remplit les cases, mettant un
0
(faux) pour un1
(occupé) et un1
(véridique) pour un0
(inoccupé). Cette inversion est importante, car tous les carrés hors limites contiennent déjà un 0, ce qui signifie qu'ils ressemblent à des carrés occupés et il est clair qu'ils ne peuvent pas être sautés sans avoir besoin d'une vérification spécifique.La deuxième fois, si le carré est occupé (contient 0), il appelle la fonction
f
qui recherche les mouvements.f
recherche récursivement dans les 6 directions possibles encodées par +/- 1 (horizontal), +/- 20 (vertical) et +/- 19 (diagonal) encodées dans l'expression"AST?-,"[k]-64
. Lorsqu'il trouve un hit, il met cette cellule à 0 (occupé) avant de s'appeler récursivement, puis la remet à 1 (vide) lorsque la fonction est retournée. La valeur de la cellule doit être modifiée avant l'appel récursif pour éviter de sauter plusieurs fois dans cette cellule.Code non golfé
la source