Un défi simple pour votre lundi soir (enfin, ou mardi matin dans l'autre moitié du monde ...)
On vous donne en entrée un tableau imbriqué, potentiellement irrégulier d'entiers positifs:
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]
Votre tâche consiste à déterminer sa profondeur, qui est la plus grande profondeur d'imbrication de tout entier dans la liste. Dans ce cas, la profondeur de 11
est 6
, qui est la plus grande.
Vous pouvez supposer qu'aucun des tableaux ne sera vide.
Vous pouvez écrire un programme ou une fonction en prenant l’entrée via STDIN (ou l’alternative la plus proche), un argument de ligne de commande ou une argumentation de fonction et en générant le résultat via STDOUT (ou l’alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).
L'entrée peut être prise dans n'importe quel format de liste ou de chaîne qui prend en charge les tableaux non rectangulaires (avec des tableaux imbriqués de différentes profondeurs), tant que les informations réelles ne sont pas prétraitées.
Vous ne devez pas utiliser de modules intégrés liés à la forme des tableaux (y compris les modules intégrés qui résolvent ce défi, qui vous donnent les dimensions d'un tableau imbriqué). La seule exception à cela est la longueur d'un tableau.
Les règles de code-golf standard s'appliquent.
Cas de test
[1] -> 1
[1, 2, 3] -> 1
[[1, 2, 3]] -> 2
[3, [3, [3], 3], 3] -> 3
[[[[1], 2], [3, [4]]]] -> 4
[1, [[3]], [5, 6], [[[[8]]]], 1] -> 5
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14] -> 6
[[[[[[[3]]]]]]] -> 7
la source
≡
est la primitive intégrée d'APL pour exactement cela .\
dans les entrées? EDIT: peu importe juste essayé comme ça. Ça ne marche même pas non plus. Darn je ne peux pas utiliser d'arguments CMD?Réponses:
K, 4 octets
En K,
,/
rejoindra tous les éléments d'une liste. L'idiome commun,//
parcourt un point fixe, aplatissant complètement une liste imbriquée arbitrairement.,/\
itérera jusqu'à un point fixe de la même manière, mais rassemblera une liste de résultats intermédiaires. En comptant le nombre de résultats intermédiaires que nous visitons avant d'atteindre le point fixe (#
), nous obtenons la réponse que nous voulons: la profondeur d'imbrication maximale.Msgstr "Nombre de jointures sur scan à virgule fixe".
En action:
la source
Rétine , 10
Ici, le format d'entrée est un peu artificiel - les
_
caractères sont utilisés pour les séparateurs de liste, donc une entrée ressemblerait à ceci{1_{{2_3_{{4}_5}_6_{7_8}}_9_{10_{{{11}}}}_12_13}_14}
}{
et tous les autres\w
personnages. Cela a pour effet a) de faire en sorte que toutes les listes à tous les niveaux soient constituées d'un seul élément et b) de supprimer tous les caractères structurels non liés à une liste.{
. Cela donne le niveau d'imbrication le plus profond.Essayez-le en ligne.
Si c'est trop difficile, la réponse précédente était:
Rétine , 13
Suppose que les listes sont contenues entre accolades
{}
.Essayez-le en ligne .
la source
_
au lieu de,
mais cela peut être un peu exagéré._
séparateurs sont peut-être trop artificiels. Je laisse donc les deux versions dans la réponsePython 2, 33 octets
Définit récursivement la profondeur en disant que la profondeur d'un nombre est 0 et que la profondeur d'une liste est supérieure de un à la profondeur maximale de ses éléments. Le nombre par rapport à la liste est vérifié en comparant au dictionnaire vide
{}
, qui tombe au-dessus des nombres mais en dessous des listes sur l'ordre arbitraire de Python 2 des types intégrés.la source
Pyth -
11107 octets1 octets économisés grâce à @Dennis
4 octets économisés grâce à @Thomas Kwa
Essayez-le en ligne ici .
Continue à additionner le tableau jusqu'à ce qu'il cesse de changer, ce qui signifie que ce n'est qu'un nombre, le fait cumulativement pour enregistrer tous les résultats intermédiaires et obtient la longueur en créant une urange de la même longueur que la liste et en prenant le dernier élément.
la source
m!!d
peut devenir&R1
.l
n'est pas autorisé dans OP.Haskell, 43 octets
Exemple d'utilisation:
maximum.scanr(#)0 $ "[1, [[3]], [5, 6], [[[[8]]]], 1]"
->5
.Haskell n'a pas de listes mixtes (
Integer
mélangées avecList of Integer
), donc je ne peux pas exploiter certaines fonctions de détection de liste et je dois analyser la chaîne.Je commence par la droite avec
0
et ajoutez 1 pour chaque]
, soustrayez 1 pour chaque[
et conservez la valeur autrement.scanr
conserve tous les résultats intermédiaires, doncmaximum
peut faire son travail.la source
JavaScript (ES6), 35 octets
Explication
Fonction récursive qui renvoie la profondeur maximale d'un tableau, ou
0
si passé un nombre.la source
MATL , 11
14 15octetsLes accolades sont utilisées dans MATL pour ce type de tableaux. Quoi qu'il en soit, l'entrée est prise et traitée sous la forme d'une chaîne, de sorte que les crochets peuvent également être utilisés, modifiant les deux caractères du code.
Essayez-le en ligne!
la source
Octave, 29 octets
Mappe
[
à 1 et]
à -1, puis prend le maximum de la somme cumulée.L'entrée est une chaîne de la forme
Exemple de run sur ideone .
la source
{
,}
? L'équivalent d'octave des tableaux de l'OP sont des tableaux de cellules, je penseJulia,
5526 octetsIl s'agit d'une fonction récursive qui accepte un tableau unidimensionnel avec un contenu de type
Any
et renvoie un entier. Lorsque vous passez un tableau à la fonction, préfixez tous les crochets avecAny
, c.-à-df(Any[1,Any[2,3]])
.L'approche est assez simple. Pour une entrée a , nous multiplions a par 0 et vérifions si le résultat est le scalaire 0. Sinon, nous savons que a est un tableau, nous appliquons donc la fonction à chaque élément de a , prenons le maximum et ajoutons 1.
Sauvegardé 29 octets grâce à Dennis!
la source
Rubis, 53 octets
Entrée depuis STDIN, sortie vers STDOUT.
la source
Gelée,
107 octetsEssayez-le en ligne! ou vérifier tous les cas de test .
Comment ça marche
Mise à jour
En écrivant cette réponse, j'ai remarqué que Jelly se comporte plutôt bizarrement pour les listes irrégulières, car j'ai calculé la profondeur d'une liste comme le minimum incrémenté des profondeurs de ses éléments.
Cela a été résolu dans la dernière version, donc le code suivant ( 6 octets ) fonctionnerait maintenant.
Cela additionne les lignes du tableau au lieu de les concaténer.
la source
ŒḊ
est-ce plus récent que le défi?Mathematica, 18 octets
la source
Mathematica,
2720 octetsFonction récursive simple.
la source
If
, en économisant 7 octets. (Faites-moi savoir si vous voulez un indice.)Replace
solution basée est au moins aussi longue que celle-ci ...Map
ping sur un entier est un non-op:Max[#0/@#]+1&[0#]-1&
. Le-1
peut également entrer dans l'appel intérieur comme...&[0#-1]&
.PHP, 61 octets
fonction récursive qui s'utilise comme fonction de mappage pour remplacer chaque élément par sa profondeur.
la source
PHP,
8472646360 octetsRemarque: nécessite PHP 7 pour l'opérateur de comparaison combiné. Utilise également le codage IBM-850
Courez comme ça:
[
et]
$i
en un int. Les décalages de chaîne sont castés implicitement en entierla source
C,
9869 octets29 octets de réduction merci @DigitalTrauma !!
Prend une chaîne en entrée et renvoie le résultat sous forme d'entier.
Exemple en direct dans: http://ideone.com/IC23Bc
la source
Python 3,
4239 octets-3 octets grâce à Sp3000
Il s'agit essentiellement d'un portage de la solution Python 2 de xnor :
Malheureusement,
[] > {}
renvoie uneunorderable types
erreur, de sorte que cette astuce particulière de xnor ne peut pas être utilisée. À sa place, la-0123456789
valeur ASCIIA
est inférieure à[]
, qui est inférieure à , d'où la comparaison de chaînes fonctionne.la source
CJam (15 octets)
Démo en ligne
Dissection
Pour la même longueur mais plutôt plus en laid hack,
la source
s/ugly/beautiful/
'[,-
pour supprimer la chaîne[]
, ce qui dépend du contenu étant limité. L'approche qui aplatit fonctionne quel que soit le contenu du tableau.Sed, 40 caractères
(Code de 39 caractères + option de ligne de commande de 1 caractère.)
Entrée: chaîne, sortie: nombre unaire.
Échantillon échantillon:
Sed, 33 caractères
(Code de 32 caractères + option de ligne de commande de 1 caractère.)
Si des espaces de fin sont autorisés dans la sortie.
Entrée: chaîne, sortie: nombre unaire.
Échantillon échantillon:
la source
Hexagonie , 61 octets
Edit : Merci @Martin Ender ♦ de m'avoir sauvé 1 octet de la merveilleuse astuce -1!
Essayez-le en ligne pour vérifier les cas de test!
Les images ci-dessous ne sont pas modifiées mais le flux est fondamentalement le même. Notez également que cela retournera
-1
si l'entrée n'est pas un tableau (c'est-à-dire sans[]
).J'ai beaucoup de non-op à l'intérieur de l'Hexagone ... Je suppose qu'il peut certainement être joué plus.
Explication
En bref, il ajoute
-1
quand rencontre a[
et ajoute1
quand rencontre a]
. Enfin, il imprime le maximum qu'il a.Exécutons le cas de test 5 pour voir son comportement lorsqu'il s'exécute le long de la chaîne
[1, [[3]], [5, 6], [[[[8]]]], 1]
:Il commence au début et prend son entrée dans le coin W:
Puisqu'il y a toujours une entrée (pas le caractère nul
\0
ou EOL), il retourne en haut et démarre le chemin cramoisi.Voici ce qui se passe quand de là à mignon
><
:,
lit[
dans Buffer{
etZ
définit la constante Z à 90.'
se déplace vers Diff et-
calcule la différence. Pour[
et]
la différence sera1
et3
respectivement. Pour les nombres, les espaces et les virgules, ce sera négatif.Ensuite, nous courons
(
deux fois (une fois à la fin du chemin cramoisi, une au début après avoir enveloppé le chemin vert) pour obtenir-1
et1
resp pour[
et]
. Ici, nous changeons le nom deDiff
enValue
. Ajoutez cette valeur à la profondeur. (J'avais l'habitudeZ&
de m'assurer qu'il copie le bon voisin). Ensuite, nous calculonslastMin - Depth
et obtenons un nombre sur le bord de la mémoireminLR
.Ensuite, nous appliquons
&
(à la fin du chemin vert) àminLR
: Si le nombre est <= 0, il copie la valeur de gauche (c'est-à-direlastMin - Depth <= 0 => lastMin <= Depth
), sinon il prend la bonne valeur.Nous nous enroulons sur le chemin horizontal bleu et nous voyons à
Z&
nouveau qui copie leminLR
. Ensuite, nous avons"&
fait une copie du min calculé. Les crochets sont supposés être équilibrés, donc le min doit être <= 0. Après l'emballage, le chemin bleu va à gauche et frappe(
, ce qui rend la copie1
inférieure au vrai min. En réutilisant le-
, nous avons créé une copie supplémentaire en tant que voisin de Buffer:Remarque:
copy
est renommé en1-off
Lorsque le chemin bleu frappe
\
et obtient une belle"
et le<
rattrape dans la boucle principale.Lorsque la boucle frappe
1
,,
ouou d'autres nombres en entrée:
Le Diff deviendra négatif et il sera reflété dans la boucle principale pour la prochaine entrée.
Lorsque tout est passé par la boucle principale, nous atteignons EOL qui fait Buffer
-1
et il va finalement au bord inférieur:'
déplace le MP vers1-off copy
et l')
incrémente, et avec la~
négation, il obtient la valeur de profondeur maximale correcte qui est imprimée avec!
Et l'histoire se termine par un
@
.Je suppose que je dois avoir trop compliqué les choses un peu. Si je n'avais eu qu'à "reculer" et "imprimer" sans incrémentation ni négation, j'aurais bien économisé 2 octets sans utiliser l'hexagone complet.
Un grand merci à Timwi pour l' ésotérique IDE et Hexagony Colorer !
la source
-1
from,
en changeant la dernière ligne en:@!-".
(bien que je convienne qu'il est probablement possible de raser beaucoup plus ou même de l'intégrer dans la longueur de côté 4 avec une certaine restructuration).Z
d'utilisationZ&
. Et il devrait y avoir de meilleures façons de démarrer le programme avec le if implicite.brainfuck, 48 octets
Formaté:
Prend l'entrée formatée comme
(1, ((3)), (5, 6), ((((8)))), 1)
et génère une valeur d'octet .Essayez-le en ligne.
Cela stocke la profondeur par emplacement de mémoire, en déplaçant le pointeur vers la droite
(
et la gauche pour)
et en ignorant les autres caractères. Les cellules visitées sont marquées d'un1
drapeau, donc à la fin de la boucle principale, il y aura desdepth + 1
drapeaux à droite de la cellule actuelle. Ceux-ci sont ensuite ajoutés pour imprimer le résultat final.Une solution précédente de 69 octets utilisant une approche différente:
Dans cette version, la profondeur et la profondeur maximale sont stockées explicitement dans les cellules.
la source
Pyth,
1513 octets-2 octets par @Maltysen
Compte la différence entre les comptes cumulés de
[
et]
, et prend le maximum.Y
est le tableau vide, et sa représentation sous forme de chaîne (`
) est commodément[]
.Essayez-le ici .
la source
CJam, 19
22 23octetsIdée similaire à ma réponse MATL.
Merci à Peter Taylor d'avoir supprimé 3 octets
Essayez-le ici
la source
Perl 5, 34 octets
32, plus deux pour
-p
Stolen du numérique Trauma de réponse Retina ... qui est 26% plus court que cela.
:-)
Ou, également:
la source
]
n'a pas besoin de s'échapper, sauf entre parenthèses.s&...&...&g
est l'opérateur de substitution. Voir perldoc.perl.org/perlop.htmlRuby, 51 caractères
(Commencé en tant que suggestion d'amélioration pour la réponse Ruby de Doorknob mais terminé différemment. Je l'ai donc publiée comme réponse distincte. Les votes positifs pour l'idée de comptage de profondeur ( , descendant de ) devraient aller à la réponse d'origine.)
?\\<=>$&
'] ['.index(c)
Entrée: chaîne, sortie: nombre.
Échantillon échantillon:
la source
Perl 6, 53 octets
La fermeture:
A besoin d'un argument, par exemple:
Explication:
la source
Minkolang 0,15 ,
312924 octetsJ'ai révisé mon algorithme suite à l'inspiration de la réponse CJam de Luis Mendo et économisé 5 octets!
Essayez-le ici!
Explication
Essentiellement, ce code fait garder un total cumulé avec +1 pour chacun
[
et -1 pour chacun]
, en gardant une trace de la valeur maximale atteinte, en sortant ce maximum à la fin. Le bouclage est géré par la nature toroïdale de la boîte à codes de Minkolang.la source
Ruby, 41 caractères
Paramètre: tableau, retour: nombre.
Échantillon échantillon:
la source
Oracle SQL 11.2, 133 octets
Non-golfé
CONNECT BY crée une ligne par caractère dans la chaîne d'entrée.
Le SUBSTR isole le caractère correspondant au numéro de ligne.
Le DECODE traduit chaque «[» en 1, chaque «]» en -1 et chaque autre caractère en 0.
Le SUM analytique additionne chacun 1, -1 et 0 des lignes précédentes, y compris la ligne actuelle;
La somme MAX est la profondeur.
la source
Java 8, 95
Il s'agit d'une expression lambda pour a
ToIntFunction<String>
. L'entrée est considérée comme unString
dans le format d'exemples de l'OP.assez simple. Fractionnez la chaîne en utilisant
[
comme délimiteur. Pour chacun d'eux, incrémentez le compteure
et comparez-le avec le compteurd
, en gardant le plus grand d'entre euxd
. Ensuite, divisez la chaîne de l'itération actuelle en utilisant]
cette fois comme délimiteur et soustrayez le nombre de divisions supplémentairese
.la source