Définissons la fonction "taille non enveloppée" u
d'une liste imbriquée l
(contenant uniquement des listes) selon les règles suivantes:
- Si
l
est vide, alorsu(l)
est 1. - Si
l
est non vide,u(l)
est égal à la somme des tailles non enveloppées de chaque élément dansl
, plus un.
Votre tâche consiste à écrire un programme (ou une fonction) qui prend une liste en entrée et génère (ou renvoie) la taille non enveloppée de la liste.
Cas de test:
[] -> 1
[[[]],[]] -> 4
[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]] -> 19
[[[[]]]] -> 4
Il s'agit de code-golf , donc le programme le plus court (en octets) l'emporte.
code-golf
string
array-manipulation
counting
Esolanging Fruit
la source
la source
()
place de[]
?[[[]][]]
au lieu de cela[[[]],[]]
dans votre deuxième exemple?["This is some text [with square brackets in] ...[& maybe more than one pair]"]
?]
ne semble être la solution la plus courte dans de nombreuses langues, il existe également de nombreuses réponses qui résolvent réellement ce défi via la manipulation de liste, et au moins dans les esolangs, compter les occurrences d'un caractère fixe est également très différent de compter les occurrences d'un caractère saisi.Réponses:
Rétine , 1 octet
Essayez-le en ligne! (La première ligne active une suite de tests séparés par un saut de ligne.)
Par défaut, Retina compte le nombre de correspondances de l'expression régulière donnée dans l'entrée. La taille non enveloppée est simplement égale au nombre de
[]
paires en entrée et donc au nombre de]
.la source
Mathematica, 9 octets
Il s'avère qu'il y a une fonction intégrée pour cela ...
Notez que cela ne fonctionnerait pas si les listes contenaient réellement des éléments non-liste. Ce
LeafCount
qui fait vraiment, c'est de compter le nombre de sous-expressions atomiques. Pour l'entrée{{}, {{}}}
, l'expression se lit en fait:Ici, les sous-expressions atomiques sont en fait les têtes
List
.la source
Brainfuck,
716159 octetsPrend l'entrée de STDIN dans le format donné dans la question et sort le caractère dont le code ASCII est la "taille non enveloppée" de la liste.
Je suis toujours un amateur complet chez Brainfuck, donc il y a très probablement de nombreuses optimisations qui peuvent encore être faites.
Essayez-le en ligne!
Non golfé:
la source
JavaScript (ES6),
2927 octetsj'adore quand une récursion se révèle clairement. Il s'agit essentiellement d'une recherche en profondeur de l'entrée, en ajoutant 1 chaque fois que la fin d'un tableau est atteinte.
Si un tableau vide était faux dans JS, cela pourrait être 24 octets:
Mais hélas, ce n'est pas le cas. Autres tentatives:
la source
f=a=>a[0]?f(a.pop())+f(a):1
marcherait? (Même nombre d'octets cependant.)f=a=>a.reduce((n,a)=>n+f(a),1)
. Maintenant, cef=(n,a)=>n+a.reduce(f,1)
n'est que 24 octets, mais malheureusement, les paramètres sont dans le mauvais ordre.)f=a=>a.map(a=>n+=f(a),n=1)&&n
Perl,
987 + 1 = 8 octetsNécessite le
-p
drapeauMerci à @Dada pour deux sauvegardes d'octets (j'adore cet exploit virgule btw)
la source
-p
pour économiser 1 octet;)y;[;
pour enregistrer un octet de plusCJam ,
75 octetsMerci à Peter Taylor d'avoir supprimé 2 octets! (
e=
au lieu def=:+
)Essayez-le en ligne!
la source
05AB1E , 4 octets
Essayez-le en ligne!
Je pense qu'il peut être joué plus mais ce «je» est obligatoire, sinon l'entrée est considérée comme un tableau réel au lieu d'une chaîne
la source
"[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]]"
dans l'entrée supprime cetteI
exigence, même si je ne sais pas si cela est autorisé.Labyrinthe , 8 octets
Essayez-le en ligne!
Explication
Cela compte les parenthèses d'ouverture via un peu de magie au niveau du bit. Si l' on considère les résultats des codes de caractères du ET de bitwise
[
,,
et]
avec2
, nous obtenons:Donc, si nous résumons simplement le résultat de cette opération pour chaque caractère, nous obtenons le double de la valeur souhaitée.
Quant au code lui-même, le bloc 2x2 au début est une petite boucle. Lors de la première itération
&-
, ne faites rien, sauf qu'ils mettent un zéro explicite au-dessus des implicites au bas de la pile. Ce sera le total cumulé (et il sera en fait négatif d'enregistrer un octet plus tard). Ensuite, la boucle se déroule comme suit:Une fois que nous quittons la boucle, le bit linéaire suivant est exécuté:
L'IP frappe alors un mort et se retourne. Lorsqu'il essaie de s'exécuter à
/
nouveau, le programme se termine en raison de la tentative de division par zéro.la source
Python
32,3623 octetsJ'ai remarqué que
u(l)
c'est égal au nombre de[
dans la représentation sous forme de chaîne del
, donc ce programme essaie de le faire. Il pourrait probablement être approfondi en trouvant un autre moyen de le faire, cependant ...la source
lambda x:`x`.count("[")
Python, 26 octets
Formule récursive simple.
la source
C #,
4641 octetsl est la chaîne de la liste imbriquée. Testez-le ici .
la source
return
en utilisant une fonction d'expression corporelle. Aussichar
jette implicitementint
que vous pouvez utiliser au91
lieu de'['
: Deint u(string l)=>l.Count(c=>c==91);
plus, vous pouvez laisser tomber la signature de la fonction et utiliser une méthode lambda:l=>l.Count(c=>c==91);
.Gelée , 4 octets
N'utilise pas de manipulation de chaîne. Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça fonctionne
la source
Rubis, 13 (+1) octets
Appelé avec
-n
argument:EDIT: modifié pour imprimer réellement la réponse
la source
->s{s.count ?[}
serait une soumission valable.Regex, 1 octet
Essayez-le en ligne!
la source
Brain-Flak ,
63, 61 octetsEssayez-le en ligne! 58 octets de code et +3 pour le
-a
drapeau permettant l'entrée ASCII.Version / explication lisible:
la source
Befunge ,
221816 octetsTryItOnline!
Edit: Merci à Martin Ender d' avoir rasé 4 octets!
Edit2: Crédit à David Holderness pour l'optimisation de deux autres
la source
///, 13 octets
Sortie en unaire.
Essayez-le en ligne!
Explication:
la source
///
?PHP, 35 octets
preg_match_all
trouve toutes les instances correspondantes de l'expression régulière et renvoie un nombre, c'est pourquoi les balises d'écho courtes sont nécessaires.Comme la plupart des réponses, il compte le nombre d'
[
entrées et de sorties de ce nombrela source
]
au lieu de[
, vous n'aurez pas à y échapper.count_chars()[91];
fait à peu près la même chose mais est plus courte.Raquette 82 octets
Non golfé:
Essai:
Production:
la source
V , 10 octets
Essayez-le en ligne!
Celui-ci contient des caractères non imprimables, voici la version lisible:
<C-a>
représente "ctrl-a" (ASCII0x01
) et<esc>
représente la touche d'échappement (ASCII0x1b
).Version plus amusante, moins golfique:
Essayez-le en ligne!
la source
Scala, 15 octets
Non golfé:
count
compte le nombre d'éléments satisfaisant un prédicat, dans ce cas92<
, qui est la méthode<
de92
.la source
O , 15 octets
Essayez-le ici!
Dans l'entrée, toutes les virgules doivent être supprimées ou remplacées par des espaces.
Explication
Si nous sommes autorisés à travailler sur une chaîne: 10 octets
la source
> <> ,
212018 octetsEdit: marquez 1 pour les déclarations goto!
Edit 2: Apparemment> <> diffère de Befunge en ce qu'il permet un décalage IP non nul après le wrapping (en d'autres termes, en utilisant une instruction de trampoline, je peux boucler sur (1, 0) au lieu de (0, 0)). Intéressant.
TryItOnline!
la source
Brainfuck, 28 octets
Essayez-le en ligne.
Cela compte le nombre de caractères saisis divisible par 3, c'est-à-dire le nombre de
]
caractères.Solution alternative de 34 octets comptant
[
directement les caractères et s'appuyant sur des cellules 8 bits:la source
C,
4846 octetsEnregistré deux octets grâce à kirbyfan64sos
Code de test
Cas de test
la source
*v++^91?0:i++
ài+=*v==91
pour enregistrer 3 octets.i+=*v++==91
pour économiser deux octets.tinylisp repl , 39 octets
Définit une fonction
u
qui peut être appelée comme(u (q ((())()) ))
(pour le deuxième cas de test). Le faire dans la repl économise 4 octets en raison de parenthèses fermées automatiquement.Explication
La
x-(0-y)
construction est nécessaire car tinylisp n'a pas de fonction d'addition intégrée, seulement une soustraction.la source
Befunge-98 ,
1211109 octetsTryItOnline!
Edit: Merci à Martin Ender d' avoir rasé un octet
la source
Haskell,
20 1917 octetsEssayez-le en ligne!
Prend la liste sous forme de chaîne et met un
1
dans une liste pour chacun]
, puis résume tous les1
s.Version sans point: (19 octets)
Suppose que ce
, [ ]
sont les seuls caractères de la chaîne. Filtre la liste pour obtenir tous les caractères supérieurs à[
, qui sont tous]
et renvoie la longueur.Usage:
la source
Bash + coreutils, 29 octets
la source
tr -d -c [|wc -c
, ce qui lira par défaut la liste à partir de l'entrée standard.DASH , 14 octets
Compte tout simplement
]
. Usage:Solution bonus, 15 octets
Celui-ci compte récursivement à partir d'une vraie liste. Usage:
la source