Dans ce défi, votre tâche consiste à créer un programme qui intègre un tableau imbriqué et retourne un tableau aplati à une dimension. Par exemple [10,20,[30,[40]],50]
devrait sortir [10,20,30,40,50]
.
Contribution
L'entrée sera un tableau imbriqué (par exemple [10,20,[[[10]]]]
). Il ne contiendra que des entiers (à la fois négatifs et positifs), des chaînes et des tableaux. Vous pouvez prendre l’entrée comme argument de fonction, STDIN ou celle qui convient à votre langue. Vous pouvez supposer que le tableau d'entrée n'aura pas de tableau vide.
Sortie
La sortie sera un tableau unidimensionnel à plat comportant les mêmes éléments du même type que dans le tableau imbriqué et dans l'ordre SAME.
Cas de test
[10,20,30] -> [10,20,30]
[[10]] -> [10]
[["Hi"],[[10]]] -> ["Hi",10]
[[[20],["Hi"],"Hi",20]] -> [20,"Hi","Hi",20]
[[["[]"],"[]"]] -> ["[]","[]"]
N'hésitez pas à demander des éclaircissements en utilisant les commentaires. C'est du code-golf , donc le code le plus court en octets gagne!
Remarque: Si votre langue contient une fonction intégrée pour cela, vous ne devez PAS l'utiliser.
modifier
Veuillez également inclure un lien vers un site Web sur lequel votre code peut être exécuté.
unflatten
question, mais pas deflatten
question sur PPCG.["[",[["[",],'[',"['['"]]
, un scénario de test.'
et"
comme délimiteurs. (Mais je suis d' accord qu'un cas de test impliquant[
,]
,"
et\
dans une chaîne serait utile.)Réponses:
K, 3 octets
C'est un idiome assez commun. "Joindre sur converger".
essayez-le ici avec oK .
Comment ça marche:
Join (
,
) fusionne des atomes ou des listes pour produire une liste. Over (/
) prend un verbe (dans ce cas join) et l'applique entre chaque élément d'une liste, de gauche à droite. Ainsi, le composé,/
aplatira tous les éléments de niveau supérieur de la liste. Le symbole a en/
réalité différentes significations selon la valence (nombre d'arguments) du verbe avec lequel il est composé. Lorsque nous fournissons,/
un verbe, la dernière/
agit comme un "convergent" - elle s'applique de manière répétée,/
à l'entrée jusqu'à ce qu'elle cesse de changer. Certaines autres langues appellent une fonctionnalité comme celle-ci un "combinateur à point fixe". En fusionnant de manière répétée les listes de niveau inférieur, vous obtiendrez éventuellement une liste simple et aucune des opérations ne perturbera l'ordre des éléments. Cela semble résoudre le problème.la source
JavaScript (ES6), 35 octets
Inspiré par la réponse de @ user81655 :
la source
Mathematica,
16 à14 octetsUne fonction non nommée qui prend et retourne une liste, par exemple:
Explication
Fête du sucre syntaxique!
Pour comprendre comment cela fonctionne, notez que chaque expression dans Mathematica est soit un atome (par exemple , des nombres, des chaînes, des symboles) ou une expression composé de la forme
f[a, b, c, ...]
, oùf
,a
,b
,c
sont eux - mêmes expressions arbitraires. Ici,f
on appelle la tête de l'expression. Tout le reste est juste du sucre syntaxique. Par exemple,{a, b, c}
c'est justeList[a, b, c]
.Nous commençons avec
//@
quelles cartes a fonctionne sur tous les niveaux d'une liste. Par exemple:Notez que cela mappe
f
les atomes ainsi que les expressions composées. Ce que nous recherchons maintenant, c'est un moyen de supprimer les en-têtes de liste et de tout conserver.La
Apply
fonction est normalement utilisée pour alimenter les éléments d'une liste sous forme d'arguments distincts, mais sa définition est plus générale et remplace simplement la tête d'une expression. Par exempleApply[g, f[a, b]]
donneg[a, b]
.Maintenant, il y a une "tête" spéciale appelée
Sequence
qui disparaît tout simplement. Par exemple,{a, Sequence[b, c], d}
évalue à{a, b, c, d}
. L'idée de mettre à plat la liste est de remplacer les têtes de toutes les listes intérieures par desSequence
noms afin qu'elles soient superposées. Donc, ce que nous voulons, c'est enApply
têteSequence
des listes. De manière pratique, si nousApply
lions quelque chose à un atome, l’atome reste inchangé, nous n’avons donc pas à distinguer entre les types d’expressions.Enfin, il y a un petit problème:
f
est également appliqué au niveau le plus externe, de sorte qu'il supprime également le niveau le plus externeList
, ce que nous ne voulons pas. Le moyen le plus rapide de contrer ce problème consiste simplement à envelopper le résultat dans une nouvelle liste, de sorte que les environsSequence
puissent disparaître en toute sécurité.Notez qu'il n'y a ni
Apply
niSequence
dans le code.@@
est une forme d'opérateur deApply
et##&
est une astuce de golf standard pour raccourcir le long nom intégréSequence
. Donc, ungolfant tout un peu, nous obtenons quelque chose comme:Pour plus de détails sur les méthodes et les raisons
##&
, consultez la section "Séquence d'arguments" de ma réponse pour connaître les astuces de Mathematica .la source
//@
. Très utile à connaître!//@
capture un motif soigné. Cela me rappelle un peu des combinateurs récursifs de Joy. Avez-vous un lien vers une bonne référence à des fonctions connexes dans Mathematica? Je suis très intéressé par les moyens de factoriser la récursion explicite hors des programmes.Map
,MapAt
,Apply
, ainsi queReplace
et les fonctions connexes. En général, cependant, de nombreuses fonctions prennent un paramètre optionnel levelspec (voir ma solution originale de 16 octets), ce qui vous permet d’appliquer la fonction à plusieurs niveaux / à la fois.Python 2, 43 octets
Sur une liste, rechute sur les éléments et concatène les résultats. Sur une chaîne ou un nombre, encapsule dans une liste de singleton.
Malheureusement, Python 2 commande pour les types
int < list < string
sandwichslist
entre les autres, ce qui nécessite deux inégalités à vérifier. Donc, au lieu de cela,l*0
est vérifié par rapport à la liste vide[]
, sinon donner0
ou""
.la source
Ruby,
434234 octetsSolution récursive Maintenant, avec une gestion d'exception! (On peut aussi remercier @akostadinov pour avoir inspiré le changement)
Lien IDEOne
la source
rescue
comme çatry
bloc, vous utilisez doncbegin
plutôt pour différencier les parties que vous voulez capturer et celles que vous n'aimez pas. Donc, puisque vous attrapez le reste du bloc avant, vous n'en avez techniquement pas besoin? Le reste est juste coupé les espaces, puisque Ruby interprète la ligne comme...inject(:+) rescue [a]
a = raise("haha") rescue 1
, assigner1
àa
. C'est 'rescue
, comme un inlineif
etwhile
.JavaScript (ES6), 41 octets
la source
Perl 6 , 24 octets
Explication:
Tester:
la source
Haskell, 43 octets
Haskell n'a ni listes imbriquées avec des profondeurs différentes des sous-listes ni types mixtes pour les éléments de liste. Pour imbriquer je définis un type de données personnalisé
D
qui est soit une feuilleL
qui contient un élément, soit un nœudN
qui est une liste deD
s. Pour les éléments mixtes, j'utilise le type de données prédéfiniEither
qui combine deux types en un, iciEither String Integer
. Le nouveau typeD
et la fonction aplatirf
sont totalement polymorphes dans le type des éléments leaf, je ne dois donc pas faire très attention à rienEither
.Exemple d'utilisation:
f (N[N[L(Right 20)], N[L(Left "Hi")], L(Left "Hi") , L(Right 20)])
->[Right 20,Left "Hi",Left "Hi",Right 20]
.la source
Pyth,
765 octetsEssayez-le en ligne: démonstration ou suite de tests
Mais bien sûr, il existe également une fonction intégrée, qui gère la tâche en seulement 2 octets:
.n
( Suite de tests )la source
G
implicitement, si je ne l'écris pas.JavaScript (Firefox 30-57), 43 octets
Juste parce que je pouvais même éviter d'utiliser
concat
.la source
[for(of)]
n'est disponible que dans Firefox 30+. Il a été proposé pour ES7 mais abandonné par la suite.for(__ in __)
Perl,
3429 octetsLes fonctions.
Si besoin est d'aplatir
my @a = f(@a)
, 29 octets:Testez-le sur Ideone
Si besoin d'être mis à plat pour un tableau comme
my $a = f($a)
34 octets:Testez-le sur Ideone .
Perl 5.22.0+, 27 octets
Merci à Hobbs .
Si besoin d'aplatir pour lister comme
my @a = f(@a)
, 27 octets:Testez-le sur JDoodle
Si besoin est d'aplatir pour avoir un tableau de type
my $a = f($a)
32 octets:Testez-le sur JDoodle .
la source
?@{f@$_}:
devrait fonctionner au lieu de?@{f(@$_)}:
, en économisant deux octets.f
c'est une fonction carf
pas encore déclaré.sub f{}sub f{... f@$_ ...}
travail.ref
n'a pas besoin du parens pour fonctionner, économisant 2 octets. 2. Autant que je sache,sub f{map{ref?f(@$_):$_}@_}
respecte les règles et enregistre un autre 5.f
prend un tableau (nonref) en tant que liste, afin qu'il puisse renvoyer la même chose.ref
le compilateur suppose que l' opération de?
démarrage?PATTERN?
ressemble àref(?PATTERN?)
. Donc, le compilateur cherche en second?
et jette une erreur.?PATTERN?
a été supprimé dans 5.22.0 (m?PATTERN?
fonctionne toujours) et je teste sur une version récente. Vous pouvez donc obtenir ces deux octets en spécifiant 5.22+.Julia, 29 octets
Il s'agit d'une éclaboussure récursive dans une fonction de concaténation jusqu'à atteindre un point fixe. Exemple
la source
Rétine , 30 octets
Essayez-le en ligne! (La première ligne est uniquement utilisée pour exécuter plusieurs tests en même temps.)
Retina n'a aucun concept de tableaux, de littéraux de chaîne ou de nombres, j'ai donc décidé de choisir un format d'entrée «commun»
[...,...]
,"
composé de tableaux de styles et de chaînes délimitées, qui\
peut être utilisé à l'intérieur des chaînes pour échapper à tout caractère (en particulier"
et\
lui - même).Le programme lui-même correspond simplement à une chaîne complète ou à un crochet, et les remplace par
$1
ce qui garde les chaînes et supprime les crochets. La limite1>
saute le premier match pour ne pas enlever le premier[
. Cependant, cela supprime la fin]
, nous la rajoutons dans une étape séparée.la source
Pyke, 11 octets
Essayez-le ici!
Explication:
Ou 7 octets après un correctif
Essayez-le ici!
Explication:
Ou même 2 octets si l’impression sur la sortie standard est autorisée (cela peut entrer dans les fonctions intégrées)
Essayez-le ici!
Cela applique profondément la
print_newline
fonction à chaque élément non séquentiel de l'entrée et se répète pour les éléments séquentiels.la source
Java (v8)
390276 octetsJuste pour être complet et tout ça. :) Je ne peux pas dire que le code est efficace en Java.
la source
oaf
eno
, et changerflatten
enf
.final
s, tout peut être un lambda, vous n'avez pas besoinpublic static
...false
par1>2
, et 2 octets supplémentaires que vous pourriez obtenir si vous déclarez n sans définir (le compilateur le définit automatiquement comme 0)Python, 57 octets
Essayez-le en ligne: Python 2 , Python 3
Merci à Kevin Lau pour le
list==type(x)
tour.la source
type(x)==list
est plus court queisinstance(x,list)
.[`x`>'['and...
? (Cela ne fonctionne qu'en Python 2.)Rubis
il y a
flatten
méthode intégrée .Vous pouvez exécuter ici: http://www.tutorialspoint.com/execute_ruby_online.php
Un 43 octets, mais pensé pour partager:
Un 45 octets plus efficace que le précédent et l'autre ruby répondent:
voici le repère:
résultat:
la source
Note: If your language contains a built-in for this, then you must NOT use it
.rescue
rescue
d'ailleurs, commetry/catch
dans javaPerl,
3934 + 1 (-p
drapeau) 35 octetsBon mot. Inspiré par Martin Büttner .
Testez-le sur Ideone .
la source
Clojure, 68 octets
mapcat
applique d’abord une fonction à chaque élément puis concatole les résultats. Ainsi, chaque fois qu’il indique un niveau de nidification, il est perdu. La concatte ne fonctionne pas sur les séquences, donc les éléments doivent être intégrés au vecteur s'ils ne sont pas vectoriels.Vous pouvez l'essayer ici: http://www.tryclj.com
la source
ANSI C, 193 octets
:-/, Aucune suggestion? Au fait, j'ai essayé de trouver une source en ligne pour compiler cela, mais le WL est strict pour que ce code soit compilé. Sinon, cela fonctionnera pour VS et gcc.
la source
JavaScript 20 octets
Le tableau + tableau est égal à tableau.toString
la source
a
est en fait un argument de la fonction. Je vais essayer d'éditer la fonction maintenant.a=>
au début de votre code.C #, 48 octets
Je pensais le poster aussi puisque personne n’a encore donné de solution C #. Suggestions bienvenues!
la source
i
initialisé? et êtes-vous sûr que cela fonctionne sur l'[["[]"],"[]"]
exemple?i=>$"{i.Replace("[","").Replace("]","")}"
?Raquette, 63 octets
la source
Java 8 165 caractères
Ungolfed dans une classe:
Cette réponse est basée sur l'approche de Jeremy Harton . Je l'ai utilisé a changé à certains endroits et créé une version plus semblable au golf.
la source
JavaScript, 17 octets
Enfin, les conversions de types JavaScript peuvent être utilisées à bon escient! Veuillez noter que ceci produira en réalité un tableau, mais la conversion de chaîne (le placer dans HTML) le transformera en une liste séparée par des virgules.
Si les listes séparées par des virgules sont acceptables, les éléments suivants sont valides:
7 octets
REMARQUE: l'extrait est cassé pour une raison quelconque
la source
["["]
... J'ai essayé d'exécuter(a=>eval(
[$ {a}]))(["["])
et j'ai obtenu unSyntaxError
oninput
événement qu’en unbutton
clic.PHP, 73 octets
la source
Attaché , 14 octets
Essayez-le en ligne!
Heureusement, Attache a un opérateur de "vectorisation", qui applique une fonction aux atomes d'une liste. Dans ce cas, il suffit de configurer une faucheuse avec
Reap
etSow
tous les atomes de l’entrée_
avec@>
. Je pense que c'est assez élégant.Des alternatives
15 octets:
Fixpoint{`'^^_}
16 octets:
Fixpoint!&Concat
17 octets:
{q:=[]q&Push@>_q}
17 octets:
Fixpoint[&Concat]
la source
Elixir , 74 octets
Première réponse de Elixir, peut donc probablement être joué un peu au golf.
Essayez-le en ligne.
Explication:
Bien sûr, si les modifications étaient autorisées, cela aurait pu être 25 octets à la place:
Essayez-le en ligne.
la source
Gelée , 4 octets
Essayez-le en ligne!
Explication
Intégré
F
serait un octet si autorisé.la source
Wolfram Language (Mathematica) , 13 octets
Essayez-le en ligne!
Non-golfé:
F[x_] := Level[x, {-1}]
sélectionne les éléments de la structure au dernier niveau de son arborescence . Je ne suis pas sûr que cela compte comme "en évitant le construit" (ce qui serait
Flatten
).la source