Remarque: il s’agit du numéro 2 d’une série de défis liés à la manipulation de tableaux . Pour le défi précédent, cliquez ici .
Séparation des listes imbriquées
Pour séparer les valeurs d'une liste imbriquée, aplatissez-la, puis affichez chaque valeur de manière à ce qu'elle se trouve à la même profondeur imbriquée qu'auparavant.
C'est-à-dire cette liste:
[1, [2, 3], [4, 4, [5, 2], 1]]
Deviendrait:
[1, [2], [3], [4], [4], [[5]], [[2]], [1]]
Le défi
Votre tâche consiste à écrire un programme qui prend toute liste imbriquée d’entiers positifs (dans les limites de votre langue) et effectue cette opération de séparation.
Vous pouvez soumettre une fonction prenant la liste en argument, ou un programme complet effectuant des E / S.
Comme il s'agit de code-golf , la soumission la plus courte (en octets) gagne! *
* Les trous de golf standard sont interdits. Vous connaissez le refrain.
Cas de test
Les listes d’entrée ne contiendront jamais que des entiers de la taille d’entier standard de votre langue. Pour éviter les contraintes linguistiques empêchant leur concurrence, les valeurs ne seront pas imbriquées à des profondeurs supérieures à 10.
Vous pouvez supposer que l'entrée n'aura pas de sous-listes vides: par exemple - [[5, []]]
ne sera pas donnée. Cependant, la liste principale pourrait être vide.
[] -> []
[[1, 2]] -> [[1], [2]]
[3, [4, 5]] -> [3, [4], [5]]
[3, [3, [3]]] -> [3, [3], [[3]]]
[[6, [[7]]]] -> [[6], [[[7]]]]
[[5, 10], 11] -> [[5], [10], 11]
N'hésitez pas à laisser un commentaire si j'ai raté une affaire de coin.
Exemple
J'ai jeté ensemble une solution Python 3 rapide (ungolfed) comme un exemple - vous pouvez le tester sur repl.it .
la source
Réponses:
Brachylog , 16 octets
Essayez-le en ligne!
Explication
la source
Z
argument sur TIO? Sans cela, cela semble sortir avec true / false, ce qui donne l'impression queZ
c'est nécessaire dans le nombre d'octets.Z
indique à Brachylog que l'argument de sortie est une variable. C'est cette variable qui est unifiée avec la sortie résultante. Lorsque vous le supprimez, il indique à Brachylog que la sortie est une variable anonyme et indique à la place si le prédicat principal réussit ou échoue. C'est la même chose que dans Prolog où le résultat est "mis" dans une variable.Mathematica,
2421 octetsou l'un de ceux-ci:
Explication
La raison pour laquelle il est si court est qu’il s’agit d’une récursion ne nécessitant pas de scénario de base explicite.
Il y a beaucoup de sucre syntaxique ici, commençons donc par dé-golfer.
&
indique une fonction non nommée à gauche de celle-ci, dont l'argument est écrit ainsi#
. À l'intérieur de cette fonction, il est#0
fait référence à la fonction elle-même, qui permet d'écrire des fonctions récursives sans nom. Mais commençons par donner un nom à la fonction interne et le retirer:L'autre sucre syntaxique important
f/@x
est l'abréviation deMap[f, x]
c.- à- d. Qu'il fait appelf
à chaque élément dex
. La raisonf[x_] := ... f /@ x
qui ne mène pas à une récursion infinie est que le fait de mapper quelque chose sur un atome laisse cet atome inchangé sans appeler réellement la fonction. Par conséquent, il n'est pas nécessaire de vérifier explicitement le cas de base (l'élément en cours est un entier).Donc, la fonction
f
revient d'abord à la liste la plus profonde à l'intérieurx
, à quel pointf/@
devient un no-op. Ensuite, nous appelons utilisation##& @@ List /@
à ce sujet. La cartographieList
sur la liste chaque élément consiste simplement à insérer dans une liste séparée, donc{1, 2, 3}
devient{{1}, {2}, {3}}
. Ensuite, nous y appliquons la règle##&
, c'est-à-dire que la tête (c'est-à-dire la liste externe) est remplacée par##&
, ainsi cela devient##&[{1}, {2}, {3}]
. Mais##&
renvoie simplement ses arguments en tant queSequence
(ce que vous pouvez considérer comme une liste non enveloppée ou une sorte d’opérateur "splat" dans d’autres langues).Ainsi se
##& @@ List /@
transforme une liste{1, 2, 3}
en{1}, {2}, {3}
(en quelque sorte, cette dernière chose est réellement enveloppée dans la têteSequence
, mais elle disparaît dès que nous utilisons la valeur n'importe où).Cela laisse la question de savoir pourquoi
f
elle-même n'est pas déjà la solution au problème. Le problème est que la liste la plus externe doit être traitée différemment. Si nous avons des suggestions,{{1, 2}, {3, 4}}
nous voulons{{1}, {2}, {3}, {4}}
et non{{1}}, {{2}}, {{3}}, {{4}}
. Ma solution initiale corrigeait cela en transmettant le résultat final sous forme de liste d'arguments permettant deJoin
restaurer le niveau externe de listes, mais celui-ci ignorait simplement le niveau externe en s'utilisantf
lui-même dans une carte sur la sortie. Par conséquent,f
s’applique uniquement aux éléments individuels de la liste la plus externe et n’arrive jamais à toucher cette liste.Quant aux trois autres solutions, la première applique simplement la récursion en dehors de
f
laquelle fonctionne tout aussi bien. Les deux autres solutions évitent uneMap
opération répétée en composant d’abord deux fonctions, puis en mappant le résultat une seule fois.la source
J ,
1918 octetsIl s'agit d'un verbe anonyme qui prend et renvoie des tableaux encadrés, qui sont la version de J (plutôt lourde) des tableaux imbriqués. Le voir passer tous les cas de test.
Explication
Ceci utilise les opérations quelque peu exotiques
{::
( map ) etS:
( spread ), qui opèrent sur des tableaux en boîte.{::
remplace chaque feuille par le chemin encadré vers cette feuille.S:
applique un verbe donné à une profondeur d'imbrication donnée, puis divise les résultats en un tableau.la source
R, 199 octets
Cette question était difficile. Les listes de R sont un peu bizarres et il n'est absolument pas simple de parcourir tous les éléments des sous-listes. Il n'est également pas simple de déterminer ensuite la profondeur de cette liste. Ensuite, le défi consiste à recréer la liste avec tous les éléments séparés. Nous avons donc besoin d'un moyen de créer de manière adaptative une liste d'une certaine profondeur.
La solution consiste en deux grandes parties. Une fonction récursive qui parcourt toutes les listes et enregistre la profondeur:
Lorsque nous avons
unlist(l)
stocké les profondeurs de chaque entrée du vecteur ,d
nous créons implicitement une listelapply
et la remplissons avec la fonction suivante:Dans cet appel d'application, nous créons un objet
q
avec la valeur de l'entrée dans la liste, vérifions sa profondeur et voyons s'il est différent de zéro. S'il est égal à zéro, nous pouvons simplement le laisser sous forme de valeur numérique. S'il est différent de zéro, nous devons l'imbriquer dans ce nombre de listes. Nous appelons donc und
temps de boucle for et appelons à plusieurs reprisesq=list(q)
.lapply
puis met toutes ces valeurs deq
dans une liste, créant le résultat souhaité.Programme complet avec un espacement correct et tel que:
la source
is.list(y)
au lieu declass(y)=='list'
? ne peut pas vérifier que cela fonctionnera réellement.Retina , 34 octets
Essayez-le en ligne!
la source
(?<-2>)
marche?C (gcc), 147 octets
Exemple d'entrée:
Exemple de sortie:
la source
empilé , non compétitif, 25 octets
Cette fonction modifie le membre supérieur de la pile. Si vous voulez une fonction de bonne foi, il suffit d' ajouter
[
et]
au début et à la fin. Essayez-le ici!Voici une version lisible:
Cas de test:
Sortie sans nouvelles lignes:
la source
*
que l'argument comme un bloc de code?d-1
temps d' argument .$func
est une fonction qui peut être manipulée.PHP,
10194 octetssauvé 1 octet grâce à @Christoph, sauvé 6 autres inspirés par cela.
fonction récursive, assez simple
panne
la source
$r
éléments dans la boucle ou la fonction renvoie un tableau vide. Cela peut donner des avis, mais ceux-ci ne sont pas imprimés avec la configuration par défaut.!cos()
.cos()
renvoienull
pour chaque tableau et un float! = 0 pour chaque entier positif. Je veux dire ... qui se soucie des avertissements?is_int
: Inverser la condition ne sauve rien; J'ai besoin d'un espace entreelse
etforeach
. MAIS:$b[0]
pour un entier estNULL
.Python 2,
122106 octetsAssez terrible score, juste une mise en œuvre simple.
Merci à @Zachary T pour avoir aidé à économiser 16 octets!
Appel
x
avec un argument à exécuter. Pour une raison quelconque, il ne peut être exécuté qu'une seule fois.la source
a+=[n(l,d)]
ena+=n(l,d),
(notez la virgule)t
?n
à la fonction et supprimer le premier argument, car il le sera toujoursl
.JavaScript (Firefox 30-57), 53 octets
La meilleure réponse ES6 que j'ai à ce jour est de 76 octets:
la source
f=
.Pyth - 29 octets
Suite de test .
la source
Perl 6 ,
6047 octets( Essayez-le en ligne. )
Explication:
[... for |$^a]
: Parcourez le tableau en entrée et construisez un nouveau tableau à partir de celui-ci.$_ ~~ List ?? ... !! ...
: Pour chaque élément, vérifiez s'il s'agit d'un tableau.|([$_] for .&f)
: Si l'élément est un tableau, appliquez-lui la fonction de manière récursive, parcourez les éléments du nouveau tableau renvoyé par cet appel récursif, placez chaque élément dans un tableau distinct et glissez-le dans la liste externe.$_
: Si l'élément n'est pas un tableau, transmettez-le tel quel.la source
Haskell, 71 octets
Encore une fois, je dois définir mon propre type de liste, car les listes natives de Haskell ne peuvent pas être imbriquées de manière arbitraire. Ce nouveau type
L
peut être retourné à partir d'une fonction mais ne pas être imprimé par défaut, donc pour voir un résultat, je définis uneshow
instance pourL
:Nous pouvons maintenant faire quelques tests dans le REPL:
Comment ça marche: une récursivité simple qui passe le niveau d'imbrication en fonction des
C
constructeurs. Nous commençons avec la fonction d'identitéid
et chaque fois qu'il y a une liste (-> correspondance de modèled#C l=
), nous ajoutons une couche supplémentaire deC
(->C .pure.d
) à l'appel récursif de#
tous les éléments de la liste. Si nous rencontrons un nombre, nous appliquons simplement la fonctiond
de niveau d'imbrication au nombre.la source
APL (Dyalog) , 44 octets *
Fonction de préfixe tacite anonyme. Prend la liste APL imbriquée en argument et renvoie un tableau APL imbriqué.
Essayez-le en ligne!
{
…}
Applique la fonction explicite suivante où l'argument est représenté par⍵
:⎕JSON⍵
convertir l'argument en JSONj←
stocker dansj
'[]'∘.=
tableau où lesj
équivalents ouvrent (rangée supérieure) et se ferment (rangée inférieure)-⌿
rangée supérieure moins rangée inférieure (réduction de la différence verticale)+\
somme cumulative (cela donne le niveau d'imbrication pour chaque caractère)(
…)⊆
Partition, en commençant une nouvelle partition chaque fois qu'un 1 n'est pas précédé d'un 1 dans…j∊⎕D
où chaque personnage dej
est membre de l'ensemble de D igits⊃¨
choisissez le premier de chaque (cela donne le niveau d'imbrication par nombre à plusieurs chiffres)∊{
...}¨
applique la fonction suivante pour chaque niveau d' imbrication (⍵
), en utilisant l'élément correspondant de l' ε argumentation nlisted (aplatie) comme argument de gauche (⍺
):,⍺
défiler (lister) le nombre (parce que les scalaires ne peuvent pas être inclus)⊂⍣⍵
clôturer les⍵
temps⊃
divulguer (car la liste la plus interne est elle-même une pièce jointe)* Utilisation de Dyalog Classic avec
⎕ML←3
(par défaut sur de nombreux systèmes), en remplacement⊂
de⊆
et↑
pour⊃
. Tio!la source