Eine einfache Herausforderung für Ihren Montagabend (na ja, oder Dienstagmorgen in der anderen Hälfte der Welt ...)
Sie erhalten als Eingabe ein verschachteltes, möglicherweise uneinheitliches Array positiver Ganzzahlen:
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]
Ihre Aufgabe ist es, die Tiefe zu bestimmen, die die größte Verschachtelungstiefe aller Ganzzahlen in der Liste ist. In diesem Fall wird die Tiefe 11
heißt 6
, die am größten ist .
Sie können davon ausgehen, dass keines der Arrays leer ist.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Die Eingabe kann in einem beliebigen geeigneten Listen- oder Zeichenfolgenformat erfolgen, das nicht rechteckige Arrays (mit verschachtelten Arrays unterschiedlicher Tiefe) unterstützt, sofern die eigentlichen Informationen nicht vorverarbeitet wurden.
Sie dürfen keine eingebauten Elemente verwenden, die mit der Form von Arrays zusammenhängen (einschließlich eingebauter Elemente, die diese Herausforderung lösen und die Abmessungen eines verschachtelten Arrays liefern). Die einzige Ausnahme ist das Abrufen der Länge eines Arrays.
Es gelten die Standardregeln für Code-Golf .
Testfälle
[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
quelle
≡
Ist APLs eingebautes Grundelement für genau dies .\
in den Eingaben verwenden? EDIT: nevermind hat es einfach so ausprobiert. Das funktioniert auch nicht. Darn kann ich keine CMD-Argumente verwenden?Antworten:
K, 4 Bytes
In K
,/
werden alle Elemente einer Liste verbunden. Das gemeinsame Idiom,//
iteriert bis zu einem festen Punkt, wodurch eine beliebig verschachtelte Liste vollständig abgeflacht wird.,/\
wird auf ähnliche Weise zu einem festen Punkt iterieren, aber eine Liste von Zwischenergebnissen zusammenstellen. Indem wir zählen, wie viele Zwischenergebnisse wir besuchen, bevor wir den Fixpunkt (#
) erreichen, erhalten wir die gewünschte Antwort: die maximale Verschachtelungstiefe.Msgstr "Anzahl der Verknüpfungen über Festkomma - Scan".
In Aktion:
quelle
Retina , 10
Hier ist das Eingabeformat ein wenig überlegt -
_
Zeichen werden für Listentrennzeichen verwendet, so dass eine Eingabe wie folgt aussehen würde{1_{{2_3_{{4}_5}_6_{7_8}}_9_{10_{{{11}}}}_12_13}_14}
}{
und alle anderen\w
Zeichen. Dies hat zur Folge, dass a) alle Listen auf allen Ebenen aus nur einem Element bestehen und b) alle nicht-listenstrukturellen Zeichen entfernt werden.{
. Dies ergibt die tiefste Verschachtelungsebene.Probieren Sie es online aus.
Wenn das zu viel ist, dann war die vorherige Antwort:
Retina , 13
Angenommen, Listen sind in geschweiften Klammern enthalten
{}
.Probieren Sie es online aus .
quelle
_
anstelle von verwenden,,
aber das könnte ein bisschen langwierig sein._
Trennzeichen sind möglicherweise zu kompliziert. Also lasse ich beide Versionen in der AntwortPython 2, 33 Bytes
Definiert die Tiefe rekursiv, indem gesagt wird, dass die Tiefe einer Zahl 0 ist und die Tiefe einer Liste eins mehr als die maximale Tiefe ihrer Elemente ist. Die Prüfung der Anzahl gegenüber der Liste erfolgt durch Vergleich mit dem leeren Wörterbuch
{}
, das über den Zahlen, aber unter den Listen in der willkürlichen Reihenfolge der integrierten Typen in Python 2 liegt.quelle
Pyth -
11107 BytesDank @Dennis 1 Byte gespart
Dank @Thomas Kwa 4 Bytes gespart
Probieren Sie es hier online aus .
Summiert das Array so lange, bis es sich nicht mehr ändert, was bedeutet, dass es nur noch eine Zahl ist. Dies geschieht kumulativ, um alle Zwischenergebnisse zu speichern und die Länge zu ermitteln, indem ein Urange mit der gleichen Länge wie list erstellt und das letzte Element verwendet wird.
quelle
m!!d
werden kann&R1
.l
ist im OP nicht erlaubt.Haskell, 43 Bytes
Anwendungsbeispiel:
maximum.scanr(#)0 $ "[1, [[3]], [5, 6], [[[[8]]]], 1]"
->5
.Haskell hat keine gemischten Listen (
Integer
gemischt mitList of Integer
), daher kann ich einige Listenerkennungsfunktionen nicht ausnutzen und muss die Zeichenfolge analysieren.Ich beginne rechts mit
0
und addiere 1 für jeden]
, subtrahiere 1 für jeden[
und behalte den Wert ansonsten bei.scanr
behält alle Zwischenergebnisse,maximum
kann also seine Arbeit tun.quelle
JavaScript (ES6), 35 Byte
Erläuterung
Rekursive Funktion, die die maximale Tiefe eines Arrays oder
0
eine übergebene Zahl zurückgibt .quelle
MATL , 11
14 15BytesIn MATL werden für diese Art von Arrays geschweifte Klammern verwendet. Auf jeden Fall wird die Eingabe als Zeichenfolge verarbeitet, sodass auch eckige Klammern verwendet werden können, um die beiden Zeichen im Code zu ändern.
Probieren Sie es online!
quelle
Oktave, 29 Bytes
Ordnet
[
1 und]
-1 zu und berechnet dann das Maximum der kumulierten Summe.Die Eingabe ist eine Zeichenfolge des Formulars
Probelauf auf ideone .
quelle
{
,}
? Die Oktave, die den Arrays im OP entspricht, sind, glaube ich, Zellen-ArraysJulia,
5526 BytesDies ist eine rekursive Funktion, die ein eindimensionales Array mit Inhalten vom Typ akzeptiert
Any
und eine Ganzzahl zurückgibt. Wenn Sie ein Array an die Funktion übergeben, müssen Sie allen Klammern das Präfix "Any
, dh" voranstellenf(Any[1,Any[2,3]])
.Der Ansatz ist ziemlich einfach. Für eine Eingabe a multiplizieren wir a mit 0 und prüfen, ob das Ergebnis der Skalar 0 ist. Wenn nicht, wissen wir, dass a ein Array ist, also wenden wir die Funktion auf jedes Element von a an , nehmen das Maximum und addieren 1.
29 Bytes gespart dank Dennis!
quelle
Ruby, 53 Bytes
Eingabe von STDIN, Ausgabe an STDOUT.
quelle
Gelee,
107 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
Aktualisieren
Während ich diese Antwort schrieb, bemerkte ich, dass sich Jelly für unregelmäßige Listen ziemlich seltsam verhält, weil ich die Tiefe einer Liste als das inkrementierte Minimum der Tiefe ihrer Elemente berechnet habe .
Dies wurde in der neuesten Version behoben, sodass der folgende Code ( 6 Byte ) jetzt funktionieren würde.
Dies summiert die Zeilen des Arrays, anstatt sie zu verketten.
quelle
ŒḊ
ist neuer als die Herausforderung?Mathematica, 18 Bytes
quelle
Mathematica,
2720 BytesEinfache rekursive Funktion.
quelle
If
7 Bytes zu löschen. (Lassen Sie mich wissen, wenn Sie einen Hinweis möchten.)Replace
-basierte Lösung ist mindestens so lange wie diese ...Map
Ping über eine ganze Zahl ist ein no-op:Max[#0/@#]+1&[0#]-1&
. Die-1
können auch gerne in den inneren Ruf gehen...&[0#-1]&
.PHP, 61 Bytes
rekursive Funktion, die sich selbst als Zuordnungsfunktion verwendet, um jedes Element durch seine Tiefe zu ersetzen.
quelle
PHP,
8472646360 BytesHinweis: Erfordert PHP 7 für den kombinierten Vergleichsoperator. Verwendet auch IBM-850-Codierung
Laufen Sie wie folgt:
[
und 8 Byte gespart]
$i
auf ein int gewechselt wurde. String-Offsets werden implizit in ein int umgewandeltquelle
C
9869 Bytes29 Bytes weg danke @DigitalTrauma !!
Nimmt eine Zeichenfolge als Eingabe und gibt das Ergebnis als Ganzzahl zurück.
Live-Beispiel in: http://ideone.com/IC23Bc
quelle
Python 3,
4239 Bytes-3 Bytes dank Sp3000
Dies ist im Wesentlichen eine Portierung der Python 2-Lösung von xnor :
Gibt leider
[] > {}
einenunorderable types
Fehler zurück, so dass ein bestimmter cleverer Trick von xnor's nicht verwendet werden kann. An seiner Stelle-0123456789
sind die ASCII-Werte niedriger alsA
, was niedriger als ist[]
, daher funktioniert der Zeichenfolgenvergleich.quelle
CJam (15 Bytes)
Online-Demo
Präparation
Für die gleiche Länge, aber eher in hässlichem Hack-Gebiet,
quelle
s/ugly/beautiful/
'[,-
, um die Zeichenfolge zu entkleiden,[]
was darauf beruht, dass der Inhalt begrenzt ist. Der Ansatz, der die Abflachung bewirkt, funktioniert unabhängig vom Inhalt des Arrays.Sed, 40 Zeichen
(39 Zeichen Code + 1 Zeichen Befehlszeilenoption.)
Eingabe: String, Ausgabe: unäre Zahl.
Probelauf:
Sed, 33 Zeichen
(32 Zeichen Code + 1 Zeichen Befehlszeilenoption.)
Wenn nachfolgende Leerzeichen in der Ausgabe zulässig sind.
Eingabe: String, Ausgabe: unäre Zahl.
Probelauf:
quelle
Hexagonie , 61 Bytes
Edit : Danke @Martin Ender ♦, dass du mir 1 Byte vom wunderbaren -1-Trick erspart hast!
Probieren Sie es online aus, um Testfälle zu überprüfen!
Die folgenden Bilder werden nicht geändert, aber der Fluss ist im Grunde der gleiche. Beachten Sie auch, dass dies zurückgegeben wird,
-1
wenn die Eingabe kein Array ist (dh ohne[]
).Ich habe viele No-Ops im Hexagon ... ich denke, es kann definitiv mehr Golf gespielt werden.
Erläuterung
Kurz gesagt, fügt es ,
-1
wenn ein begegnet[
und fügt hinzu ,1
wenn ein begegnet]
. Schließlich druckt es das Maximum aus, das es hat.Führen Sie Test Case 5 aus, um dessen Verhalten bei Ausführung entlang der Zeichenfolge zu überprüfen
[1, [[3]], [5, 6], [[[[8]]]], 1]
:Es beginnt am Anfang und wird an der W-Ecke eingegeben:
Da gibt es noch Eingaben (nicht das Nullzeichen
\0
oder EOL), wird der Zeilenumbruch nach oben ausgeführt und der purpurrote Pfad gestartet.Hier ist, was passiert, wenn von dort bis süß
><
:,
Liest[
in den Puffer{
undZ
setzt die Konstante Z auf 90.'
Wechselt zu Diff und-
berechnet die Differenz. Für[
und]
der Unterschied wird1
und sein3
. Für Zahlen und Leerzeichen und Kommas ist es negativ.Dann laufen wir
(
zweimal (einmal am Ende des purpurroten Pfades, einmal am Anfang nach dem Umwickeln des grünen Pfades), um zu bekommen-1
und1
resp für[
und]
. Hier ändern wir die Benennung vonDiff
zuValue
. Fügen Sie diesen Wert der Tiefe hinzu. (Früher habe ich dafürZ&
gesorgt, dass es den rechten Nachbarn kopiert). Dann berechnen wirlastMin - Depth
und erhalten eine Zahl auf der Memory-KanteminLR
.Dann wenden wir
&
(am Ende des grünen Pfads) anminLR
: Wenn die Zahl <= 0 ist, wird der linke Wert kopiert (d. HlastMin - Depth <= 0 => lastMin <= Depth
), andernfalls nimmt sie den rechten Wert an.Wir springen auf den horizontalen blauen Pfad und sehen
Z&
erneut, welcher den kopiertminLR
. Dann haben wir"&
und eine Kopie der berechneten min. Die Klammern werden als ausgeglichen angenommen, daher muss die min <= 0 sein. Nach dem Wickeln geht der blaue Pfad nach links und trifft(
, wodurch die Kopie1
kleiner als die reale Minute ist. Bei erneuter Verwendung von-
haben wir eine weitere einmalige Kopie als Nachbar von Buffer erstellt:Hinweis:
copy
wird umbenannt in1-off
Wenn der blaue Pfad trifft
\
und ein schönes"
und<
erwischt ihn zurück zur Hauptschleife fängt.Wenn die Schleife trifft
1
,,
oderoder andere Zahlen als Eingabe:
Der Diff wird negativ und wird für die nächste Eingabe in die Hauptschleife zurückgespiegelt.
Wenn alles die Hauptschleife durchlaufen hat, erreichen wir EOL, was Buffer macht
-1
und es geht schließlich bis zum unteren Rand:'
Bewegt den MP zu1-off copy
und)
inkrementiert ihn, und mit~
Negation erhält er den korrekten Wert für die maximale Tiefe, mit dem gedruckt wird!
Und die Geschichte endet mit einem
@
.Ich denke, ich muss es etwas komplizierter haben. Wenn ich nur "zurückgehen" und "drucken" müsste, ohne zu erhöhen und zu negieren, hätte ich gut 2 Bytes gespart, ohne das volle Hexagon zu verwenden.
Vielen Dank an Timwi für Esoteric IDE und Hexagony Colorer !
quelle
-1
from verwenden,,
indem Sie die letzte Zeile in: ändern@!-".
(obwohl ich der Meinung bin, dass es wahrscheinlich möglich ist, viel mehr zu rasieren oder dies mit einigem Umbau sogar in die Seitenlänge 4 zu integrieren).Z
von der Verwendung gespartZ&
. Und es sollte bessere Möglichkeiten geben, das Programm mit dem impliziten if zu starten.Brainfuck, 48 Bytes
Formatiert:
Übernimmt die Eingabe wie formatiert
(1, ((3)), (5, 6), ((((8)))), 1)
und gibt einen Bytewert aus .Probieren Sie es online aus.
Hiermit wird die Tiefe nach Speicherort gespeichert, wobei der Zeiger nach rechts
(
und links bewegt)
und andere Zeichen ignoriert werden. Besuchte Zellen sind mit einem1
Flag gekennzeichnet, sodass sich am Ende der Hauptschleifedepth + 1
rechts neben der aktuellen Zelle ein Flag befindet . Diese werden dann hinzugefügt, um das Endergebnis auszudrucken.Eine vorherige 69-Byte-Lösung mit einem anderen Ansatz:
In dieser Version werden die Tiefe und die maximale Tiefe explizit in Zellen gespeichert.
quelle
Pyth,
1513 Bytes-2 Bytes von @Maltysen
Zählt die Differenz zwischen den kumulativen Zählern
[
und]
und nimmt das Maximum an.Y
ist das leere Array, und seine Zeichenfolgendarstellung (`
) ist günstig[]
.Probieren Sie es hier aus .
quelle
CJam, 19
22 23BytesÄhnliche Idee zu meiner MATL-Antwort.
Vielen Dank an Peter Taylor für das Entfernen von 3 Bytes
Probieren Sie es hier aus
quelle
Perl 5, 34 Bytes
32 plus zwei für
-p
Gestohlen von Digital - Trauma ‚s Retina Antwort ... die 26% kürzer als dieser ist.
:-)
Oder gleichermaßen:
quelle
]
muss nicht entkommen, außer in Klammern.s&...&...&g
ist der Substitutionsoperator. Siehe perldoc.perl.org/perlop.htmlRuby, 51 Zeichen
(Gestartet als Verbesserungsvorschlag für Doorknob ‚s Ruby - Antwort , aber am Ende anders. Also hat er es als separate Antwort geschrieben. Upvotes für die Tiefenzählung Idee (
?\\<=>$&
za aus'] ['.index(c)
) geht auf die ursprüngliche Antwort.)Eingabe: String, Ausgabe: Zahl.
Probelauf:
quelle
Perl 6, 53 Bytes
Die Schließung:
Benötigt ein Argument, zB:
Erläuterung:
quelle
Minkolang 0.15 ,
312924 BytesMein Algorithmus wurde nach Inspiration von Luis Mendos CJam-Antwort überarbeitet und 5 Bytes gespart!
Probieren Sie es hier aus!
Erläuterung
Im Wesentlichen führt dieser Code eine laufende Summe mit +1 für jeden
[
und -1 für jeden durch]
, verfolgt den erreichten Maximalwert und gibt dieses Maximum am Ende aus. Das Schleifen wird durch die toroidale Natur von Minkolangs Codebox gehandhabt.quelle
Ruby, 41 Zeichen
Parameter: Array, Rückgabe: Zahl.
Probelauf:
quelle
Oracle SQL 11.2, 133 Byte
Nicht golfen
Das CONNECT BY erstellt eine Zeile pro Zeichen in der Eingabezeichenfolge.
Der SUBSTR isoliert das der Zeilennummer entsprechende Zeichen.
Der DECODE übersetzt jedes '[' zu 1, jedes ']' zu -1 und jedes andere Zeichen zu 0.
Die analytische SUMME summiert jeweils 1, -1 und 0 aus den vorhergehenden Zeilen, einschließlich der aktuellen Zeile.
Die MAX-Summe ist die Tiefe.
quelle
Java 8, 95
Dies ist ein Lambda-Ausdruck für a
ToIntFunction<String>
. Die Eingabe wirdString
im OP-Beispielformat als übernommen.ziemlich geradeaus. Teilen Sie die Zeichenfolge mit
[
als Trennzeichen. Inkrementieren Sie für jeden von ihnen den Zählere
und vergleichen Sie ihn mit dem Zählerd
, wobei der größere von ihnen erhalten bleibtd
. Teilen Sie dann die Zeichenfolge der aktuellen Iteration auf, indem Sie]
diesmal als Trennzeichen verwenden, und subtrahieren Sie die Anzahl der zusätzlichen Teilungen vone
.quelle