Ce défi a été inspiré par une question sur Mathematica.SE .
Supposons que vous ayez une liste / un tableau imbriqué de structure quelconque (les listes à chaque niveau n'ont pas nécessairement la même longueur). Pour simplifier, supposons que les nœuds sont des entiers non négatifs ou des tableaux vides. Par exemple
[[[1, 3], 2], [1, 4], 12, [[0, [], 0], [5, [7]]]]
Il est parfois plus pratique d’aplatir cette liste pour manipuler les nœuds, par exemple:
--> [1, 3, 2, 1, 4, 12, 0, 0, 5, 7]
--> [1, 1, 0, 1, 0, 0, 0, 0, 1, 1]
Mais à la fin, vous voulez réellement conserver la structure originale, donc vous voulez le transformer en
--> [[[1, 1], 0], [1, 0], 0, [[0, [], 0], [1, [1]]]
Votre tâche consiste à effectuer cette dernière étape.
À partir d’une liste imbriquée d’entiers non négatifs arbitraires, qui représente la structure souhaitée du résultat, et d’une liste à plat d’entiers non négatifs, qui représentent les valeurs souhaitées, remodelez la liste à plat sous la forme de la liste structurée. Vous pouvez supposer que les deux listes contiennent le même nombre d'entiers.
Comme d'habitude, vous n'avez pas à traiter d'entrées non valides (par exemple, la deuxième liste n'est pas plate, l'entrée est syntaxiquement mal formée, ne contient pas de nombres entiers comme nœuds, etc.). Vous pouvez modifier les tableaux d'entrée dans votre code.
Vous pouvez écrire une fonction ou un programme en prenant une entrée via STDIN, un argument de ligne de commande ou un argument de fonction, et vous pouvez renvoyer le résultat ou l’imprimer sur STDOUT. Vous pouvez utiliser n’importe quel format commode de liste ou de chaîne pour représenter les entrées et les sorties (tant que le format est sans ambiguïté et que l’entrée n’est pas prétraitée). De plus, le format des deux entrées doit être cohérent (vous ne pouvez donc pas prendre une entrée sous forme de chaîne et l'autre sous forme de liste, par exemple). Vous pouvez prendre les listes de saisie dans l’un ou l’autre des ordres, mais veuillez spécifier le mode de saisie exact dans votre réponse.
Encore une restriction: vous ne devez pas utiliser d'expressions régulières. C'est un défi de manipulation de tableau, pas un défi de manipulation de chaîne.
C'est le code de golf, donc la réponse la plus courte (en octets) gagne.
Cas de test
Structure Values Result
[[[1,3],2],[1,4],12,[[0,0],[5,[7]]]] [1,1,0,1,0,0,0,0,1,1] [[[1,1],0],[1,0],0,[[0,0],[1,[1]]]]
[[[0,0],0],[0,0],0,[[0,0],[0,[0]]]] [1,1,0,1,0,0,0,0,1,1] [[[1,1],0],[1,0],0,[[0,0],[1,[1]]]]
[] [] []
[[]] [] [[]]
[0,1,2,3] [5,1,0,5] [5,1,0,5]
[[[[[0]]]]] [123] [[[[[123]]]]]
[0,[1,[]],[[]],[2,3],[]] [1,6,1,8] [1,[6,[]],[[]],[1,8],[]]
la source
Réponses:
CJam,
18 1613 octetsPrend une entrée via STDIN dans le même format que la réponse CJam précédente:
et affiche la chaîne de résultat dans STDOUT
Je traite simplement la première ligne comme une chaîne, convertis tous les caractères numériques en sauts de ligne, scinde une ou plusieurs occurrences de sauts de ligne, place la seconde ligne sous forme de tableau sur pile, enroule un tableau et zippe les deux tableaux (lignes). L'impression est automatique et comme la première ligne a été traitée comme une chaîne, elle conserve ses crochets.
Expansion du code
Merci à @ user23013 pour la sauvegarde de 3 octets.
Essayez-le en ligne ici
la source
/La-
:%
.%
c'est aussi pour la division, et qu'elle se divise en plusieurs occurrences aussi!JavaScript, ES6, 44 octets
Cela crée une fonction
f
qui peut être appelée commec'est-à-dire le tableau imbriqué et le tableau de valeurs comme arguments d'entrée. La sortie de la fonction est le tableau imbriqué converti.
Cette question est une très bonne question pour la récursivité, c’est pourquoi la réponse est une fonction de récursion soignée et douce. Je crée une fonction
f
qui convertit le premier argument en utilisant lamap
méthode. Pour chaque élément, si l'élément est un tableau, il appelle àf
nouveau, sinon, pour les entiers, il obtient le i e point et revient que, incrémenter la valeuri
. La valeur dei
est transmise dans chaque appel récursif, afin de maintenir l'ordre correct.La détection Array vs. Integer est à nouveau effectuée à l'aide de la
map
méthode. Pour une variable de tableau,map
est une fonction valide, alors que pour les variables de nombre entier, il n’existe aucune propriété ou fonction appeléemap
définie pour la variable.Cela fonctionne dans un dernier navigateur Firefox (en raison de ES6).
la source
.map
dans le code. Y a-t-il un moyen de le raccourcir davantage? Quoi qu'il en soit, beau code!map
est liée au contexte, donc la première carte appartient à,a
tandis que la carte suivante appartient à chacunx
dans l'itération. Il n'y a pas d'autre moyen plus court de se référermap
, ni de différencier un tableau des entiersJavaScript, ES6, 41 octets
J'ai été très impressionné par la réponse d' Optimizer , elle était très bien faite et j'ai beaucoup appris. Cependant, en le regardant, j'ai trouvé un moyen de le raccourcir légèrement et de corriger un petit bug:
J'ai sorti la
i
variable et l' ai remplacée par unshift()
. Cela le rend légèrement plus court et corrige le problème avec le fait que ce paramètrei
est passé par valeur et non par référence, ce qui a entraîné la répétition de certains nombres du tableau final et la non utilisation de certains. Encore une fois, la réponse d'Optimizer était vraiment bien pensée, mieux que ce que j'aurais pu faire, je viens de la corriger un peu.la source
Dyalog APL, 14 caractères
Ceci est une évidence:
(∊a)←b
.Normalement, les
∊a
moyens sonta
aplatis, mais quand cela se produit à gauche d'une tâche, il fait exactement ce que ce problème demande. Pour se conformer à l'exigence d'être une fonction, il faut quelques gribouillis supplémentaires:{a←⍺⋄(∊a)←⍵⋄a}
(accolades pour lambda;⍺
et⍵
pour les arguments left et right;⋄
pour statement separator).Testez sur tryapl.org. Notez que dans APL, le vecteur numérique vide est noté
⍬
("zilde"). Les vecteurs à un élément sont construits avec(,A)
car(A)
signifierait un scalaire. Dans la sortie, cette chose:représente un vecteur numérique vide. Le
0
dans le centre montre "l’élément prototype" qui n’est pas un élément du tableau.la source
(,1)
et(1)
ou pourquoi le dernier bit vient-il simplement[1|1]
de[1|[1]]
?]box on
) ne fait pas de distinction entre eux. Dyalog (display
fromdfns.dws
) a une autre fonction qui fait la distinction, mais malheureusement tryapl limite le chargement d'espaces de travail supplémentaires (c'est-à-dire des bibliothèques). :(∊{0=⍴⍴⍵:⍕⍵ ⋄ '['(∇¨⍵)']'}a
. Ou ceci:∊{0=⍴⍴⍵:⍕⍵ ⋄ '['(1↓,'|',[1.5]∇¨⍵)']'}a
si vous insistez sur le séparateur,|
.]display a
tryapl. Il donne des informations complètes sur la structure. Désolé, je n'avais pas compris cela au début.Python, 51
Exemple:
la source
Python 2, 50
C'était un très beau problème. Tandis que je continuais à travailler dessus, je continuais à réaliser que des morceaux de mon code étaient inutiles et que la logique était réduite à une simple expression. La majeure partie du golf consistait à trouver le bon algorithme.
s
est la structure etv
est la liste plate de la liste. L'idée est de vérifier sis
est un entier avecs<[]
(Python 2 considère que les nombres sont plus petits que les listes). Si c'est le cas, prenez et retournez le premier élément dev
, en le supprimantv
. Sinon, revenez sur les sous-listes des
.Le
pop
est un morceau de magie impératif dans le code de style très fonctionnel. Parce que tousv
pointent vers la même instance, le fait de supprimer un élément d'un élément le supprime dev
l'ensemble de l'arborescence d'exécution. Ainsi, chaque nombrev
n'est utilisé qu'une seule fois. La compréhension de la liste[f(x,v)for x in s]
crée un arbre d’appel qui est développé en profondeur d’abord et de gauche à droite, ce qui provoque lav
dans le bon ordre.J'ai écrit ceci indépendamment de la réponse de grc , mais il s'est avéré être le même jusqu'à déplacer un seul
[
(et des noms de variables). Le mouvement enregistre un caractère en raison de l'espacement. Le déplacement du crochet signifie que le cas du nœud est traité immédiatement dans la fonction, plutôt que dans le cadre de la compréhension de la liste, ce que je n’avais pas envisagé.Nous pouvons enregistrer un caractère pour 49 si nous étendons les exigences d'entrée pour prendre la valeur de STDIN et la structure en tant qu'argument de fonction. Cela nous permet d'utiliser
map
.la source
Ruby, 39 ans
Rechute jusqu'à ce que l'élément dans la liste soit un entier.
Étant donné que l'appel de Integer.map donne une exception,
il va à la partie de secours, qui "saute / décale" le premier élément de la deuxième liste.
Regex soln ... un peu plus longtemps:
Essayez-le avec quelques cas de test
la source
CJam,
43 37 3533 octetsCelui-ci est une conversion directe de ma réponse JS . Un peu long, dont la plupart est absorbée par la détection de type.
Prend les deux tableaux d’entrée sur deux lignes de STDIN comme
et les sorties à STDOUT comme
Essayez-le en ligne ici
la source
Haskell,
113104 octets (86 + 18 à partir de la déclaration de type de données)Haskell n'a pas de type de données de tableau imbriqué intégré, j'ai donc dû rouler le mien. Pour cette raison, le programme contient uniquement une correspondance de modèle et une récursion structurelle explicite. Le dernier cas de test lit
et évalue à
la source
Mathematica, 41 octets
Il s'agit d'une fonction non nommée qui prend la structure comme premier argument et la liste de valeurs comme second argument (et renvoie une liste).
Ceci est une version ludique de la réponse acceptée à la question qui a inspiré ce défi. Je poste ceci moi-même, et n'accepterai pas cette réponse (si elle reste la plus courte, j'en doute). C’est pour empêcher tout le monde de remporter le défi en copiant la réponse.
Comment ça marche:
Listable
fonction pure. Les fonctions listables sont automatiquement appliquées aux éléments d'un argument de liste (de manière récursive) au lieu de la liste elle-même; l'appelf
à la liste structurée renverra donc une liste de la même structure avec chaque entieri
remplacéf[i]
.m
et un compteur dansi
.f
(quel que soit l'argument), nous retournons l'élément suivant dem
.la source
Rebol -
87 6660Ungolfed:
Exemple:
la source
C #,
225 + 13 = 239185 + 35 = 220172 + 35 = 207 octetsRequiert ceci:
Accepte
object[]
s comme arguments.Code non golfé:
la source
using o=System.Object
et en remplaçant toutes les instances deobject
simplemento
. msdn.microsoft.com/en-us/library/sf0df423.aspxClone
est peu profonde. Si la modification des entrées est autorisée, vous n'avez pas besoin de cloner du tout. Si ce n'est pas autorisé, vous avez besoin d'un clonage approprié.Python 2, 64 octets
Je vous ai entendu comme des listes dans des listes, alors je mets des fonctions dans des fonctions.
Edit: En regardant la réponse de grc maintenant, je me rends compte que c'était complètement inutile. Tant pis...
la source
SWI-Prolog 82
Échantillon échantillon:
Le dernier
[]
élément de la requête permet de vérifier le nombre d'éléments non concordants, ce qui ne semble pas être nécessaire dans cette question.la source
is_list
) nécessaires?Erlang,
11693 octetsUtilise deux fonctions impures
f
etg
.f
manipule le dictionnaire de processus en définissantn
la liste à plat et en mappant chaque élément de la liste imbriquéeg(X)
.g
puis définitn
à la fin de la liste à plat chaque fois qu'il rencontre une valeur non listée et renvoie la tête de la liste à plat.la source
Perl 5, 49 octets
Le premier argument est la structure du modèle, le second les valeurs.
Programme de test
la source
Powershell: 115
le tableau d'entrée est $ i, le mappage est $ m, la sortie est $ o
$ h est une chaîne contenant la fonction récursive, et vous pouvez exécuter le code contenu dans une chaîne avec. $ h ... Et ce serait plus court de 30 octets si powershell n'insistait pas pour aplatir les tableaux à valeur unique en scalaires, et un tableau avec une seule valeur null à null
et un visualiseur de structure de tableau pratique pour vérifier les résultats
modifier: 149
enregistrer sous unflatten.ps1:
edit: 136, création de tableau en ligne et écriture en sortie
appel avec. \ unflatten.ps1 [tableau d'entrée] [tableau de mappage]
la sortie est écrite dans le pipeline - alors lancez ceci en premier:
et courir avec
la source
C #, (40 + 123) = 163 octets OU (67 + 81) = 148 octets
C # souffre de son typage statique et de ses longs espaces de noms.
Méthode de tableau
Utiliser des déclarations:
Code:
Méthode Stack (utilise la structure Stack au lieu de tableaux)
Utiliser des déclarations:
Code:
Premiers essais, premier code golf ici.
la source