Ce défi consiste simplement à renvoyer une liste de listes d'entiers, semblable à la fonction de plage Python, sauf que chaque numéro successif doit être aussi profond que cela dans les listes.
Règles :
- Créer un programme ou une fonction non anonyme
- Il doit retourner ou imprimer le résultat
- Le résultat doit être retourné dans une liste (de listes) ou un tableau (de tableaux)
- Si le paramètre est zéro, renvoyez une liste vide
- Cela devrait être capable de gérer un paramètre entier 0 <= n <70.
- (les solutions récursives explosent assez rapidement)
- La fonction doit pouvoir être appelée avec un seul paramètre.
- Les autres comportements ne sont pas définis.
- C'est le golf de code, donc le code le plus court gagne.
Exemple d'appel:
rangeList(6)
> [0, [1, [2, [3, [4, [5]]]]]]
Cas de test:
0 => []
1 => [0]
2 => [0, [1]]
6 => [0, [1, [2, [3, [4, [5]]]]]]
26 => [0, [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20, [21, [22, [23, [24, [25]]]]]]]]]]]]]]]]]]]]]]]]]]
69 => [0, [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20, [21, [22, [23, [24, [25, [26, [27, [28, [29, [30, [31, [32, [33, [34, [35, [36, [37, [38, [39, [40, [41, [42, [43, [44, [45, [46, [47, [48, [49, [50, [51, [52, [53, [54, [55, [56, [57, [58, [59, [60, [61, [62, [63, [64, [65, [66, [67, [68]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
EDIT: la réponse d'isaacg est la plus courte jusqu'à présent. Je mettrai à jour la réponse acceptée si quelqu'un en trouve une plus courte dans une langue qui existait lors de la publication du défi. Merci d'avoir joué!
code-golf
array-manipulation
mbomb007
la source
la source
import math
en Python par exemple, je ne pense pas qu'il puisse se produire à l'intérieur d'une fonction.Réponses:
Pyth, 13 octets
Essayez-le ici.
la source
APL (
1318)En supposant
⎕IO=0
:Explication:
×⍵:
si⍵
est positif,,∘⊂∘,
: joindre l'opérande gauche à la clôture de l'opérande droit (iex ,∘⊂∘, y = [x, [y]]
)/
: réduire⍳⍵
: les nombres0..⍵-1
⊃
: dévoiler le résultat⋄
: autrement⍬
: retourne la liste vide/
échoue⍬
et⍳0
donne la liste vide.)Addenda:
Cette fonction renvoie un tableau imbriqué. Cependant, il est un peu difficile de le dire à partir de la sortie par défaut d'APL. Il sépare les éléments du tableau par des espaces, vous ne pouvez donc dire l'imbrication que par des espaces doubles. Voici une fonction qui prendra un tableau imbriqué et retournera une chaîne, formatant le tableau imbriqué en style Python (ie
[a,[b,[c,...]]]
).la source
f←
au début de votre programme, sauf si vous le modifiez pour accepter l'entrée utilisateur.Haskell, 67 octets
Dans Haskell, tous les éléments d'une liste doivent être du même type, je ne peux donc pas mélanger des entiers avec une liste d'entiers et je dois définir un type de liste personnalisé
L
. La fonction d'assistance#
construit récursivement la liste requise. La fonction principalep
vérifie la liste vide et appelle#
autrement.Comme les nouveaux types de données ne peuvent pas être imprimés par défaut (les règles permettent juste de renvoyer la liste), j'ajoute un peu plus de code à des fins de démonstration:
À présent:
la source
Python, 48 octets
Utilisation de la multiplication de listes pour gérer le cas spécial.
la source
*(i<n-1)
peut être fait comme[:n+~i]
, car il s'agit d'une liste singleton.Mathematica, 33
la source
CJam, 16 octets
Ceci est un programme complet. Il prend l'entrée via STDIN et imprime le tableau final sur STDOUT.
Comme pour l'autre entrée CJam, l'
0
entrée sera imprimée""
car c'est la représentation d'un tableau vide dans CJam.Comment ça marche :
Essayez-le en ligne ici
la source
JavaScript (ES6) 40
Solution récursive, assez robuste, pas de coups. La mise à jour échoue près de 6500 avec «trop de récursivité»
Solution itérative (45) Aucune limite, sauf l'utilisation de la mémoire
Essayez F (1000): la console FireBug ne vous montrera pas plus de 190 tableaux imbriqués, mais ils sont là
la source
Java,
88107105104102 octetsAssez long par rapport aux autres, bien que vous ne puissiez pas faire beaucoup mieux avec Java. Une vérification pour déterminer s'il faut continuer la récursivité est tout ce qu'il faut.
la source
import java.util.*;
que cela soit autonome (ou pleinement qualifiéjava.util.List
etjava.util.Stack
, mais c'est beaucoup plus long). +19 pour le rendre 107, toujours 7 mieux que la réponse Java sur laquelle je travaillais: Do!=n
peut êtreo<n
, et vous pouvez échanger le ternaireo<n?o++:""
.final
onint n
peut être supprimé.Python 2, 56 octets
Je soupçonne que cela pourrait être joué davantage.
Tests:
la source
CJam, 17 octets
Je sais que Optimizer en a trouvé 16, mais voici ce que je peux faire de mieux:
Il s'agit d'un bloc, la chose la plus proche d'une fonction dans CJam, qui prend un entier sur la pile et laisse le tableau imbriqué souhaité.
Utilisez ce programme pour le tester , ce qui place l'entrée sur la pile, puis appelle la fonction et inspecte la pile. Notez que pour
0
la sortie de la pile contiendra""
- c'est une représentation native d'un tableau vide de CJAM.la source
Rubis 46
Testez-le en ligne: http://ideone.com/uYRVTa
la source
C # - 100
Récursivité simple. Vérifiez le cas spécial zéro et cochez avec une variable, vers le bas avec l'autre
C ++ 87
(Visual C ++ 2012)
Celui-ci est génial, j'entends par byzantin, mais c'est la même idée de base que le c # one.
C'est une implémentation de tableau de style C, donc elle ne vous donne pas de tableau, elle donne un pointeur int, dans lequel je stockais à la fois des entiers et d'autres pointeurs. Comme ça:
[0,*] *->[1,#] #-> [2,&] &-> etc
où les symboles sont un pseudo-code pour la valeur int d'un pointeur et le -> où il pointe en mémoire.Quelle excellente implémentation facile à utiliser des tableaux irréguliers de style c que j'ai imaginée (toux), mais je maintiens qu'elle est suffisamment plausible pour être dans les règles de la question.
Il y a beaucoup d'abus d'opérateurs ternaires ici, et aussi beaucoup d'abus de la distribution implicite de int à bool.
Exemple: si nous le laissons
int *bar = (int*)A(3);
, nous pouvons voir:Ce qui est un pointeur parler pour [0, [1, [2]]].
D'accord, très bien. Il n'est pas nécessaire que ce soit horrible. Voici un code de test pour exécuter ce code c ++:
}
la source
C++
.Array g(params object[]a)=>a;Array f(int y,int x=0)=>y<1?g():y<2?g(x):g(x,f(y-1,x+1));
Pyth, 15 octets
Ce qui veut vraiment dire, en Python:
la source
qJ_1
est le même que!Q
. EtJtQ
gaspille en fait 1 octet.?Y!Qu[HG)_UtQ[tQ
[tQ
en]tQ
, ce qui est équivalent, vous passez à l'ordre des opérations de?
, afin de pouvoir le remplacer!Q
parQ
. Il en résulte?u[HG)_UtQ]tQQY
- 1 octet de plus enregistré.Haskell ,
65 59 4541 octetsCes listes imbriquées ont la même structure de données que les
Tree
s enracinées , sauf qu'elles peuvent également être vides. Par conséquent, nous pouvons utiliser une liste d'entre eux - également appelée aForest
pour les représenter.Essayez-le en ligne!
Explication
Tout d'abord, nous devons implémenter le
Tree
type de données:À partir de là, il ne s'agit que de récursivité en utilisant deux paramètres
m
(comptage) etn
de garder une trace quand terminer:Alternative, 61 octets
Essayez-le en ligne!
Explication
La fonction
unfoldForest
prend une liste de valeurs initiales et une fonctionx -> (y,[x])
. Pour chaque valeur initiale,x
il déplie un arbre à l'aide de la fonction, produisant un tuple(y,xs)
oùy
deviendra la racine etxs
sont utilisés pour répéter la procédure:la source
Perl - 44
Ajoutera une explication sur demande. Vous pouvez l'essayer ici .
la source
nil
ou quoi que ce soit équivalent? Je demande parce que sur la page que vous liez au tableau le plus intérieur ressemble(3,)
undef
est l'équivalent denil
ounull
en Perl et il n'y a pas d'élément supplémentaire. Perl aplatit les tableaux, ce qui crée des références de tableau imbriquées.JavaScript, 93 octets
Ce n'est pas idéal, mais je pourrais aussi bien essayer. Je vais essayer de jouer au golf plus tard, mais pour l'instant je ne vois aucun moyen évident de le faire.
la source
Python, 75 octets
C'est juste pour le spectacle. C'est le programme que j'ai écrit lors de la création / conception de ce défi.
la source
Python, 44
Crée récursivement l'arbre. La
[:n]
fin est de cas particuliern==0
en donnant la liste vide.la source
and
et queor
des espaces peuvent être omis à côté d'entiers, maiselse
pas.else
commence pare
, et des choses comme1e6
sont des littéraux numériques valides.else
, par exemplex = 1 if y==2else 5
fonctionne.Joe , 8 octets
Remarque: Il s'agit d'une réponse non concurrente. La première version de Joe est sortie après cette question.
Qu'avons-nous ici?
F:
définit une fonction F qui est une chaîne de/+,
,M]
etR
. Lorsque vous appelezFn
, le premierRn
est évalué, renvoyant la plage de 0 à n, exclusif.M]
enveloppe chaque élément dans une liste. Ensuite, la liste est appliquée à/+,
.x +, y
retournex + [y]
./
est un pli droit. Ainsi,/+,a b c d...
revient[a, [b, [c, [d...]]]
.Exemples d'appels (le code est indenté par 3, sortie par 0):
la source
Ruby - Version récursive - 52
Version non récursive:
666257Exemple de sortie (identique pour les deux versions)
La version non récursive peut gérer des entrées arbitrairement grandes.
Les deux versions acceptent également gracieusement les nombres négatifs
la source
stack level too deep (SystemStackError)
)PHP 5.4 (67 octets):
Je sais je sais.
C'est loin d'être la réponse la plus courte.
Mais ça marche!
C'est ici:
Vous pouvez le tester ici: https://ideone.com/42L35E (ignorer l'erreur)
Javascript (57 octets):
C'est le même code exact sauf que Javascript est pointilleux sur le retour et j'ai réduit les noms de variables:
Voir? Même code!
ES6 (49 octets):
Fondamentalement, le même code exact, mais réduit pour ES6:
la source
f=lambda
...But it's pretty standard codegolf for functions that they have to be callable by name (aka, more than once and without typing the entire function again.)
-> jamais entendu parler de cela, et j'utilise ce site Web depuis un peu près d'un an. De plus, c'est un argument invalide puisque vous pouvez assigner les fonctions à une variable.Javascript (114 octets):
Tout le monde faisait du récursif, donc je voulais essayer une solution itérative. J'ai cependant trop de cas particuliers.
Je tiens une liste principale, puis je boucle et j'ajoute de nouvelles listes avec de nouveaux numéros.
la source
Lisp commun (95 octets):
la source
JavaScript,
3537 octetsSolution récursive
Essayez-le en ligne!
la source
05AB1E , 11 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Alternative de 11 octets:
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
05AB1E n'a pas de boucles qui descendent, donc pour boucler dans la plage,
(input, 0]
je dois:ݨR
; créez la plage[0, input]
, supprimez le dernier élément, inversez), puis bouclez dessus (vy
);[0, input)
place (F
) et prenez la différence absolue entre l'index de boucle et l'entrée-1 (NI<α
).la source