(Défi tiré d'un jeu multijoueur (conflit de code) sur codingame.com )
Le défi
Trouvez le n- ième terme de la séquence suivante: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4...
ou, pour le rendre plus évident,{1}, {1,2}, {1,2,3}, {1,2,3,4}...
La séquence est composée de plages concaténées de 1 à x , allant de 1 à l'infini.
Règles / IO
L'entrée et la sortie peuvent être dans n'importe quel format, à condition qu'elles soient distinguables. Les entrées peuvent être prises à partir de n’importe quelle source appropriée: STDIN, fichier, etc.
L'entrée peut être indexée 0 ou 1, et l'indexation sélectionnée doit être mentionnée dans l'article.
Vous devrez gérer au moins un résultat de 255 inclus (ce qui signifie que l'entrée maximale indexée par 0 est 32640). Tout ce qui a été traité doit être géré si votre langue le permet.
C'est code-golf
le nombre d'octets le plus court qui gagne!
Cas de test (indexation basée sur 0)
0 -> 1
1 -> 1
5 -> 3
10 -> 1
59 -> 5
100 -> 10
1001 -> 12
59
,100
, etc.)Réponses:
05AB1E , 5 octets
Le programme est indexé par 0, code:
Explication:
Utilise le codage CP-1252 . Essayez-le en ligne!
la source
GNG¹¾¼QiN
est une approche itérative, mais c'était plus intelligent.Haskell ,
27 à26 octetsEssayez-le en ligne!
Merci @DanD. pour -1 octet!
Ceci est une fonction anonyme, ce qui crée la séquence infinie un juste retour du
n
son -ième élément:[[1..k]| k<-[1..]]
produit une liste infinie de la liste:[[1],[1,2],[1,2,3],[1,2,3,4],...]
. Pour concaténer ceux-ci, nous pouvons écrire[z|k<-[1..],z<-[1..k]]
ce qui aboutit[1,1,2,1,2,3,1,2,3,4,...]
et finalement(...!!)
accepte l’entréen
(notation sans point) et renvoie len
-th terme (basé sur 0).la source
concat
plus la compréhension enregistre uniquement 1 octet:([z|k<-[1..],z<-[1..k]]!!)
.JavaScript,
2928 octets-1 octet grâce à Arnauld!
Utilise la formule récursive à indice 0 trouvée dans OEIS.
Lorsqu'il est appelé avec 1 argument comme prévu, la valeur par défaut du second
m
, seraundefined
. Cependant,-~undefined
retourne 1, ce qui nous permet de faire rouler la récursivité sans explicitem = 1
dans la liste des arguments (merci @Arnauld!)Extrait de test:
Alternativement, pour le même nombre d'octets, nous pouvons avoir une fonction curry comme ceci:
Vous pouvez appeler cela avec
f(5)()
- il renvoie une fonction qui, lorsqu'elle est appelée, renvoie le résultat, comme décrit dans cette méta publication .la source
Gelée , 5 octets, 1 indexé
Essayez-le en ligne!
Explication:
la source
Octave, 39 octets
Indice basé sur 1
Explication:
Considérons cette séquence:
si nous comptons le nombre d'éléments de sous-séquences que nous avons
donc en utilisant la formule de Gauss pour les nombres triangulaires, nous pouvons former une formule pour z:
c'est une équation du second degré si nous le résolvons pour n nous avons
Essayez-le en ligne!
la source
Haskell,
25 à24 octetsExemple d'utilisation:
((!!)$[1..]>>= \x->[1..x]) 10
->1
. Essayez-le en ligne! .Mappe la fonction anonyme make-a-list-from-1-to-x
\x->[1..x]
(l'intégrationenumFromTo 1
est un octet plus long) à la liste infinie[1..]
et concatène les listes résultantes en une liste unique.!!
choisit le nième élément.Merci à @flawr pour un octet.
la source
(!!)$[1..]>>= \x->[1..x]
. Parfois , je souhaite vraiment qu'il y avait une façon inutile d'écrire plus court\x->[1..x]
:)<$>
qui ne sont pas dans la portée. Connaissez-vous un compilateur / interprète Haskell en ligne utilisant la version la plus récente? haskell.org n'autorise que les expressions et vous ne pouvez pas créer de liens vers le code que vous avez entré.Octave , 39 octets
Essayez-le en ligne!
Ceci utilise une approche alternative.
Par exemple,
n=1
celaA=triu(v'+0*v)
crée la matriceEn supprimant tous les éléments nuls et en ajoutant les colonnes par,
A(A>0)
on obtient la séquence:Ensuite, il suffit d'extraire le ième
n
terme de cette séquence.la source
Python ,
3936 octets-3 octets grâce à Dennis!
Un lambda récursif qui utilise l'indexation basée sur 1.
Essayez-le en ligne!
Nous gardons une trace de la "taille" actuelle en utilisant
m
. Sin
est inférieur ou égal àm
, il correspond à la "hausse" actuelle et nous le renvoyons donc. Cependant, si sa taille est supérieure àm
, nous lam
supprimons plutôt que d'ajouter 1m
et d'appeler la fonction de manière récursive (en passant à la prochaine hausse).la source
R, 25 octets
L'indice est basé sur 1.
la source
sequence
répondu, et j'étais heureux de le voir.Pyth ,
65 octets1 octet enregistré grâce à @TheBikingviking!
Ceci utilise l'indexation basée sur 0.
Essayez-le en ligne!
Explication
la source
.n
avecs
.Mathematica,
2724 octetsMerci @MartinEnder pour 3 octets!
1 indexé. Cela génère des erreurs que vous pouvez ignorer en toute sécurité.
Explication
la source
Join@@
c'est beaucoup trop cher;)((r=Range)@r@#<>1)[[#]]&
StringJoin
n'est pas évalué ... J'aime çabrainf * ck, 78 octets
Prend les entrées (basées sur 0) et les sorties sous forme d'octets.
Vous pouvez le tester ici.
La saisie nécessite un nombre
\
avant décimal (par exemple,\10
pour 10). Si la sortie est un caractère ASCII imprimable, vous devriez le voir. Sinon, appuyez sur view memory -> final dump. La valeur qui a été imprimée est dans la 3ème cellule (numéro de cellule 2).Explication:
Cellule 0 (ENTREE): est l'entrée et est décrémentée de 1 chaque fois dans la boucle.
Cellule 1 (RESET): incrémente de 1 chaque fois qu'elle est égale à TERM. Pour ce faire, nous ajoutons 1 à chaque boucle de la boucle et soustrayons 1.
Cellule 2 (TERM): incrémente de 1 chaque boucle et est définie sur 0 si elle correspond à RESET. Pour ce faire, je ne recopie la valeur de HOLD que si cette cellule n’est pas égale à RESET.
Cellule 3 (EQUAL): permet de vérifier si RESET et TERM sont égaux.
Cellule 4 (HOLD): permet de copier les valeurs de RESET et TERM après le contrôle d’égal.
la source
Pyke, 6 octets
Essayez-le ici!
0 indexé.
la source
R,
4341 octetsEdit: trouvé une approche récursive plus courte en utilisant A002262 + 1 (0 indexé):
Ancienne version:
Formule 1-indexée d'OEIS.
la source
Perl 6 , 21 octets
0 indexé. Essayez-le en ligne!
Comment ça marche:
Perl 6 , 21 octets
0 indexé. Essayez-le en ligne!
Comment ça marche:
la source
Aucune de ces solutions n'est aussi courte que celle de JungHawn Min , mais ce sont des approches alternatives, ce que je suppose. Les deux sont des fonctions sans nom prenant une entrée d’entier positif (indexé 1) et renvoyant un entier positif.
Mathematica, 30 octets
Une formule mathématique réelle pour cette fonction! Fait plus lisible (en partie en traduisant les caractères 3 octets
⌈
,√
et⌉
):Ceiling[Sqrt[2 * #] - 1/2]
nous dit à quelle sous-liste se réfère l'entrée, à laquelle nous soustrayons un pour nous dire quelle sous-liste se termine avant d'arriver à l'entrée; puis((#^2 + #) / 2 &)
calcule le nombre d’éléments contenus dans toutes les sous-listes avant celle qui nous intéresse, que nous soustrayons de l’entrée#
pour obtenir notre réponse. (Certains remarqueront la formule familière(#^2 + #) / 2
pour le#
nombre triangulaire th;Ceiling[Sqrt[2 * #] - 1/2]
est essentiellement la fonction inverse.)Mathematica, 32 octets
Solution récursive, fondamentalement la même que dans la réponse de Billywob et d’autres.
la source
Brain-Flak , 46 bytes
Zéro indexé
Essayez-le en ligne!
Stack Clean, 48 octets
Essayez-le en ligne!
Explication
Ceci est une version modifiée de la fonction modulo . Au lieu d'utiliser un nombre constant comme diviseur, il incrémente le diviseur à chaque fois que le diviseur en est soustrait (une fois par itération de la boucle extérieure).
Code annoté
la source
Java 8,
857355 octetsApproche récursive indexée par 0 avec la formule fournie dans l' OEIS :
Essayez ici.
Ancienne réponse (
8556 octets):Utilisation de l’autre formule à indexation 0 fournie dans le système OEIS :
Essayez ici.
la source
Perl , 30 octets
29 octets de code +
-p
drapeau.Essayez-le en ligne!
la source
MATL, 8 octets
Cette solution utilise l'indexation 1
Essayez-le sur MATL Online
Explication
la source
v
à autre chose]
QBIC , 21 octets, 1 indexé
Explication:
Approche légèrement plus intéressante, mais 10 octets de plus:
Ce programme calcule en continu le nombre total de nombres dans cette tranche et tous les précédents (
1 at loop 1, 3 at loop 2, 6 at loop 3 ...
). Lorsque ce compteur dépasse l'indice N recherché, retournez X depuis le support actuel, où X est N moins le montant précédent du compteur.la source
Ruby, 30 octets
Indexation basée sur 1
la source
R, 37 octets
Prend une entrée à partir de
n
et crée la séquence pour les premièresn
séquences. Cela le rend quelque peu inefficace avec des intrants plus élevés, mais ça devrait aller. Il retourne ensuite lan
-ème entrée, 1-indexée.Utilise une petite astuce en commençant par la séquence avec
T
, qui estTRUE
ou1
par défaut.la source
C11, 48 octets
Essayez-le en ligne!
Fonctionne également en C ++ et Java.
Une alternative pour le même nombre d'octets:
la source
brainfuck, 141 octets
Je sais que je suis trop tard pour la prime, mais je voulais simplement savoir combien d'octets l'algorithme auquel je pensais serait destiné.
Ce programme est indexé à zéro.
Essayez-le en ligne
255
, définissez Taille de la cellule (bits) sur 16 ou 32 .\5
pour entrer5
.\999
Explication:
Cela montre le programme divisé en étapes, montrant ce qui se passe pour la saisie de
5
.#
sont placés dans les emplacements de vidage de mémoire idéaux pour l'interprète.Vous voudrez probablement utiliser la case à cocher Dump Memory at char:
#
si vous utilisez cette version. Cela videra la mémoire lors de la frappe#
, ce qui vous permettra de voir la valeur sur la bande dans le cas où il s'agirait d'un caractère non imprimable, ou de voir ce qui se passe à n'importe quelle étape de votre choix. La cellule sur laquelle se trouve le pointeur sera en gras.Essayez-le en ligne
#
Remarques:
>
au début. Le nombre requis peut varier en fonction de la valeur d'entrée, mais est O (1).la source
tinylisp ( repl ), 90 octets (indexé par 0)
Ou, non en concurrence (à l'aide d'une fonctionnalité validée après la publication de ce défi), 80 octets :
La première ligne définit une fonction d'assistance
r
et la deuxième ligne est une fonction non nommée qui prendn
et retourne le nième terme de la séquence. J'ai spécifié cela en tant que soumission de réplication, car la réplication complète automatiquement les parenthèses à la fin de chaque ligne, pas seulement à la fin du programme. Avec ces mises en garde, voici une version modifiée pour fonctionner sur Essayez-le en ligne , et voici une version non-golfée exécutée sur les entrées 0 à 54.Explication
Je vais utiliser la version non compétitive ici. La seule différence est que la version officielle doit implémenter l'addition sous forme de deux soustractions.
la source
C, 54 octets
Ce n'est pas la solution C la plus courte, mais elle a le mérite de fonctionner en temps constant (pas de boucles, juste des maths). Il utilise l'indexation à base zéro:
Ungolfed:
Test avec:
la source
C, 103 octets
Pour un débutant, ça va, je pense :).
ou la manière formatée
la source
n,c,i,j
globales, il est garanti qu'elles sont initialisées à 0, ce qui n'est pas le cas des locales.n
est l'entrée ou le nième nombre de la séquence,c
est un compteuri
etj
est un élément de boucle;j
sera 1 puis 2 puis 3 alors quei
sera 1 puis 1,2 puis 1,2,3 et ainsi de suite. @ Qwerp-Derpdc , 21 octets, indexation basée sur 0
Essayez le programme en ligne!
Explication:
Le sommet de la pile contient maintenant l'indice k du plus grand nombre triangulaire qui est <= n.
Ce programme en continu peut être converti en un script bash de taille compétitive:
Utilitaires Bash + Unix, 28 octets, indexation basée sur 0
Essayez le programme bash en ligne!
la source
C,
8144 octetsméthode itérative droite, 0 indexée et avec un léger massage;
Essayez-le en ligne!
la source