Le défi est vraiment simple: étant donné un nombre, vous divisez ses chiffres en un tableau de plus petits nombres de sorte que les nombres résultants ne diminuent pas. Le hic, c'est que vous devez le diviser de telle sorte que la longueur du tableau soit maximale.
Confus?
- Vous obtenez un entier positif via STDIN (ou l'alternative la plus proche), l'argument de ligne de commande ou l'argument de fonction dans n'importe quel format d'entrée pratique et sans ambiguïté.
- Vous devez partitionner les chiffres décimaux du numéro en groupes contigus et disjoints.
- Le tableau de nombres représenté par ces groupes de chiffres doit être trié (dans l'ordre habituel et non décroissant) sans réorganiser les groupes .
- Dans les cas où plusieurs partitions de ce type existent, vous devez partitionner l'entrée en autant de nombres que possible. En cas d'égalité, renvoyez un de ces résultats.
- Vous pouvez sortir le tableau vers STDOUT (ou l'alternative la plus proche) ou comme valeur de retour de fonction. Dans le cas de STDOUT (ou de l'alternative la plus proche), le tableau doit être imprimé dans n'importe quel format de liste pratique et sans ambiguïté.
- Les nombres séparés ne doivent pas avoir de zéros en tête. Ainsi, par exemple,
1002003
ne peut pas être imprimé comme ou[1, 002, 003]
ou[1, 2, 3]
et la seule réponse valable est[100, 2003]
.
Cas de test:
123456 -> [1, 2, 3, 4, 5, 6]
345823 -> [3, 4, 5, 8, 23]
12345678901234567890 -> [1, 2, 3, 4, 5, 6, 7, 8, 90, 123, 456, 7890]
102 -> [102]
302 -> [302]
324142 -> [3, 24, 142] OR [32, 41, 42]
324142434445 -> [32, 41, 42, 43, 44, 45]
1356531 -> [1, 3, 5, 6, 531]
11121111111 -> [1, 1, 1, 2, 11, 11, 111]
100202003 -> [100, 202003]
Notation
C'est le code-golf donc le code le plus court en octets gagne.
la source
aY
place de~Y]
a
. Je ne sais pas pourquoi.int("01")
s'agissait d'une erreur en Pyth (cela ne se produit pas en Python).n
est généralement la longueur de l'entrée.Mathematica,
134127 octetsC'est assez inefficace car il génère beaucoup plus de partitions que les partitions valides. Le
324142434445
cas de test s'exécute en quelques secondes, mais je n'essaierais pas12345678901234567890
.Ceci définit une fonction sans nom qui prend un entier et retourne une liste d'entiers.
Explication
L'ordre de lecture de ce code est un peu partout, donc je vais décomposer dans l'ordre dans lequel il est destiné à être lu (et évalué pour la plupart):
d=IntegerDigits@#
obtenir les chiffres décimaux de l'entrée et affecter cette liste àd
.SetPartitions
(ce qui nécessiteNeeds@"Combinatorica`";
) m'en donne toutes les partitions. Cependant, il retourne beaucoup plus que je ne le souhaite, car il traite l'entrée comme un ensemble . C'est ce qui le rend inefficace, mais j'utilise cela parce que le moyen le plus court que je connaisse pour obtenir toutes les partitions de liste est beaucoup plus long. Par exemple, si la liste était,{1, 2, 3}
la fonction retournerait:Notez que a) les partitions consécutives sont toutes dans le bon ordre et b) les partitions sont triées de la plus grossière à la plus fine.
Select[...,...&]
filtre ensuite cette liste par la fonction anonyme transmise comme deuxième argument.Join @@ # == d
vérifie que nous avons effectivement une partition de liste au lieu d'une partition d'ensemble générale.#~FreeQ~{0, __}
vérifie qu'aucune partition ne commence par un zéro non significatif.0 <= ## & @@ f /@ #
est un peu plus obscur. D'abord, nous mapponsFromDigits
sur chaque liste de la partition pour récupérer les nombres représentés par les chiffres. Ensuite, nous appliquons0 <= ##
à ces numéros, où##
fait référence à tous les numéros. Si la partition est{1, 23, 45}
alors celle-ci se développe0 <= 1 <= 23 <= 45
, elle vérifie donc que le tableau est trié.Last@
me donne ensuite la dernière partition restante après le filtrage - cela fonctionne parce queSetPartitions
déjà trié les partitions, de telle sorte que les plus fines sont à la fin.f/@
récupère les numéros des listes de chiffres.la source
Python 3, 134 octets
C'est un peu désordonné, mais bon. Le programme génère simplement toutes les partitions valides de manière récursive. La partie intéressante est que pour interdire les zéros non significatifs, tout ce qui était nécessaire était un supplément
or "1">s[i:]>""
condition .Prend l'entrée comme
f("12345678901234567890")
et retourne une liste d'entiers.la source
Pyth,
626160Explication
L'algorithme fonctionne en générant tous les nombres binaires entre
0
(inclus) et2^(n-1)
(exclusif), oùn
est la longueur de l'entrée.Les chiffres binaires de chacun sont ensuite mappés sur un séparateur (
N
) pour 1 et rien pour 0.Ces caractères sont ensuite insérés entre chaque caractère saisi et le résultat est divisé par
N
, ce qui donne une liste.Les valeurs dans les listes sont ensuite analysées en entiers et les listes sont triées par longueur. Ensuite, tout ce qui reste est de filtrer ceux qui ne sont pas triés et ceux qui ont été divisés aux zéros en tête, après quoi la liste la plus longue est sélectionnée.
la source
(NON CONCURRENT) Pyth, 25 octets
Essayez-le en ligne!
Comment ça fonctionne:
la source
J, 109 octets
Très longue mais prend au moins O (n * (2n)!) Mémoire et O (n * log (n) * (2n)!) Temps où n est la longueur de l'entrée. (N'essayez donc pas de l'exécuter avec plus de 5 chiffres.)
La fonction prend l'entrée comme une chaîne.
Exemples:
Méthode:
la source
Haskell, 161 octets
Essai:
Comment cela fonctionne: la fonction d'assistance
f
divise la liste d'entrée en chaque liste possible de sous-listes.g
élimine d'abord ceux dont la sous-liste commence par0
, puis ceux qui n'ont pas le bon ordre. Associez chaque liste restante à sa longueur, prenez le maximum et jetez à nouveau la partie de longueur.la source