2019 est arrivé et tout le monde a probablement remarqué la particularité de ce nombre: il est en fait composé de deux sous-nombres (20 et 19) représentant une séquence de nombres décroissants consécutifs.
Défi
Étant donné un nombre x
, renvoyez la longueur de la séquence maximale de nombres descendants consécutifs qui peuvent être formés en prenant des sous-nombres de x
.
Remarques :
- les sous-numéros ne peuvent pas contenir de zéros de tête (par exemple,
1009
ne peuvent pas être divisés en10
,09
) - consécutif et décroissant signifie qu'un nombre dans la séquence doit être égal au nombre précédent -1, ou (par exemple ne peut pas être divisé en car et ne sont pas consécutifs, )
52
5,2
5
2
2 ≠ 5 - 1
- la séquence doit être obtenue en utilisant le numéro complet, par exemple dans
7321
vous ne pouvez pas jeter7
et obtenir la séquence3
,2
,1
- une seule séquence peut être obtenue à partir du nombre, par exemple ,
3211098
ne peut pas être divisé en deux séquences3
,2
,1
et10
,9
,8
Contribution
- Un nombre entier (
>= 0
): peut être un nombre, une chaîne ou une liste de chiffres
Production
- Un entier unique étant donné le nombre maximum de sous-nombres décroissants (notez que la borne inférieure de ce nombre est
1
, c'est-à-dire qu'un nombre est composé par lui-même dans une séquence décroissante de longueur un)
Exemples :
2019 --> 20,19 --> output : 2
201200199198 --> 201,200,199,198 --> output : 4
3246 --> 3246 --> output : 1
87654 --> 8,7,6,5,4 --> output : 5
123456 --> 123456 --> output : 1
1009998 --> 100,99,98 --> output : 3
100908 --> 100908 --> output : 1
1110987 --> 11,10,9,8,7 --> output : 5
210 --> 2,1,0 --> output : 3
1 --> 1 --> output : 1
0 --> 0 --> output : 1
312 --> 312 --> output : 1
191 --> 191 --> output : 1
Règles générales:
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Des règles standard s'appliquent à votre réponse avec des règles d'E / S par défaut , vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code (par exemple TIO ).
- De plus, l'ajout d'une explication à votre réponse est fortement recommandé.
210 -> 2,1,0
incorrect (identique à0 -> 0
)? La tâche indique que "les sous-numéros ne peuvent pas contenir de zéros de tête ", le zéro est-il un cas particulier?212019
. Il semble que je n'ai pas lu toutes les règles.Réponses:
Gelée ,
159 octetsCorrection de bug grâce à Dennis
Essayez-le en ligne! (O ( N2) )
321
prendmêmeune demi-minute car le code est au moinsComment?
la source
JavaScript (ES6), 56 octets
Un port de la réponse Python d' ArBo est beaucoup plus court. Cependant, il échoue sur certains cas de test en raison de trop de récursivité.
Essayez-le en ligne!
JavaScript (ES6), 66 octets
Prend l'entrée sous forme de chaîne.
Essayez-le en ligne!
Commenté
la source
Perl 6 ,
43 4140 octets-1 octet grâce à nwellnhof
Essayez-le en ligne!
Solution basée sur Regex. J'essaie de trouver une meilleure façon de faire correspondre à partir d'une liste décroissante, mais Perl 6 ne fait pas bien les partitions
Explication:
la source
Python 3 ,
232228187181180150149 octets-1 merci à @ Jonathan Frech
Essayez-le en ligne!
Code initial non golfé:
la source
s+1 for
peut êtres+1for
,(t(n[:j])-t(n[j:j+i])==1)*t(n[0])
peut éventuellement êtret(n[:j])-t(n[j:j+i])==1>=t(n[0])
.if
.Python 2 ,
787473 octetsEssayez-le en ligne!
-1 octet grâce à Arnauld
Prend l'entrée sous forme de chaîne. Le programme fonctionne assez rapidement dans la limite de profondeur de récursivité de Python, mais il peut terminer la plupart des cas de test.
Comment ça fonctionne
la source
a+c+1
peut être raccourcia-~c
.05AB1E , 10 octets
Extrêmement lent, le TIO ci-dessous ne fonctionne que pour les cas de test inférieurs à 750 ..
Essayez-le en ligne .
Explication:
la source
n!
àn lg n
est tout simplement pas la peine.Pyth, 16 octets
Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .
la source
Gelée , 11 octets
Octet par octet, aucune correspondance avec l'autre solution Jelly, mais celle-ci devrait être à peu prèsO ( n0,3) .
Essayez-le en ligne!
Comment ça fonctionne
la source
Fusain , 26 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Boucle
i
de 0 à la longueur de l'entrée.Boucle
k
de 0 à la longueur de l'entrée.Calculez les premiers
k
nombres dans la séquence décroissante à partir du nombre donné par les premiersi
chiffres de l'entrée, concaténez-les et accumulez chaque chaîne résultante dans la liste vide prédéfinie.Recherchez la position de la première copie correspondante de l'entrée et réduisez-la de 1 module de plus que la longueur de l'entrée.
Exemple: Pour une entrée des
2019
chaînes suivantes sont générées:2019
se trouve alors à l'indice 12, qui est réduit modulo 5 pour donner 2, la réponse souhaitée.la source
Haskell, 87 octets
L'entrée est une liste de chiffres.
Essayez-le en ligne!
La fonction
#
crée une liste de toutes les divisions possibles en examinant les deuxa
à toutes les divisions renvoyées par un appel récursif avec le reste de l'entrée (x<-b#c
), mais uniquement si le numéro suivant n'est pas zéro (b>0
) (ou s'il s'agit du dernier numéro de l'entrée (c==[]
)) eta
supérieur de un au premier numéro de la division précédente respectivex
(a==x!!0+1
).et
b
de la liste d'entrée au numéro actuela
et continuer avec le reste de l'entrée ((10*a+b)#c
)Le cas de base est lorsque la liste d'entrée est vide (c'est-à-dire qu'elle ne correspond pas au modèle
(b:c)
). La récursion commence avec le nombre actuela
étant0
((0#)
), qui ne frappe jamais la première branche (en ajoutanta
à toutes les divisions précédentes), car il ne sera jamais supérieur à n'importe quel nombre de divisions.Prenez la longueur de chaque division et trouvez le maximum (
maximum.map length
).Une variante avec également 87 octets:
ce qui fonctionne essentiellement de la même manière, mais au lieu de conserver la totalité du fractionnement dans une liste, il ne conserve qu'une paire
(r,x)
de la longueur du fractionnementr
et le premier nombre de la divisionx
.la source
Python 3 ,
302282271 octets-10 octets grâce au tip de @ElPedro.
Prend l'entrée sous forme de chaîne. Fondamentalement, cela prend de plus en plus de tranches plus grandes du nombre à partir de la gauche, et voit si pour cette tranche du nombre une séquence peut être formée en utilisant tous les nombres.
Essayez-le en ligne!
la source
range
3 fois, vous pouvez définir enR=range
dehors des deux fonctions, puis utiliserR(whatever)
au lieu derange(whatever)
pour enregistrer 4 octets.Japt , 27 octets
Essayez-le en ligne! ou Vérifiez la plupart des cas de test
Cela ne marque pas bien, mais il utilise une méthode unique et il pourrait y avoir beaucoup plus de terrain de golf. Il fonctionne également suffisamment bien pour que tous les cas de test autres que
201200199198
temporisation.Explication:
la source
21201
car ils n'imposent pas que la fin de la séquence s'aligne correctement (à partir de ma version originale, la ligne "se termine par une virgule"). Ceci ou cette alternative fonctionne.210
car il n'y a pas de délimiteur après 0. Voici un 28 octet fixe qui fonctionne.Haskell, 65 octets
L'entrée est une chaîne.
Essayez-le en ligne!
Complètement différent de mon autre réponse . Une force brute simple qui essaie toutes les listes de nombres décroissants consécutifs jusqu'à ce qu'elle en trouve un qui soit égal à la liste d'entrée.
Si nous limitons le nombre d'entrée entiers 64 bits, nous pouvons économiser 6 octets en boucle
y
par[1..19]
, parce que le plus grand entier de 64 bits a 19 chiffres et il n'y a pas besoin de listes d'essai avec plus d' éléments.Haskell, 59 octets
Essayez-le en ligne!
la source
Python 2 , 95 octets
Une autre solution lente et brutale.
Essayez-le en ligne!
la source
Dyalog APL, 138 octets
Une bouchée, mais ça marche vite aussi pour les grands nombres. Si vous l' essayez en ligne , préfixez le dfn par
⎕←
et fournissez une entrée à droite sous forme de liste de chiffres.Explication
Tout d'abord, le dfn interne à droite qui construit récursivement une liste de façons possibles de partitionner (avec
⊂
) la liste des chiffres. Par exemple,1 0 1 0 ⊂ 2 0 1 9
renvoie le vecteur imbriqué(2 0)(1 9)
.Nous utilisons
1,
pour ajouter une colonne de 1 au début et pour finir avec une matrice de partitions valides pour ⍵.Maintenant, la fonction s'entraîne à gauche en parens. En raison de
⍨
l'argument de gauche du train est la ligne de la matrice des partitions et l'argument de droite est l'entrée utilisateur. Le train est un tas de fourches avec un sommet comme la dent la plus à gauche.Si la partition crée une séquence de nombres décroissants, le train renvoie la longueur de la séquence. Sinon zéro.
⍤1⊢
applique le train de fonctions entre l'entrée utilisateur et chaque ligne de la matrice de partitions, en renvoyant une valeur pour chaque ligne de la matrice.⊢
est nécessaire pour lever l'ambiguïté entre l'opérande⍤
et l'argument de la fonction dérivée de⍤
.⌈/
trouve le maximum.Pourrait trouver un algorithme plus court mais je voulais essayer de cette façon qui est la plus directe et déclarative à laquelle je pouvais penser.
la source
TSQL, 169 octets
Remarque: cela ne peut être exécuté que lorsque l'entrée peut être convertie en entier.
SQL récursif utilisé pour le bouclage.
Golfé:
Non golfé:
Essaye le
la source
R , 101 octets
Essayez-le en ligne!
Plus de 2 semaines se sont écoulées sans réponse R, j'ai donc décidé de poster la mienne :)
Le code est assez rapide car il utilise une approche de force brute "limitée"
Code déroulé et explication:
la source