Bien que des défis connexes aient été posés , celui-ci est différent pour justifier sa propre question.
Défi
Étant donné un entier positif, retournez la plus longue séquence d'entiers impairs positifs consécutifs dont la somme est l'entier donné. Si aucune séquence de ce type n'existe, vous pouvez signaler une erreur de la manière qui convient à votre langue, notamment en renvoyant une valeur fausse ou en lançant une exception.
Cas de test
1 -> [1] 2 -> [] 3 -> [3] 4 -> [1, 3] 5 -> [5] 6 -> [] 9 -> [1, 3, 5] (notez que [9] n'est pas une réponse valide) 15 -> [3, 5, 7] 104 -> [23, 25, 27, 29] (notez que [51, 53] n'est pas une réponse valide)
Notation
C'est le golf de code , donc la réponse la plus courte dans chaque langue l'emporte.
Réponses:
Haskell,
6765636258 octets4 octets enregistrés grâce à Julian Wolf
Essayez-le en ligne!
Je vérifie si le nombre peut être exprimé comme il différence de deux places:
m^2-n^2
. Je peux alors construire la liste des numéros impairs consécutifs:[2n+1,2n+3...2m-1]
. Notez que parce que le minimumn
est choisi, la liste la plus longue sera sortiela source
x
pour les deuxn
etm
Python 2 ,
6662 octetsQuitte avec un RuntimeError (profondeur de récursivité maximale dépassée) s'il n'y a pas de solution.
Essayez-le en ligne!
la source
Gelée ,
1110 octets-1 octet grâce à Dennis (utilisez la construction implicite de la plage de
Ẇ
- remplacerRm2Ẇ
parẆḤ’
)Un lien monadique renvoyant une liste des sommets si possible, ou
0
sinon.Essayez-le en ligne!
Comment?
la source
ẆḤ’
enregistre un octet.JavaScript (ES7),
87868581 octetsRenvoie une liste d'entiers délimités par des virgules, ou
0
s'il n'existe aucune solution.Comment?
Nous recherchons d'abord le plus petit carré parfait s tel que x = n + s soit un autre carré parfait.
Si s existe, n est la différence x - s de 2 carrés parfaits, qui peut être écrite comme la différence de 2 séquences de nombres impairs consécutifs. Nous construisons ensuite la liste résultante.
Exemple:
Pour n = 104 :
On trouve s = 11² = 121 qui satisfait x = n + s = 225 = 15²
Ensuite:
15² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21 + 23 + 25 + 27 + 29
11² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21
104 = 15² - 11² = 23 + 25 + 27 + 29
Afficher l'extrait de code
la source
n^2
c'est toujours égal à la somme des premiersn
nombres impairs? Huh, intéressant05AB1E ,
98 octets-1 octet grâce à Emigna
Explication:
Sur une entrée invalide, ne produit rien.
Essayez-le en ligne!
la source
ʒOQ}
au lieu d'DO¹QÏ
enregistrer un octet.Haskell ,
6160 octetsMerci à @maple_shaft pour avoir rasé 1 octet
Essayez-le en ligne!
Utilise le fait que la course la plus longue sera toujours celle qui commence par le plus petit nombre.
Je voulais faire quelque chose avec l'arithmétique au lieu du forçage brutal
k
, maisfromInteger
semble le tuer.la source
[1,3..n]
à[1,3..]
r?n=[r,r+2..n]
. Essayez-le en ligne!Python , 67 octets
Essayez-le en ligne!
J'ai copié ma réponse du défi de somme consécutif précédent et changé la
+1
en+2
. Qui savait que le code du golf pouvait être si modulaire?Une stratégie étrangement simple: recherchez l'intervalle
R
avec la somme souhaitée.R
.Comme l'extrémité inférieure de l'intervalle ne fait qu'augmenter, des intervalles plus longs sont trouvés avant des intervalles plus courts. Si aucun intervalle possible ne peut être trouvé, se termine par IndexError.
la source
JavaScript (ES6),
6564 octetsRenvoie un tableau s'il y a une solution, ou 0 pour aucune solution.
Il s'agit d'une solution très inefficace mais golfique au problème.
Il recherche la première solution en utilisant
a-i
eti=1
, même s'il ne fonctionne pas sur la pile récursive. Si cette solution ne commence pasi+2
, alors nous recherchons récursivement la première solution en utilisanta
eti+2
.Non golfé
Cas de test:
Afficher l'extrait de code
Pour avoir une idée de son inefficacité, la solution à
f(104)
nécessite 69 535 appels récursifs. La pile n'a jamais plus de 51 niveaux de profondeur, donc aucun problème de débordement de pile.La solution
f(200)
nécessite 8,6 millions d' appels récursifs, avec une pile de 99 niveaux de profondeur. (Sa solution est[11,13,15,17,19,21,23,25,27,29]
.)Voici une représentation visuelle du programme en cours d'exécution:
Afficher l'extrait de code
la source
Python 2.7,
10910897 octets11 octets vers le bas, Merci à Erik l'Outgolfer.
Ceci est mon premier golf de code!
Comment ça marche
J'ai utilisé l'identité bien connue
1 + 3 + 5 + ... + (2n - 1) = n²
Prenons le cas de
15
En général, s'il y a x termes commençant par
2n + 1
, commeC'est égal à
2nx + x²
Si
N
est l'entier en entrée, le problème se réduit à trouver un maximumx
tel queC'est une équation quadratique avec solution
La séquence la plus longue est celle avec la plus grande
x
. Le programme itèren
de0
àN
et lorsqu'il trouve qu'ilx
s'agit d'un entier, il crée une liste de(2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))
et la renvoie.la source
Python 3,
19081 octetsMerci à @ovs et @ musicman523
la source
print
manque des parenthèses à l'appel àl.append(i)
en utilisant simplementl+[i]
dans l'appel récursif. Vous pouvez supprimerl.pop(0)
en utilisantl[1:]
dans l'appel récursif. Vous pouvez supprimer l'appel àc
tout en bas en utilisant des arguments de mots clés à la place. Vous pouvez supprimer>0
à la ligne 2. Enfin, vous pouvez changer vos instructionsif
etelse
en expressions, en utilisant la forme ternaire, qui vous ramène à 92 octets comme expression lambda. Essayez-le en ligne!i
pour atteindre un total de 81 octets .sum(l)>q else
pourq<sum(l)else
sauver 1 octet.QBIC , 47 octets
Cela essaie de compter tous les nombres impairs de un jusqu'à ce que sa somme soit
n
. S'il passen
, réinitialisez la boucle, augmentez de 1 à 3 et réessayez. Quittez, en imprimant 0, si au début de la boucle notre numéro> n
.Explication
la source
R , 90 octets
Essayez-le en ligne!
Utilise une fonction récursive qui teste la somme cumulée de la séquence de y: x convertie en une séquence de nombres impairs. y est incrémenté à chaque récursivité jusqu'à ce qu'il dépasse x. La première séquence qui résume la cible sera retournée.
la source
Python 2 , 89 octets
Une fonction sans nom prenant un entier positif
n
, et renvoyant le résultat s'il existe et levant unIndexError
sinon.Essayez-le en ligne!
Crée une liste de tous les nombres impairs pertinents avec
r(1,n+1,2)
lesquels estrange(start=1, stop=n+1, step=2)
; crée toutes les sous-tranches pertinentes (plus quelques-unes vides) en découpant cela d'i
inclusif àj
exclusif avec[i:j]
traversi
dans [0, n) en utilisantr(n)
etj
dans [0, n] en utilisantr(n+1)
(les vides lorsquei>=j
oui
hors limites); filtres pour ceux avec la somme correcte avecif sum(v)==n
; renvoie la première (et donc la plus longue) tranche de ce type en utilisant[0]
.la source
Python 2 ,
9190 octets-1 octet grâce à @CMcAvoy
Essayez-le en ligne!
la source
Pyth, 11 octets
Essayez-le ici.
la source
PHP , 73 octets
aucune solution n'est une boucle infinie
Essayez-le en ligne!
PHP , 83 octets
imprime rien pour aucune solution
chaque mod d'entrée 4 == 2 n'a pas de solution
Essayez-le en ligne!
la source
Python 2 ,
122121119 119115 octets-1 octet grâce à musicman523. -4 octets grâce à Step Hen. haha
Essayez-le en ligne!
la source
range
, essayez-le en ligne!Python 3 , 93 octets
Essayez-le en ligne!
La seule chose spéciale que j'ai faite était de noter que cela
(s+e)*(2+e-s)==4*n
équivaut àsum(range(s,e+1,2))==n
, et bien qu'ils soient de la même taille quandr=range
, les premiers peuvent être placés plus près de laif
déclaration.la source
Python 3 , 185 octets
Essayez-le en ligne!
Quant à la façon dont cela fonctionne, j'ai essayé d'opter pour une solution un peu plus élégante qu'une simple recherche par force brute. J'ai réorganisé la formule pour la somme d'une séquence arithmétique et appliqué la formule quadratique pour obtenir l'expression
(1-a+((a-1)**2+4*s)**(.5))/2
, qui apparaît dans le code. Ce que l'expression calcule est, étant donné une somme souhaitées
et un premier terme pour une séquence arithmétiquea
, la longueur de la séquence. Ces longueurs sont stockées dans un dictionnaire sous forme de valeurs pour les premiers termes sous forme de clés.Ensuite, toutes les valeurs non entières sont supprimées du dictionnaire, car celles-ci représentent des séquences non valides. De là, la plus grande valeur est identifiée avec
max(d.keys(), key=(lambda k: d[k]))
et la séquence de nombres impairs à cette position et à cette longueur est faite aveclist(range(int(m),int(m+2*d[m]),2))
.Je cherche de l'aide pour jouer au golf si vous voyez quelque chose. J'étais plus intéressé à voir dans quelle mesure je pouvais faire avec un algorithme non trivial; ma réponse est presque deux fois plus longue que la meilleure solution Python.
la source
Mathematica, 56 octets
Function
avec le premier argument#
.Table[n,{n,1,#,2}]
calcule la liste des nombres impairs positifs inférieurs ou égaux à#
.Subsequences
renvoie toutes les sous-séquences de cette liste triées par longueur croissante. Nous prenons ensuite les séquencesCases
qui correspondentx_/;Tr@x==#
, c'est-à-direx
telles que leur sommeTr@x
est égale à l'entrée#
. Nous prenons ensuiteLast
cette séquence.la source
JavaScript (ES6), 72 octets
Renvoie une chaîne séparée par des espaces de nombres impairs ou renvoie une entrée non valide. Version de 84 octets qui renvoie un tableau (vide le cas échéant):
Explication: Librement basé sur la solution awk de @ Cabbie407 à Sums of Integers consécutifs, sauf que j'ai pu enregistrer certains octets en utilisant la récursivité.
la source
PHP, 78 octets
boucle infinie si aucune solution. insérez
?$b>$argn+2?$n=[]:1:0
après$s-$argn
pour imprimer un tableau vide à la place.Courez avec
-nR
ou essayez-le en ligne .la source
C # (.NET Core) , 129 octets
Affiche les nombres dans une chaîne, séparés par des espaces (tout autre caractère nécessiterait simplement de changer le
" "
). L'entrée sans solution renvoie une chaîne vide (bien que si elle s'exécute indéfiniment sans erreur soit un moyen valide d'indiquer aucune solution, 17 octets peuvent être enregistrés en les supprimantif(b==e)return"";
).L'algorithme est:
la source
(i)=>
commei=>
C ++, 157 -> 147 octets
-10 octets grâce à DJMcMayhem
renverra 0 s'il n'y a pas de réponse, 1 sinon
la dernière ligne imprimée est la réponse
non golfé:
c'est mon premier code golf ^^
la source
int v=0;
place deint v;....v=0;
et si vous avez délimité votre sortie Newline, vous pouvez le fairestd::cout<<k<<"\n";
, puis supprimer complètement le deuxième NewlineKotlin, 152 octets
Essayez-le en ligne (attendez 4-5 secondes, le compilateur est lent)
Non golfé
la source
Excel VBA, 139 octets
Sub
routine qui prend l'entréen
du type entier attendu et signale la plus longue séquence de nombres impairs consécutifs à la cellule[A1]
la source