Conserver / supprimer / augmenter la séquence

20

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!

Taylor Scott
la source
connexes
Rod
3
Peut-on choisir entre 0 et 1 indexation?
M. Xcoder
1
@ Mr.Xcoder J'ai bien peur que non. Ceci n'est indexé que sur 1
Pouvons-nous renvoyer une liste contenant tous les éléments dans l'ordre?
Wheat Wizard
@WheatWizard c'est totalement inacceptable. désolé

Réponses:

12

Java (OpenJDK 8) , 45 44 octets

n->{int i=0;for(;++i<n;n-=i);return~-n+i*i;}

Essayez-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 nnombres, 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, le ie morceau commence par i*iet itère vers le haut pour les iéléments.

Pour trouver le nnumé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émentation ide njusqu'à ce que nsoit inférieur à i(ce qui nous donne notre bloc), puis ajoutons simplement n-1à i*ipour obtenir le bon positiondans le bloc.

Exemple:

n = 8
n > 1? Yes, n = n - 1 = 7
n > 2? Yes, n = n - 2 = 5
n > 3? Yes, n = n - 3 = 2
n > 4? No, result is 4 * 4 + 2 - 1 = 17
Xanderhall
la source
1
Vous pouvez utiliser return~-n+i*i;pour enregistrer 1 octet.
Nevay
7

Haskell, 48 43 41 octets

