Comptons...
Compter jusqu'à 2 et revenir à 1
Compter jusqu'à 4 et revenir à 1
Compter jusqu'à 6 et revenir à 1
... ok vous l'avez compris ...
mettez tout cela ensemble et vous obtiendrez la séquence suivante
{1,2,1,2,3,4,3,2,1,2,3,4,5,6,5,4,3,2,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,2,3...}
Défi
Étant donné un entier n>0
pour 1-indexé (ou n>=0
pour 0-indexé), sortez le nième terme de cette séquence
Cas de test
Input->Output
1->1
68->6
668->20
6667->63
10000->84
Règles
votre programme doit être capable de calculer des solutions jusqu'à n = 10000 en moins d'une minute
C'est le code-golf , donc le code le plus court en octets gagne!
Réponses:
JavaScript (ES7),
59 ... 4443 octets1 octet enregistré grâce à Titus
Entrée attendue: 1 indexée.
Initialement inspiré d'une formule pour A004738 , qui est une séquence similaire. Mais j'ai fini par le réécrire entièrement.
Cas de test
Afficher l'extrait de code
Comment?
La séquence peut être organisée en triangle, avec la partie gauche en ordre croissant et la partie droite en ordre décroissant.
Voici les 4 premières lignes, contenant les 32 premiers termes:
Maintenant, introduisons quelques variables:
Nous commençons avec 2 éléments en haut et ajoutons 4 éléments à chaque nouvelle ligne. Par conséquent, le nombre d'éléments sur la ligne r indexée 0 peut être exprimé comme suit:
La position de départ x indexée 1 de la ligne r est donnée par la somme de tous les termes précédents de cette série arithmétique plus un, ce qui conduit à:
Réciproquement, étant donné une position n indexée 1 dans la séquence, la ligne correspondante peut être trouvée avec:
ou comme code JS:
Une fois que nous connaissons r (n) , nous soustrayons la position de départ x (r) moins un de n :
Nous comparons n avec a (r) / 2 + 1 = 2r + 2 pour savoir si nous sommes dans la partie ascendante ou descendante:
Si cette expression est vraie, nous retournons n . Sinon, nous retournons 4 (r + 1) - n . Mais puisque r a déjà été incrémenté dans la dernière instruction, cela est simplifié comme suit:
la source
Haskell , 37 octets
Essayez-le en ligne!
Zéro indexé. Génère la liste et y indexe. Merci à Ørjan Johansen pour avoir économisé 2 octets!
Haskell , 38 octets
Essayez-le en ligne!
Zéro indexé. Génère la liste et y indexe.
Haskell , 39 octets
Essayez-le en ligne!
Zéro indexé. Une méthode récursive.
la source
Python , 46 octets
Essayez-le en ligne!
Zéro indexé.
la source
Husk , 8 octets
1 indexé. Essayez-le en ligne!
Explication
la source
Perl 6 , 29 octets
Essayez-le en ligne
Basé sur 0
Étendu:
La séquence intérieure
1...$+=2...2
produitPour qu'il soit basé sur 1, ajoutez
0,
avant le second{
ou ajoutez-1
après$_
la source
R, 64 octets
Fonction qui prend un argument
n
. Il crée un vecteur2:n
avec des incréments de 2. Pour chacun d'eux, le vecteur1:(x-1)
etx:2
est créé. Au total, cela sera plus long quen
. Nous l'avonsunlist
, pour obtenir un vecteur et prendre lan
-ième entrée.la source
1:n*2
place deseq(2,n,2)
? Ce sera plus grand que ce dont vous avez besoin mais ça devrait aller! De plus, je ne pense pas que cela ait fonctionnéseq(2,n,2)
den=1
toute façon!Python 2 , 56 octets
Essayez-le en ligne!
Ceci est indexé 0.
-1 octet grâce à @JustinMariner
Comment cela fonctionne
Nous notons que le 1-indexé
n
-ème groupe (1, 2, ... 2n ..., 2, 1
) se produit à partir des éléments numérotés de 02(n-1)^2
à2n^2
.Pour trouver l'élément à l'index
x
, nous pouvons trouver le numéro de groupen
quix
est dedans. À partir de cela, nous calculons la distance du centre du groupe quix
est. (Cette distance estabs(2*n**2+2*n+2-x)
).Cependant, comme les éléments diminuent encore plus loin du centre d'un groupe, nous soustrayons la distance de la valeur maximale du groupe.
la source
print 2*n-abs(2*n*n+2*n+1-x)+2
-2*n*n+2*n
peut être2*n*-~n
et+2+2*n
peut être transformé en-~n*2
, ce qui nous permet de le déplacer vers le début, ce qui économise des octets ( 53 octets )05AB1E , 8 octets
Code:
Utilise l' encodage 05AB1E . Essayez-le en ligne!
Explication:
la source
€1
est bizarre ...JavaScript, 39 octets
la source
Gelée ,
10, 9 octetsEssayez-le en ligne!
Aussi 1 indexé, et se termine assez rapidement.
Un octet enregistré grâce à @ErikTheOutgolfer!
Explication:
Hypothétiquement, disons que l'entrée (
a
) est 3.la source
Ḥ€ŒḄ€Ṗ€Fị@
, vous pouvez donc utiliserµ€
pour -1 (trois ou plusieurs monades avec€
au début):ḤŒḄṖµ€Fị@
ḤŒḄṖ
<newline>½ĊÇ€Fị@
pour 12 pour se conformer à l'exigence de 10000 (l'exécution locale du code de 9 octets prend environ 2:20 sur mon i7 et utilise 7 Go)MATL , 15 octets
1 basé.
Essayez-le en ligne!
Cela arrive à expiration pour les plus grands cas de test de TIO, mais se termine à temps sur mon ordinateur de bureau (compilateur fonctionnant sur MATLAB R2017a). Pour afficher le temps écoulé, ajoutez
Z`
à la fin du code.Explication
Le code génère beaucoup plus de termes que nécessaire. Plus précisément, il calcule des
n
"morceaux" de la séquence, où chaque morceau est un décompte vers le haut et retour à 1.la source
Husk ,
1210 octetsEssayez-le en ligne!
1 indexé, fonctionne assez rapidement
Explication
la source
…
Mathematica, 90 octets
Essayez-le en ligne!
la source
Rétine , 62 octets
Essayez-le en ligne! Le lien inclut des cas de test. L'entrée est indexée sur 1. La première étape est juste une conversion décimale en unaire. La deuxième étape trouve le nombre carré le plus élevé
s
strictement inférieur à la moitié den
;$1
ests²
, tout$2
est2s-1
. Il calcule deux valeurs, premièrement le nombre de nombres dans la montée / descente actuelle, qui est4(s+1) = 4s+4 = 2$2+6
, et deuxièmement la position dans cette course, qui estn-2s² = n-(2$1+1)+1 = n-$&+1
, ce qui nécessite juste un1
pour compenser le1
utilisé pour appliquer l'inégalité stricte. L'étape finale compte ensuite à partir de cette position jusqu'au début et à la fin de la course et prend le résultat inférieur et le convertit en décimal.la source
Mathematica, 67 octets
Essayez-le en ligne!
la source
Perl 5 , 43 + 1 (-p) = 44 octets
Essayez-le en ligne!
Je travaillais sur une formule pour calculer directement le n-ième élément. Puis j'ai vu que @ fireflame241 avait fait ce travail, et je l'ai joué au golf dans Perl.
# Perl 5 , 50 + 1 (-n) = 51 octetsEssayez-le en ligne!
Les résultats sont indexés à 0.
la source
Haskell ,
11581 octetsEssayez-le en ligne!
Il y a de la magie ici. Cela pourrait probablement être plus court si j'utilisais une approche normale.
Explication
Nous définissons d'abord
%
.%
est une fonction qui prend deux variablesx
, ety
. Il construit une listescanl(+)y[y+1,y+3..]
et trouve le premier élément de cette liste supérieur àx
.scanl(+)
effectue simplement des sommes itératives, pour obtenir les nombres triangulaires que nous ferionsscanl(+)0[1..]
, pour obtenir les nombres carrés que nous ferionsscanl(+)0[1,3..]
. Les deux listes en particulier que nous allons construire sontscanl(+)2[3,5..]
etscanl(+)1[2,4..]
ce sont les points d'inflexion du motif.Maintenant, nous définissons la fonction principale
g
qui prend unx
. Six
c'est un, nous revenons1
car c'est la première valeur. Sinon, nous vérifions les deux points d'inflexion suivants, si l'inflexion vers le bas est plus grande,1%x>2x
nous renvoyons le successeurg$x-1
sinon nous retournons le prédécesseur deg$x-1
.Ok mais pourquoi ça marche?
Tout d'abord "Quelle est la façon dont nous trouvons les sommets?". Il est important de noter la distance entre les sommets consécutifs du même type. Vous remarquerez que les différences augmentent de 2 à chaque fois. Cela a du sens car les bases des triangles s'élargissent de 2 fois à chaque fois. Nous pouvons faire une différence constante de liste en utilisant un littéral de liste comme ça
[2,4..]
et nous utilisonsscanl(+)
pour transformer ces listes en listes de sommets, en fonction de l'emplacement du premier sommet et de la première différence.Alors maintenant que nous avons un moyen de trouver des sommets vers le haut et vers le bas, nous pouvons utiliser ces informations pour obtenir les valeurs. Nous disons que la première valeur est
1
sinon nous devons prendre soit le successeur soit le prédécesseur. Si le sommet suivant est vers le haut, nous voulons prendre le prédécesseur, sinon nous prenons le successeur.Haskell ,
565146 octetsVoici ma meilleure solution avec moins de mathématiques et moins d'octets.
Essayez-le en ligne!
la source
Pyke , 14 octets
Essayez-le ici!
la source
C # (.NET Core) , 120 octets
Explication: assez simple, la première boucle imbriquée grimpe à notre maximum, la seconde redescend à 2. La répétition pour chaque multiple de 2.
Essayez-le en ligne!
la source
Rubis ,
7875 octets1 octet enregistré grâce à Step Hen
1 octet enregistré grâce à M. Xcoder
Essayez-le en ligne!
J'espère que je pourrai obtenir quelques conseils pour réduire davantage le nombre de bytes. J'ai essayé d'adopter une approche simple.
la source
c=1 if
peut êtrec=1if
->n{a=0;b=2;c=1;n.times{if a==b then c=0;b+=2;end;c=1if a==1;a+=c<1?-1:1};a}
Java (OpenJDK 8) , 53 octets
Essayez-le en ligne!
-2 octets grâce à Nevay.
1 indexé.
TL; DR Nous divisons la séquence en morceaux pratiques, trouvons que le morceau
n
est dedans , puis trouvons lenth
position dans le morceau.Ici, nous pouvons diviser la séquence comme
[[1,2],[1,2,3,4,3,2],[1,2,3,4,5,6,5,4,3,2],...]
, ce qui nous donne des tailles de morceaux de4i-2
. A partir dei=2
, nous soustrayons ài
partirn
, essentiellement déplacer vers le haut un morceau à la fois. Une fois que nous sommes satisfaitsn<=i
, nous savonsn
maintenant que la position de la valeur correcte est dans le bloc actuel.Nous obtenons ensuite la valeur en la comparant
n
ài
la taille du morceau. Le milieu de chaque morceau est égal ài/2+1
; s'iln
est inférieur à cela, nous revenons simplementn
. Sin
est plus grand, nous revenonsi-n+2
.Exemple
la source
+1
,return n>i/2?i-n+2:n
c'est suffisant.Python 2 , 5! octets (120 octets: P)
Essayez-le en ligne!
Simple, fait la liste et prend ensuite l'élément d'entrée
la source
Python 3 ,
184156 octetsEssayez-le en ligne!
golfé avec un générateur Python pour une évaluation "paresseuse"
la source
QBIC , 47 octets
Explication
la source
Röda , 54 octets
Essayez-le en ligne!
Appeler avec:
try f(n)
Cette fonction renvoie rapidement la réponse, mais après cela fait des calculs inutiles et finit par manquer de mémoire.
Comme la fonction renvoie la réponse réelle peu de temps après son appel (clairement en moins d'une minute), je pense que cette réponse est valide.
(Dans Röda, les fonctions peuvent renvoyer des valeurs avant leur sortie en raison du parallélisme.)
la source
C # (.NET Core) ,
99 9586 octetsEssayez-le en ligne!
Fonction lambda qui prend et retourne un entier. Boucle unique qui gère le comptage de haut en bas.
la source
PHP, 65 + 1 octets
Exécutez en tant que pipe avec
-R
ou essayez-le en ligne (ou décommentez l'une des autres versions).Un port de JavaScript récursif de tsh prend 66 octets:
Un port de la solution d'Arnauld prend 62 + 1:
Un port de golf de Java de Xanderhall possède le code le plus court à ce jour (55 + 1 octets):
la source
Pyth ,
1918 octetsEssayez-le ici!
la source