Problème
Imaginez 7 seaux alignés d'affilée. Chaque seau peut contenir au maximum 2 pommes. Il y a 13 pommes étiquetées de 1 à 13. Elles sont réparties entre les 7 seaux. Par exemple,
{5,4}, {8,10}, {2,9}, {13,3}, {11,7}, {6,0}, {12,1}
Où 0 représente l'espace vide. L'ordre dans lequel les pommes apparaissent dans chaque seau n'est pas pertinent (par exemple {5,4} équivaut à {4,5}).
Vous pouvez déplacer n'importe quelle pomme d'un seau vers un seau adjacent, à condition qu'il y ait de la place dans le seau de destination pour une autre pomme. Chaque mouvement est décrit par le numéro de la pomme que vous souhaitez déplacer (ce qui est sans ambiguïté car il n'y a qu'un seul espace vide). Par exemple, appliquer le déplacement
7
l'accord ci-dessus entraînerait
{5,4}, {8,10}, {2,9}, {13,3}, {11,0}, {6,7}, {12,1}
Objectif
Écrire un programme qui lit un arrangement de STDIN et le trie dans l'arrangement suivant
{1,2}, {3,4}, {5,6}, {7,8}, {9,10}, {11,12}, {13,0}
en utilisant le moins de coups possible. Encore une fois, l'ordre dans lequel les pommes apparaissent dans chaque seau n'est pas pertinent. L'ordre des godets est important. Il doit afficher les mouvements utilisés pour trier chaque arrangement séparé par des virgules. Par exemple,
13, 7, 6, ...
Votre score est égal à la somme du nombre de coups requis pour résoudre les arrangements suivants:
{8, 2}, {11, 13}, {3, 12}, {6, 10}, {4, 0}, {1, 7}, {9, 5}
{3, 1}, {6, 9}, {7, 8}, {2, 11}, {10, 5}, {13, 4}, {12, 0}
{0, 2}, {4, 13}, {1, 10}, {11, 6}, {7, 12}, {8, 5}, {9, 3}
{6, 9}, {2, 10}, {7, 4}, {1, 8}, {12, 0}, {5, 11}, {3, 13}
{4, 5}, {10, 3}, {6, 9}, {8, 13}, {0, 2}, {1, 7}, {12, 11}
{4, 2}, {10, 5}, {0, 7}, {9, 8}, {3, 13}, {1, 11}, {6, 12}
{9, 3}, {5, 4}, {0, 6}, {1, 7}, {12, 11}, {10, 2}, {8, 13}
{3, 4}, {10, 9}, {8, 12}, {2, 6}, {5, 1}, {11, 13}, {7, 0}
{10, 0}, {12, 2}, {3, 5}, {9, 11}, {1, 13}, {4, 8}, {7, 6}
{6, 1}, {3, 5}, {11, 12}, {2, 10}, {7, 4}, {13, 8}, {0, 9}
Oui, chacun de ces arrangements a une solution.
Règles
- Votre solution doit s'exécuter en temps polynomial en nombre de compartiments par déplacement. Le but est d'utiliser des heuristiques intelligentes.
- Tous les algorithmes doivent être déterministes.
- En cas d'égalité, le nombre d'octets le plus court l'emporte.
la source
Réponses:
Résultat: 448
Mon idée est de les trier consécutivement, en commençant par 1. Cela nous donne la belle propriété que lorsque nous voulons déplacer l'espace vers le panier précédent / suivant, nous savons exactement laquelle des deux pommes nous devons déplacer - le max / min un, respectivement. Voici la répartition des tests:
Le code peut être joué beaucoup plus, mais une meilleure qualité du code motivera des réponses supplémentaires.
C ++ (501 octets)
D'autres améliorations peuvent être de passer à C et d'essayer de réduire le score en commençant par les grandes valeurs vers le bas (et éventuellement en combinant les deux solutions).
la source
C,
426448Cela trie les pommes une à la fois de 1 à 13, comme dans la méthode de Yasen , sauf si elle a la possibilité de déplacer un plus grand nombre vers le haut ou un plus petit nombre vers le bas, elle le prendra.
Malheureusement, cela n'améliore que les performances sur le premier problème de test, mais c'est une petite amélioration.J'ai fait une erreur lors de l'exécution des problèmes de test. Il semble que j'ai simplement réimplémenté la méthode de Yasen.Il prend l'entrée sans accolades ni virgules, par exemple
Voici le code golfé à 423 octets comptant quelques nouvelles lignes inutiles (pourrait probablement être joué plus, mais je m'attends à ce que ce score soit battu):
Et le code non golfé, qui imprime également la partition:
la source
Python 3-121
Cela implémente une recherche en profondeur d'abord avec une profondeur croissante jusqu'à ce qu'elle trouve une solution. Il utilise un dictionnaire pour stocker les états visités afin qu'il ne les visite plus à moins qu'avec une fenêtre de profondeur plus élevée. Pour décider des états à vérifier, il utilise le nombre d'éléments mal placés comme heuristique et ne visite que les meilleurs états possibles. Notez que puisque l'ordre des éléments dans leur compartiment n'a pas d'importance, il maintient toujours un ordre dans les compartiments. Cela permet de vérifier plus facilement si un élément est mal placé.
L'entrée est un tableau d'entiers, le premier entier étant le nombre de compartiments.
Ainsi, par exemple, pour # 8 (celui-ci prend très longtemps à fonctionner sur ma machine, les autres finissent en quelques secondes):
Voici les résultats sur l'ensemble de test: # 1: 12, # 2: 12, # 3: 12, # 4: 12, # 5: 11, # 6: 11, # 7: 10, # 8: 14, # 9: 13, # 10: 14
Voici le code:
la source