Voici la séquence dont je parle:
{1, 4, 5, 9, 10, 11, 16, 17, 18, 19, 25, 26, 27...}
À partir de 1, gardez 1, laissez tomber les 2 suivants, gardez les 2 suivants, laissez tomber 3, gardez 3 et ainsi de suite. Oui, c'est aussi sur OEIS (A064801) !
Le défi
Étant donné un entier n>0
, trouver le nième terme de la séquence ci-dessus
Cas de test
Input -> Output
1->1
22->49
333->683
4444->8908
12345->24747
C'est le golf de code, donc la réponse la plus courte en octets l'emporte! Bonne chance!
Réponses:
Java (OpenJDK 8) ,
4544 octetsEssayez-le en ligne!
-1 octet grâce à @Nevay
Après avoir regardé cela pendant un moment, j'ai remarqué un motif. Chaque fois que nous supprimons des
n
nombres, le nombre suivant de la séquence est un carré parfait. Voyant cela, j'ai scindé mentalement la séquence en morceaux pratiques:[[1],[4,5],[9,10,11],...]
Fondamentalement, lei
e morceau commence pari*i
et itère vers le haut pour lesi
éléments.Pour trouver le
n
numéro e dans cette séquence, nous voulons d'abord trouver dans quel morceau le numéro est, puis dans quelle position dans le morceau qu'il occupe. Nous soustrayons notre numéro d'incrémentationi
den
jusqu'à ce quen
soit inférieur ài
(ce qui nous donne notre bloc), puis ajoutons simplementn-1
ài*i
pour obtenir le bonposition
dans le bloc.Exemple:
la source
return~-n+i*i;
pour enregistrer 1 octet.Haskell,
484341 octets4 octets supplémentaires pour l'indexation basée sur 1 au lieu de basée sur 0. Une restriction inutile, à mon humble avis.
Essayez-le en ligne!
la source
Python 3 ,
4746 octets1 octet merci à M. Xcoder.
Essayez-le en ligne!
TRÈS rapide pour des nombres plus élevés
la source
def f(n):a=round((2*n)**.5);return~-n+a*-~a//2
. Pas sûr cependant ... Approche intelligente!a*(a+1)
est même pour chaque entier. Python se plaint-il de la division flottante sur les entiers? Se plaint-il des opérations au niveau du bit sur les flotteurs? Dans le cas contraire:(2*n)**.5+.5|0
.Gelée , 8 octets
Essayez-le en ligne!
la source
Haskell , 33 octets
Une fonction anonyme. Utilisé comme
((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1
Essayez-le en ligne!
!!
. Le0:
est un élément factice pour ajuster l'indexation de 0 à 1.[n^2..n^2+n-1]
construit une sous-séquence sans espaces, en commençant par le carré den
et contenant lesn
nombres.do
notation concatène les plages construites pour tousn>=1
.la source
Python 3 , 46 octets
Essayez-le en ligne!
la source
Perl 6 , 43 octets
Essaye-le
Étendu:
(1..*).rotor({++$=>++$+1}...*)
produit:la source
TeX, 166 octets
Usage
la source
Javascript,
4338 octetsEssayez-le en ligne!
J'utilise le fait que pour chaque nombre triangulaire plus un, le résultat est un nombre carré.
Par exemple: les nombres triangulaires sont 0, 1, 3, 6, 10 ... donc pour 1, 2, 4, 7, 11 ... nous observons 1, 4, 9, 16, 25 ... dans notre séquence .
Si l'indice se situe quelque part entre ces nombres connus, les éléments de notre séquence n'avancent que de un. Par exemple, pour calculer le résultat pour 10, nous prenons 7 (comme un nombre triangulaire plus un), prenons le résultat (16) et ajoutons 10-7 = 3. Ainsi, 16 + 3 = 19.
la source
05AB1E , 12 octets
Essayez-le en ligne!
la source
[0..a-1] + a**2
, la chose cool ici imo est juste leÝÁćn+
lieu deD<Ýsn+
.cQuents , 27 octets
Essayez-le en ligne!
Actuellement, un portage de la réponse Python de Leaky , je pense qu'il y a un meilleur moyen.
la source
Swift 3 , 72 octets
Port de ma solution Python .
Suite de tests.
la source
C # (mono) , 164 octets
Essayez-le en ligne!
la source
Mathematica, 37 octets
Explication
Function
qui prend un entier positif#
et retourne la#
suite de nombres consécutifs dans la séquence.Produit la liste de toutes ces exécutions jusqu'à l'entrée
#
Flattens
la liste résultante et renvoie le#
e élément.la source
Perl 5 , 33 + 1 (-p) = 34 octets
Essayez-le en ligne!
la source
Tampio ,
310308 octetsUtilisation:
4:n uni
évalue à9
.Explication:
De la bibliothèque standard:
la source
JavaScript (ES6), 33 octets
Solution récursive inspirée des observations de Xanderhall .
Essayez-le
la source
Python 3 , 50 octets
Essayez-le en ligne!
la source
Mathematica, 82 octets
la source
Python , 40 octets
Essayez-le en ligne!
Optimisation de l'expression de Leaky Nun .
Python , 41 octets
Essayez-le en ligne!
Expression récursive.
la source
Javascript (ES6)
10098 octetsJ'ai fait celui-ci rapidement, donc je parie qu'il y a beaucoup de place pour l'amélioration, juste des boucles et des compteurs de base.
la source
Rétine , 27 octets
Essayez-le en ligne! Port de la réponse Python de @ LeakyNun. La première et la dernière étape ne sont qu'une conversion décimale ary unaire ennuyeuse. La deuxième étape fonctionne comme ceci:
((^1|1\2)+)
est un comparateur de nombres triangulaire;$1
est le nombre triangulaire correspondant tandis que$2
son index. La fin1
signifie qu'elle correspond au plus grand nombre triangulaire strictement inférieur à l'entrée, ce qui entraîne exactement une itération de moins que la boucle Python, ce qui signifie$1
qu'équivalent àa-i
et$2
ài-1
et que leur somme esta-1
ou~-a
selon les besoins. ( pour correspondre dans ce cas aussi.$&
empêche simplement la correspondance d'être supprimée du résultat.) Notez que pour une entrée1
sans correspondance, la sortie est simplement la même que l'entrée. Si vous étiez pervers, vous pourriez utiliser^((^1|1\2)*)1
la source
MATL , 12 octets
Essayez-le en ligne!
Explication
la source
C (gcc) , 38 octets
Utilisation de l'algorithme de @ Xanderhall ici
Essayez-le en ligne!
la source
PHP,
48 4237 + 1 octetsporté de la réponse de Leaky Nun
Exécuter en tant que pipe avec
-F
ou l' essayer en ligne .approche directe, 42 + 1 octets (porté depuis l' autre réponse de Leaky Nun )
Exécuter en tant que tuyau avec
-nR
ou décommenter dans TiO ci-dessus.ancienne solution itérative, 48 + 1 octets
la source