Vous recevrez un tableau imbriqué. Votre programme doit visualiser le tableau.
Mais comment?
Par exemple, supposons que nous avons un tableau imbriqué, comme [["1","2"],[["1","2"],"3"],"4",[[[["5"]]]],"6"]
.
Ce tableau imbriqué peut être visualisé comme:
->1
->2
-->1
-->2
->3
>4
---->5
>6
Exemples
Input 1:
["Atom",["Proton",["Up Quark", "Up Quark", "Down Quark"], "Neutron", ["Up Quark", "Down Quark", "Down Quark"], "Electron"]]
Output 1:
>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Down Quark
-->Down Quark
->Electron
Input 2:
[["1","2"],["3","4"]]
Output 2:
->1
->2
->3
->4
Règles
- Vous pouvez utiliser une chaîne (ou d'autres types qui fonctionnent comme un tableau imbriqué) en entrée.
- Le niveau maximum de "couches" est de 2 ^ 32-1.
code-golf
printable-ascii
Matthew Roh
la source
la source
Réponses:
APL, 32 octets
Tester:
Explication:
{
...}∘0
: exécutez la fonction suivante avec0
lié à⍵
:1=≡⍺:
: si l'entrée a la profondeur 1 (ie un tableau qui ne contient pas d'autres tableaux):⍵/'->'
: créer une chaîne contenant⍵
-
s et⍵
>
s,1↓
: déposez le premier élément,⍵↑
: et prenez les premiers⍵
éléments. Il en résulte une chaîne contenant des⍵-1
tirets et un>
.⍺,⍨
: ajoutez-y l'entrée,⎕←
: et sortie à l'écran⋄
: autrement,⍺∇¨⍵+1
: ajoutez 1 à⍵
et appliquez la fonction à chaque tableau imbriquéla source
('Atom' ('Proton' ('Up Quark' 'Up Quark' 'Down Quark') 'Neutron' ('Up Quark' 'Down Quark' 'Down Quark') 'Electron'))
.Mathematica,
585756 octetsMerci à Greg Martin d'avoir économisé 1 octet.
Merci à ngenisis d'avoir sauvé 1 octet.
la source
Java 7,
153141114 114 octets-39 octets grâce à @ Barteks2x
Explication:
Code de test:
Essayez-le ici.
Production:
la source
for(int j=i;j-->0;r+="-");
pour faire aussi ce que fait la ligne suivante, et en utilisant un argument générique au lieu de Object []:String r="";<T>String c(int i,T[] o){for(T x:o)if(x instanceof Object[])c(i+1,(T[])x);else for(int j=i;j-->=0;r+=j<0?">"+x+"\n":"-");return r;}
et même 1 caractère de moins si vous passez 1 au lieu de 0 comme premier l'argument est ok.[]
du paramètre pour enregistrer 1 octet supplémentaire donne une erreur. Voir l'erreur ici sur > Debug après exécution.String r="";<T>String c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return r;}
cela marche. Vous pouvez également effectuer une astuce générique similaire avec une chaîne pour enregistrer un octet supplémentaire, mais nécessite soit de stocker le résultat dans une variable avant de l'imprimer, soit une conversion explicite (appel de méthode ambigu):String r="";<T,S>S c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return(S)r;}
String r="";<T,S>S c(S p,T a){for(T x:(T[])a)if(x instanceof Object[])c("-"+p,x);else r+=p+">"+x+"\n";return(S)r;}
Et l'exigence de transtypage de chaîne sur le type de retour lors de l'appel c'est parti.PHP,
77 7473 octets4 octets enregistrés grâce à @manatwork.
fonction récursive, nécessite PHP 7.1 ou plus récent pour l'index de chaîne négatif.
"$e"
estArray
pour les tableaux; c'est"$e"!=$e
la même chose queis_array($e)
.>
-
au préfixe pour chaque niveaula source
function f($a,$p=""){foreach($a as$e)echo$p,is_array($e)?f($e,"-"):">$e\n";}
is_array($e)
pouvoir être remplacé par$e[-1]!==""
.$e[-]==""
... et avec la condition inversée$e[-1]>""
. Belle trouvaille!$e[-1]>""
pouvoir être remplacé par"$e"==$e
. Au moins dans l'ancien PHP 5.6 que j'utilise.C99 (CCG),
201187140112109forme développée:
Cela prend une chaîne au format correct et se termine lors de la recherche de la dernière correspondance
]
.Il n'utilise pas de récursivité et utilise des types longs pour réellement atteindre la deuxième règle: 2 ^ 32-1 niveaux . La plupart des langages de script ont une profondeur de récursivité limitée ou se bloquent simplement lors d'un débordement de pile.
Je n'ai pas l'habitude de jouer au golf en C, toute aide est appréciée :)
Merci à bolov pour ses conseils! Merci particulièrement à Titus qui est toujours partant pour une bonne partie de golf (même en do)!
Encore deux octets économisés par le fait que nous pouvons terminer une fois que nous correspondons au dernier
]
et n'avons pas besoin de faire correspondre un caractère nul.Il peut être testé sur Wandbox .
la source
for(int d=1 ...
?long
a 4 caractères alors qu'ilint
n'en a que 3, et il n'y a aucune raison que vous deviez le faire dépasser le2^32 - 1
pour que votre soumission soit valide, vous économisant ainsi un seul octet.2^31-1
.The maximum level of "layers" is 2^32-1.
.2^31-1
est beaucoup moins que2^32-1
.2^32-1
ne correspond pas à unint
moment, il correspond à ununsigned
oulong
(c'est sur la plupart des systèmes / compilateurs bien sûr). Par conséquentint
, ne ferait pas une bonne réponse (comme la plupart des réponses ici ne le sont pas).JavaScript (ES6),
5851 octetsEdit: enregistré 7 octets lorsque @Arnauld a souligné que je pouvais combiner mes deux approches.
la source
PHP,
129 123 112 112 109 95 9391 octetssolution itérative prend chaîne de STDIN:
Exécuter avec
echo '<input>' | php -nR '<code>'
ou tester en ligne .panne
Heureux que les chiffres soient entre guillemets; donc je n'ai besoin que d'une action à la fois.
Violon ASCII
Ajouter 3 tirets
$p
et en retirer 2 pour[
, 4 pour en]
ajoute un pour[
et en supprime un pour]
.la source
Python 2,
6564 octetsÀ l'heure actuelle, ma réponse commence systématiquement sans tirets, tout
["foo", "bar"]
comme:la source
import sys, pprint; pprint.pprint(sys.argv)
est de 43 octets mais je ne sais pas si cela enfreint les règles du golf de code.f=lambda o,d=0:o<''and'\n'.join(f(e,d+1)for e in o)or'-'*d+'>'+o
import sys, pprint.pprint as p; p(sys.argv)
est toujours 43 mais une bonne suggestion quand même; D Essayer enimport sys.argv as v
fait l'allonge quelque peu ~ 48 octets. Si l'on pouvait éliminer sys.argv, ils économiseraient beaucoup mais le programme devient alors tout à fait inutile. Une approche récursive est assez longuedef p(L,d=0): [p(i,d+1) if isinstance(i,list) else print(">"*d + i) for i in L]
, ~ 80 octets.Perl 5 , 55 octets
53 octets de code +
-nl
drapeaux.Essayez-le en ligne!
Pas optimal pour l'expression régulière en raison de certains cas énervés qui pourraient potentiellement se produire (en particulier, si un élément du tableau contient des crochets à l'intérieur).
Une fonction anonyme récursive serait à peine plus longue (61 octets):
Essayez-le en ligne!
Mais la façon dont Perl traite les paramètres n'est pas optimale pour les fonctions de golf: aucun paramètre facultatif signifie que je dois faire une deuxième fonction (anonyme) appelant la première, et je dois explicitement obtenir le dernier paramètre avec cette durée
my$v=pop
.la source
Rubis,
49 4546 octetsExemple:
Explication:
Fonction récursive: si
x==[*x]
alors x est un tableau, et nous itérons dessus. Sinon, indenter.la source
Haskell, 104 octets
Haskell n'a pas de listes imbriquées avec différentes profondeurs, donc je dois analyser la chaîne d'entrée par moi-même. Heureusement, la fonction de bibliothèque
reads
peut analyser les chaînes (c'est-à-dire la"
séquence de caractères fermée), j'ai donc un peu d'aide ici.Exemple d'utilisation:
Essayez-le en ligne! .
Comment ça fonctionne:
La fonction
#
passe par la chaîne char par char et conserve le niveau d'imbrication (le premier paramètrel
) sous la forme d'une chaîne-
avec une finale>
. Si le début de la liste peut être analysé comme une chaîne, prenezl
et la chaîne suivie d'un appel récursif avec la chaîne supprimée. Si le premier caractère est un espace, sautez-le. Si c'est un,
, prenez une nouvelle ligne et continuez, si c'est le cas]
, abaissez le niveau d'imbrication et continuez et sinon (seulement à[
gauche) augmentez le niveau d'imbrication et continuez. La récursivité se termine avec la chaîne d'entrée vide. La fonction principale(">"#)
définit le niveau d'imbrication sur">"
et appelle#
.la source
SWI-Prolog, 115 octets
Sauts de ligne ajoutés pour la lisibilité uniquement, non inclus dans le nombre d'octets.
p
prédicat traverse récursivement les tableaux, en ajoutant un «-» au préfixeF
lorsque vous déplacez un niveau plus profondément.w
est utilisé pour écrire le tableau de préfixes ainsi que l'élément réel dans la sortie.Exemple:
la source
Lot, 249 octets
Batch ennuyeux a du mal à comparer les virgules. Exemple d'exécution:
la source
Rétine ,
635452 octetsEnregistré 2 octets grâce à Martin Ender
Essayez-le en ligne!
Explication
Tout d'abord, le tableau est divisé en remplaçant chaque chaîne entre guillemets par tout ce qui l'a précédé, plus lui-même, plus une nouvelle ligne. En le décomposant comme ceci, il est possible de trouver les crochets d'ouverture inégalés avant chaque chaîne.
Cette translittération sera remplacée
[
par-
, laissée]
inchangée et supprimera tout autre caractère (-~
est entièrement ASCII imprimable). Cependant, il remplace uniquement les caractères apparaissant avant la chaîne finale sur chaque ligne.Ensuite, toutes les instances de
-]
sont supprimées. Celles-ci correspondent à des paires de parenthèses correspondantes, et nous voulons uniquement des parenthèses inégalées. Une fois ceux-ci supprimés, chaque ligne a un nombre de-
s égal au nombre de crochets d'ouverture inégalés qui l'ont précédée.Le dernier
-
avant a"
est remplacé par>
, pour former les flèches.Enfin, tous les
]
s et"
s restants sont supprimés.la source
Röda , 54 octets
Essayez-le en ligne!
C'est une fonction qui lit le tableau d'entrée du flux. Pour chaque élément, il s'appelle récursivement ou imprime l'élément.
la source
Python 3, 80 octets
Les lambdas de Python prennent en charge la récursion, semble-t-il, qui savait?
Ceci est un contre / compliment à la réponse d' orlp .
la source
=
. Je soupçonne également que vous pouvez supprimer tous les espaces après les trois)
, mais je ne suis pas très familier avec le golf en Python.Groovy, 92 octets
la source
Empilé , 27 octets
Essayez-le en ligne!
Prend l'entrée du haut de la pile et laisse la sortie sur STDOUT. C'est aussi simple que de faire une carte de profondeur, de répéter des
-
d
temps, de concaténer avec '>' et l'élément lui-même.la source
Gema, 63 caractères
Comme les autres solutions d'analyse, suppose qu'il n'y aura pas de guillemets doubles échappés dans les chaînes.
Exemple d'exécution:
la source
jq,
7067 caractères(
67commande option de ligne 64 caractères de code + 3 caractères)Exemple d'exécution:
Test en ligne
la source