J'ai un tas de chaussettes propres que je veux trier par paires. Malheureusement, je ne peux prendre que des chaussettes aux deux extrémités de la pile, pas au milieu. De plus, je ne peux retirer des chaussettes de la pile qu'une paire assortie à la fois. Ma stratégie consiste à diviser d'abord la pile en une ou plusieurs piles plus petites. Je pense que certains exemples le montreront clairement. Je vais représenter chaque chaussette comme un entier positif (les entiers correspondants indiquent des chaussettes égales).
Si le premier tas de chaussettes est
1 2 3 3 2 1
alors je n'ai pas à faire de fractionnement. Je peux retirer les deux 1
chaussettes, puis les deux 2
chaussettes, puis les deux 3
chaussettes.
Si à la place la pile initiale est
1 2 3 2 3 1
ensuite je dois le diviser d'abord parce que je ne pourrai pas associer toutes les chaussettes en les retirant simplement de la fin. Une possibilité est de le diviser en deux piles
1 2 3 and 2 3 1
Maintenant, je peux retirer les 1
chaussettes en partant 2 3 and 2 3
, puis les 3
chaussettes en partant 2 and 2
et enfin les 2
chaussettes.
Votre travail
Compte tenu de la pile initiale de chaussettes, écrivez un programme qui la divisera en piles plus petites qui me permettront de trier les chaussettes. Votre programme doit diviser la pile en le moins de piles possible (s'il existe plusieurs meilleures solutions, il vous suffit d'en trouver une).
L'entrée sera donnée sous forme de liste, chaîne délimitée ou autre forme pratique. Il ne contiendra que des entiers compris entre 1
une valeur maximale n
et chaque entier se produisant exactement deux fois.
La sortie doit consister en la liste d'entrée divisée en listes plus petites, données sous n'importe quelle forme pratique.
Exemples
Input Sample Output
1 1 1 1
1 2 1 2 1; 2 1 2
1 3 2 4 3 2 1 4 1 3 2; 4 3 2 1 4
1 2 3 4 3 4 1 2 1; 2 3; 4 3 4 1 2
1 1 2 2 3 3 1 1 2; 2 3 3
4 3 4 2 2 1 1 3 4 3 4 2; 2 1 1 3
Notez que ce n'est pas la seule sortie autorisée pour la plupart de ces entrées. Pour le deuxième cas, par exemple, les sorties 1 2; 1 2
ou 1 2 1; 2
seraient également acceptées.
Merci à Sp3000 pour quelques suggestions de tests!
Je déteste passer beaucoup de temps à trier mes vêtements, alors faites votre code aussi court que possible. La réponse la plus courte en octets gagne!
Remarques
- Je ne veux pas avoir à regarder derrière une chaussette pour voir si sa paire assortie est là, donc prendre les deux chaussettes dans une paire du même bout n'est pas autorisé. Par exemple, si la pile est
1 1 2 2
alors vous ne pourriez pas la laisser comme une seule pile et prendre les deux1
chaussettes de l'extrémité gauche.
123213
pourrait être divisé en1; 23; 213
(1; 23; 213
->1; 2; 21
->; 2; 2
)?123213
utilisant seulement deux piles, votre réponse devrait donner l'une des divisions en deux piles.Réponses:
Pyth, 25 octets
Suite de tests
Explication:
la source
JavaScript (ES6), 329
Ce n'est pas une tâche facile pour un langage qui n'a pas de fonctions combinatoires intégrées.
Probablement un peu plus golfable.
Remarque: toutes les partitions sont au moins de taille 2, car une partition avec un seul élément est toujours moins utile.
Explication en parties
(c'est trop verbeux, mais j'ai trouvé difficile à expliquer - finissez par passer à "tout mettre ensemble")
Une fonction récursive pour énumérer toutes les divisions possibles d'un tableau
Maintenant, j'ai besoin de partitions de taille 2 ou plus, donc je dois utiliser cette fonction avec des paramètres légèrement différents. Le paramètre v est "taille du tableau - nombre de partitions souhaitées - 1". Ensuite, je dois construire les partitions d'une manière légèrement différente.
Donc, je peux énumérer la liste des partitions pour aucune division, 1 division, 2 divisions et ainsi de suite. Lorsque je trouve une partition qui fonctionne, je m'arrête et je renvoie le résultat trouvé.
Pour vérifier, scannez la liste des partitions, notez les valeurs au début et à la fin de chacune, si trouvé une valeur répétée puis supprimez-la. Répétez jusqu'à ce que rien ne puisse être supprimé, enfin: si toutes les paires ont été supprimées, cette partition est bonne.
Ensuite, la partie manquante n'est qu'une boucle appelant la fonction G augmentant le nombre de partitions. La boucle se termine lorsqu'un résultat est trouvé.
Mets le tout ensemble
Tester
la source