Avant que quelqu'un ne dise quoi que ce soit, similaire et similaire . Mais ce n'est pas dupe.
Certains entiers positifs peuvent être écrits comme la somme d'au moins deux entiers positifs consécutifs. Par exemple 9=2+3+4=4+5
,. Écrire une fonction qui prend un entier positif comme entrée et imprime comme sortie la plus longue séquence d'entiers positifs consécutifs croissants qui la résume (tout format est acceptable, bien que -5 octets si la sortie est la séquence croissante séparée par +
comme indiqué ci-dessus) S'il n'existe aucune séquence de ce type, le numéro lui-même doit être imprimé.
C'est le golf de code. Des règles standard s'appliquent. Le code le plus court en octets gagne.
Échantillons (notez que le formatage varie)
Input: 9
Output: 2,3,4
Input: 8
Output: 8
Input: 25
Output: [3,4,5,6,7]
-n+1
àn
)Réponses:
Python, 67 octets
Une stratégie étrangement simple: recherchez l'intervalle R avec la bonne somme.
Étant donné que l'extrémité inférieure de l'intervalle ne fait qu'augmenter, des intervalles plus longs sont trouvés avant des intervalles plus courts.
la source
Pyth,
1210 octetsLe code est long de 15 octets et se qualifie pour le bonus de -5 octets . Essayez-le en ligne dans le compilateur Pyth .
Merci à @Jakube d'avoir joué au golf sur 2 octets!
Comment ça marche
la source
Mathematica,
7368655643 octetsla source
Tuples
une expression d'infixe.Haskell,
4948 octetsla source
[...]!!0
au lieu dehead[...]
.MATLAB,
8779 octetsJe sais qu'il existe déjà une réponse MATLAB, mais celle-ci est sensiblement différente dans son approche.
Cela fonctionne également sur Octave . Vous pouvez essayer en ligne ici . J'ai déjà ajouté le code
consecutiveSum.m
dans l'espace de travail lié, alors entrez simplementconsecutiveSum
à l'invite de commande, puis entrez la valeur (par exemple 25).Je travaille toujours à le réduire (peut-être en ajustant un peu l'équation utilisée), mais en gros, il trouve la plus grande valeur
n
pour laquellem
est un entier, puis affiche les premiersm
nombres commençant parn
.Alors pourquoi ça marche? Eh bien, fondamentalement, il existe une équation mathématique régissant tous ces nombres. Si vous considérez qu'ils sont tous consécutifs et que vous partez d'un certain point, vous pouvez essentiellement dire:
Maintenant, à partir de cela, il devient évident que la séquence n'est fondamentalement que les premiers
p
nombres triangulaires (y compris le 0e), ajoutés àp+1
beaucoup den
. Maintenant, si nous le laissonsm=p+1
, nous pouvons dire:C'est en fait assez résoluble. Je suis toujours à la recherche de la manière la plus courte de le faire, j'ai quelques idées pour essayer de réduire le code ci-dessus.
Pour une entrée de 25, la sortie serait:
la source
1,3,6,10,...
soient maximisés.Python 2, 94 octets
L'entrée provient de stdin. Cette solution convient aux très grandes entrées.
Cela itère sur les longueurs de solution possibles, r , ayant r ≤ √ (2n) , et vérifie explicitement une solution. Pour qu'une solution existe, si r est impair, n mod r doit être nul, et si r est pair, n mod r doit être r / 2 .
Exemple d'utilisation
J'ai délibérément choisi des exemples avec des sorties relativement petites.
la source
Octave, 89 octets
C'est le meilleur que j'ai pu faire à Octave. L'algorithme est le même que celui de xnor.
Dans MATLAB, ce serait 95 octets:
Dans MATLAB, cela fonctionne en environ 0,1 seconde pour l'entrée
2000000
et 1 seconde pour l'entrée1000002
.la source
awk, 51 octets
Le code est de 56 octets, moins 5 octets pour le format de sortie. J'ai dû utiliser 4 octets supplémentaires pour produire ce format, j'ai donc effectivement enregistré 1 octet. Hourra! ;)
Il fait en fait le travail difficile de résumer à partir de 1 jusqu'à ce que la somme soit plus grande que l'entrée. Ensuite, il commence à soustraire des nombres à partir de 1 jusqu'à ce que le nombre soit plus petit que l'entrée. Il continue de changer le numéro de début et de fin de cette façon jusqu'à ce qu'il trouve un résultat, qu'il imprime ensuite.
Exemple d'utilisation
Sortie d'exemple
J'ai essayé ceci pour une entrée de
1e12
et cela a donné le résultat correct (464562+...+1488562
) presque immédiatement. Bien qu'il ait fallu un certain temps pour l'imprimer bien sûr ...la source
{while($0!=s)s+=(s<$0) ? (++j) : -(++i); while(++i<j)r=r i"+"}$0=r j
i est toujours le dernier entier qui a été soustrait depuis le début de la chaîne, j est toujours le dernier entier ajouté à la fin de la chaîneJapt , 33 octets
Cela utilise la technique Pyth de Dennis , bien qu'elle soit considérablement plus longue ...
Essayez-le en ligne! Avertissement: pour les entrées plus grandes (<= 20), il faut un certain temps pour terminer et gèle votre navigateur jusqu'à ce qu'il le fasse.
Non golfé et explication
Version bonus: (38 octets - 5 = 33)
la source
Julia, 92 octets
Il s'agit d'une fonction anonyme qui accepte un entier et renvoie un tableau. Pour l'appeler, donnez-lui un nom, par exemple
f=x->...
.Non golfé:
la source
Rubis, 94 octets
Non golfé:
Usage:
la source
Sérieusement, 53 - 5 = 48 octets
Vidage hexadécimal
Essayez-le en ligne!
C'est l'approche de la force brute, similaire au Pyth de Dennis.
Tout jusqu'à l'
k
entrée lit simplementn
dans le registre 1, puis crée la liste[[1],[2,2],[3,3,3],[4,4,4,4],...]
jusqu'àn
n
.Le bit suivant
╗
est une fonction stockée dans le registre 0 qui prend une paire, incrémente les deux éléments, les convertit en une plage, recherche la somme de la plage et vérifie si cette somme est la valeur du registre 1. Si c'est le cas, il renvoie la plage correspondante, et si ce n'est pas le cas, il renvoie une liste vide.La partie jusqu'à la dernière occurrence de
M
mappe une fonction sur la liste de fantaisie des listes décrites ci-dessus, en faisantenumerate
sur chaque liste, puis en mappant la fonction stockée sur elle. Quand c'est fait, nous avons une liste de listes dont chacune est vide ou une plage qui résume àn
.;░
supprime les listes vides.p@X
prend la première liste qui reste (0@E
fonctionnerait également).'+j
place+
entre chaque nombre car il convertit la liste en une chaîne pour le bonus.la source
ES6, 72 octets
Port droit de la solution awk de @ Cabbie407, mais sans le bonus de formatage, car c'est une pénalité ici.
la source
Python 3,
239236215203 octetsC'est un peu lourd. Je vais devoir jouer au golf plus tard.
C'estMerci àk
parce que si vous vérifiezt[0]
sur un videt
, Python vous fait des bruits grossiers. Encore une fois, cela a besoin de jouer au golf.t[:1]
, plus de bruits grossiers! Il vous suffit de vérifier par rapport à un autre tableau.la source
Gelée , 8 octets (non concurrent)
Essayez-le en ligne!
Si je comprends bien, cela pourrait être une version (11-5 = 6) octets:
la source
05AB1E , 11 - 5 = 6 octets (non concurrent)
Prendre ce bonus bien sûr :)
Essayez-le en ligne!
la source
PHP, 70 octets
Exécuter en tant que pipe avec
-nR
ou l' essayer en ligne .incrémente
p
jusqu'à ce qu'il trouve une solution entière pourargument==(p+q)*(q-p+1)/2
,puis imprime la plage de
p
àq
.la source
Excel VBA, 119 - 5 = 114 octets
Sub
routine qui prend l'entréen
du type entier attendu et sort la plus longue séquence de nombres consécutifs qui la somme à la cellule[A1]
la source