n#l=[l..l+n]++(n+1)#(l+2*n+3)
((0:0#1)!!)

4 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!

n#l             -- n is one less than the number of element to keep/drop and
                -- l the next number where the keep starts
   [l..l+n]     -- keep (n+1) numbers starting at l
   ++           -- and append a recursive call
   (n+1)#       -- where n is incremented by 1 and
      (l+2*n+3) -- l skips the elements to keep & drop

0#1             -- start with n=1 and l=0 and
 0:             -- prepend a dummy value to shift from 0 to 1-based index
    !!          -- pick the i-th element from the list 
nimi
la source
6

Python 3 , 47 46 octets

1 octet merci à M. Xcoder.

def f(n):a=round((2*n)**.5);return~-n+a*-~a//2

Essayez-le en ligne!

TRÈS rapide pour des nombres plus élevés

Leaky Nun
la source
46 octets: def f(n):a=round((2*n)**.5);return~-n+a*-~a//2. Pas sûr cependant ... Approche intelligente!
M. Xcoder
Aw, le double lambdas est un octet supplémentaire, j'espérais que cela économiserait un octet ...
Stephen
Pourquoi a-t-on rejeté cela? Y a-t-il un problème avec l'approche que nous n'avons pas remarqué?
M. Xcoder
@ Mr.Xcoder peut-être à cause de la remarque bouchée.
Leaky Nun
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.
Titus
3

Haskell , 33 octets

Une fonction anonyme. Utilisé comme((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1

(!!)$0:do n<-[1..];[n^2..n^2+n-1]

Essayez-le en ligne!

  • Construit la séquence comme une liste infinie, puis l'indexe avec !!. Le 0:est un élément factice pour ajuster l'indexation de 0 à 1.
  • La plage [n^2..n^2+n-1]construit une sous-séquence sans espaces, en commençant par le carré de net contenant les nnombres.
  • La donotation concatène les plages construites pour tous n>=1.
Ørjan Johansen
la source
2

Python 3 , 46 octets

f=lambda x,y=0,z=0:y<x and f(x,y+z,z+1)or~-y+x

Essayez-le en ligne!

M. Xcoder
la source
Même algorithme ...
Leaky Nun
2

Perl 6 , 43 octets

{(1..*).rotor({++$=>++$+1}...*).flat[$_-1]}

Essaye-le

Étendu:

{  # bare block lambda with implicit parameter 「$_」

  ( 1 .. * )                  # range starting from 1

  .rotor(                     # break it into chunks

    { ++$  =>  ++$ + 1} ... * # infinite Seq of increasing pairs
    #   1  =>    1 + 1    ==>   1 => 2 ( grab 1 skip 2 )
    #   2  =>    2 + 1    ==>   2 => 3
    #   3  =>    3 + 1    ==>   3 => 4
    # ...  =>  ... + 1

  ).flat\                     # reduce the sequence of lists to a flat sequence
  [ $_ - 1 ]                  # index into the sequence
                              # (adjusting to 0-based index)
}

(1..*).rotor({++$=>++$+1}...*) produit:

(
 (1,),
 (4, 5),
 (9, 10, 11),
 (16, 17, 18, 19),
 (25, 26, 27, 28, 29),
 ...
).Seq
Brad Gilbert b2gills
la source
2

TeX, 166 octets

\newcommand{\f}[1]{\count0=0\count1=0\loop\advance\count0 by\the\count1\advance\count1 by1\ifnum\count0<#1\repeat\advance\count0 by#1\advance\count0 by-1
\the\count0}

Usage

\documentclass[12pt,a4paper]{article}
\begin{document}
\newcommand{\f}[1]{\count0=0\count1=0\loop\advance\count0 by\the\count1\advance\count1 by1\ifnum\count0<#1\repeat\advance\count0 by#1\advance\count0 by-1
\the\count0}

\f{1}

\f{22}

\f{333}

\f{4444}

\f{12345}
\end{document}

entrez la description de l'image ici

Leaky Nun
la source
2

Javascript, 43 38 octets

n=>eval("for(r=1;n>r;)n-=r++;r*r+n-1")

Essayez-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.

mackoo13
la source
1

05AB1E , 12 octets

LεÝÁćn+}˜¹<è

Essayez-le en ligne!

Erik le Outgolfer
la source
Approche très cool!
Emigna
@Emigna Eh bien, je fais juste [0..a-1] + a**2, la chose cool ici imo est juste le ÝÁćn+lieu de D<Ýsn+.
Erik the Outgolfer
1

C # (mono) , 164 octets

using System.Linq;n=>{var a=new int[1]{1}.ToList();for(int i=1,m;a.Count<n;a.AddRange(new int[++i*2].Select((_,d)=>m+d+1).Skip(i).Take(i)))m=a.Max();return a[n-1];}

Essayez-le en ligne!

TheLethalCoder
la source
1

Mathematica, 37 octets

Flatten[Range@#+#^2-1&~Array~#][[#]]&

Explication

Range@#+#^2-1&

Functionqui prend un entier positif #et retourne la #suite de nombres consécutifs dans la séquence.

...~Array~#

Produit la liste de toutes ces exécutions jusqu'à l'entrée #

Flatten[...][[#]]

Flattensla liste résultante et renvoie le #e élément.

ngenisis
la source
1

Tampio , 310 308 octets

n:n uni on n unena 1:lle
a unena k:lle on a vuona k:lla vähennettynä a:sta ja k
a vuona nollalla ja k on a
a vuona k:lla vähennettynä nollasta ja k on a
a vuona b:n seuraajalla ja k on yhteenlaskun kutsuttuna k:n kerrottuna 2:lla arvolla ja k:n vähennettynä a:sta arvolla unena k:n seuraajalle seuraaja

Utilisation: 4:n uniévalue à9 .

Explication:

n:n uni on n unena 1:lle
uni(n)  =  n `uni` 1

a unena k:lle on  a vuona  k:lla vähennettynä a:sta ja k
a `uni` k     =  (a `vuo` (k     `vähennetty` a)    )  k

 a vuona nollalla ja k on a
(a `vuo` 0        )  k =  a

 a vuona  k:lla vähennettynä nollasta ja k on a
(a `vuo` (k     `vähennetty` 0)       )  k =  a

 a vuona  b:n seuraajalla ja k on
(a `vuo` (b   + 1)        )  k =

 yhteenlaskun kutsuttuna k:n kerrottuna 2:lla arvolla
(yhteenlasku            (k   *          2     )

 ja k:n vähennettynä a:sta arvolla unena  k:n seuraajalle seuraaja
((  k   `vähennetty` a     )       `uni` (k   + 1)   )  ) + 1

De la bibliothèque standard:

a `vähennetty` b = b - a
yhteenlasku a b  = a + b
fergusq
la source
1

JavaScript (ES6), 33 octets

Solution récursive inspirée des observations de Xanderhall .

f=(n,x=1)=>n<x?n+x*x-1:f(n-x,++x)

Essayez-le

o.innerText=(
f=(n,x=1)=>n<x?n+x*x-1:f(n-x,++x)
)(i.value=12345);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>

Hirsute
la source
0

Python 3 , 50 octets

def f(n):
 a=i=0
 while a<n:a+=i;i+=1
 return~-a+n

Essayez-le en ligne!

Leaky Nun
la source
Cela bénéficierait vraiment d'un portage de programme complet vers Python 2 ( 46 octets -
lierait l'
0

Mathematica, 82 octets

Complement[Range[3#],Array[#+⌊((r=Sqrt[1+8#])-1)/2⌋⌊(r+1)/2⌋/2&,3#]][[#]]&
J42161217
la source
0

Javascript (ES6) 100 98 octets

var k=n=>{var s=[],i=1,c=1,j;while(s.length<n){for(j=i;j<i+c;j++){s.push(j)}i+=c*2+1;c++}return s}

J'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.

Endormi
la source
0

Rétine , 27 octets

.+
$*
((^1|1\2)+)1
$1$2$&
1

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; $1est le nombre triangulaire correspondant tandis que$2 son index. La fin 1signifie 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 $1qu'équivalent à a-iet $2à i-1et que leur somme est a-1ou ~-aselon 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ée 1sans correspondance, la sortie est simplement la même que l'entrée. Si vous étiez pervers, vous pourriez utiliser^((^1|1\2)*)1

Neil
la source
0

MATL , 12 octets

:"@U@:q+]vG)

Essayez-le en ligne!

Explication

:        % Push range [1 2 ... n], where n is implicit input
"        % For each k in that range
  @U     %   Push k^2
  @:     %   Push range [1 2 ... k]
  q      %   Subtract 1: gives [0 1 ... k-1]
  +      %   Add: gives [k^2 k^2+1 ... k^2+k-1]
]        % End
v        % Concatenate all numbers into a column vector
G)       % Get n-th entry. Implicitly display
Luis Mendo
la source
0

PHP, 48 42 37 + 1 octets

porté de la réponse de Leaky Nun

while($argn>$a+=$i++);echo$a+~-$argn;

Exécuter en tant que pipe avec -Fou l' essayer en ligne .

approche directe, 42 + 1 octets (porté depuis l' autre réponse de Leaky Nun )

<?=($a=(2*$argn)**.5+.5|0)*-~$a/2+~-$argn;

Exécuter en tant que tuyau avec -nRou décommenter dans TiO ci-dessus.

ancienne solution itérative, 48 + 1 octets

for(;$argn--;$n++)$c++>$z&&$n+=++$z+$c=1;echo$n;
Titus
la source