Inspiriert von Ermitteln Sie die Größe einer Liste .
Definieren Sie die rekursive Größe RS
einer Liste, die keine Listen enthält, als Länge (Anzahl der enthaltenen Elemente) und die rekursive Größe einer Liste, die Listen enthält, als Summe ihrer Länge und der rekursiven Größe dieser Listen.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die die rekursive Größe einer Liste in möglichst wenigen Bytes ausgibt.
Die Eingabe ist eine Liste und kann Zahlen, Zeichenfolgen (sofern in Ihrer Sprache verfügbar) und ähnliche Listen enthalten.
Beispielsweise:
RS([]) = 0
RS([[]]) = 1
RS([4, 5, 6]) = 3
RS(["four", "five", "six"]) = 3
RS(["[[[[]]]]", "[][][][][]", "][][[[]]][]["]) = 3
RS([[4, 5, 6]]) = 4
RS([["four", "five", "six"]]) = 4
RS([["[[[[]]]]", "[][][][][]", "][][[[]]][]["]]) = 4
RS([[4], [5], [6]]) = 6
RS([["four"], ["five"], ["six"]]) = 6
RS([["[[[[]]]]"], ["[][][][][]"], ["][][[[]]][]["]]) = 6
RS([[[[[[[[[]]]]]]]]]) = 8
RS([[],[],[],[],[],[],[],[]]) = 8
RS([[],[],[[]],[[[[]]]]]) = 8
RS([0,[-1],[2.3,-4.3],[5,[6]],[7,[8,9,[10,11,[12,13,14]]]]]) = 22
Beachten Sie: Wenn Ihre Sprache keine Zeichenfolgen enthält, jedoch eine Liste von Zeichen enthält, können die oben aufgeführten Beispiele "strings"
tatsächlich eine Liste von Zeichen sein und zu größeren Ergebnissen führen. Als Beispiel:
RS([['f','o','u','r'], ['f','i','v','e'], ['s','i','x']]) = 14
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes; kein witziges Geschäft, wie immer.
Eine nicht aufgeführte Eingabe kann eine beliebige Ausgabe erzeugen.
I / O ist wie gewohnt flexibel .
quelle
Antworten:
Gelee , 8 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Python, 42 Bytes
Geben Sie für eine Nicht-Liste 0 aus. Geben Sie für eine Liste ihre Länge plus die Summe der rekursiven Ausgaben für ihre Elemente aus.
Listen werden in der Python 2-Reihenfolge nach Bedarf über und unter Zeichenfolgen angezeigt
[]<=x<''
. Stattdessen überprüfen wirx*0==[]
, während das Ergebnis0
für eine Zahl oder''
für eine Zeichenfolge.quelle
JavaScript (ES6),
3937 Bytes2 Bytes gespart dank @ edc65
quelle
f=a=>a.map?a.reduce((s,x)=>s+f(x),0):0
1
dort irgendwo ein setzen.f=a=>a.map&&a.map(x=>a-=~f(x),a=0)&&a
.-=~
ist 1+=1+
Zeichen kleiner als und schneidet ein anderes Zeichen, wenn ein Boolescher Wert in eine Ganzzahl umgewandelt wird. Wiederverwendena
, um die globale Variable zu umgehent
Mathematica, 20 Bytes
Anonyme Funktion. Nimmt einen Ausdruck als Eingabe und gibt eine Zahl als Ausgabe zurück. Das Unicode-Zeichen ist U + 221E INFINITY für
\[Infinity]
.Level[#,∞]
Gibt eine Liste der Unterausdrücke der Eingabe aus undLength@
zählt sie.quelle
Mathematica, 14 Bytes
Kleinere Änderung meiner vorherigen Antwort . Wie ich dort erklärt habe,
LeafCount
kümmert es sich bereits um verschachtelte Atomwerte, zählt aber auch die äußerste Liste, die wir vom Ergebnis abziehen müssen.quelle
Perl, 34 Bytes
Eine rekursive Funktion! Ja, Perl hat nicht nur Regex, sondern auch Funktionen!
Wenn Sie es testen möchten, können Sie Folgendes ausführen:
quelle
Mathematica, 32 Bytes
Unbenannte rekursive Funktion. Der Auszug
#0/@#~Select~ListQ
ruft die Funktion für jedes Element der Eingabe, das eine Liste ist, erneut auf undTr
fasst diese Werte zusammen. Glücklicherweise ist es in Mathematica in Ordnung, die Länge der leeren Liste zu nehmen und nach qualifizierenden Elementen aus der leeren Liste zu suchen, sodass kein Basisfall erforderlich ist.quelle
Haskell, 52 Bytes
Anwendungsbeispiel:
Haskell unterstützt keine gemischten Listen (z. B. Int und Liste von Int), daher gehe ich von einem benutzerdefinierten Listentyp aus,
L
der entweder ein Element eines Typs a (->E a
) oder eine Liste anderer Ls (->N[L a]
) ist. Die Berechnung der RS ist eine einfache Rekursion, bei der eineE
Anzahl1
und eineN
Eins plus die Summe der rekursiven Größen ihrer Elemente addiert werden. Die ganze Summe ist um 1 verschoben, also subtrahiere ich sie überpred
.Randnotiz: Die genauen Typen und Werte der Elemente sind für den Algorithmus nicht wichtig, daher können wir den Polymorphismus entfernen und uns nur mit abstrakten Elementen befassen
data L=E|N[L]
.quelle
Faktor 105 Bytes
Rekursive Funktion g.
Ungolfed (irgendwie):
Sie werden feststellen, dass es keine Aufrufe für gibt,
length
da die integrierte Längedrop 1
nicht in Zeichenfolgen und Nicht-Sequenzen implementiert wird.quelle
Mathematica, 18 Bytes
Noch ein weiterer Mathematica-Ansatz. Nicht so kurz wie die Verwendung des eingebauten,
LeafCount
aber immer noch ziemlich prägnant. Dies nutzt denMapAll
Operator,//@
der eine Funktion für jeden Knoten eines Ausdrucks aufruft, und wir verwenden diese Funktion, um einen Zähler zu erhöhenc
. Wie imLeafCount
Fall gibt dies mehr, als wir brauchen, da es auch den äußeren Listenkopf zählt, also starten wir den Zähler ab-1
.quelle
C # (Visual C # Interactive Compiler) , 50 Byte
Probieren Sie es online!
Verwendet dieselbe Technik wie die zuvor übermittelte Java-Antwort , nutzt jedoch LINQ, um die Antwortlänge zu verringern.
Erläuterung:
quelle
05AB1E (Legacy),
22 -17 ByteProbieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Diese Herausforderung ist in 05AB1E mit mehreren Herausforderungen verbunden:
λ
) eine rekursive Funktion hat , ist sie nur für Ganzzahlsequenzen nützlich. Hier ist eine Antwort von mir als Beispiel für die rekursive 05AB1E-Funktion. Aus diesem Grund musste ich eine Alternative für rekursive Aufrufe finden, indem ich einen Teil des Codes in eine Zeichenfolge einbaute und diese Zeichenfolge rekursiv als 05AB1E-Code ausführte.isList
In 05AB1E gibt es auch keinen Befehl. Daher musste ich einige Problemumgehungen verwenden, um dies zu überprüfen, indem ich das Umbrechen in eine Liste, die Tiefenreduzierung und die Überprüfung auf Gleichheit verwendete.˜
ist eine Tiefenabflachung, die alle Ebenen entfernt und eine mehrdimensionale Liste zu einer einzigen Liste mit allen innersten Werten macht. (dh[[1,2],[[[3]],4]]
wird[1,2,3,4]
).Am Ende befand sich der Code oben, um alle drei oben genannten Probleme zu lösen. Es ist in drei Hauptteile aufgeteilt. Zuerst haben wir folgendes:
Die Zeichenfolge enthält den folgenden Code:
Eine Map wird anstelle einer foreach-Schleife verwendet, da die Map implizit
y
ist und eine foreach-Schleife explizit benötigty
. Das interessiert uns aber nurcounter_variable
.Und schließlich, nachdem alle Karten und inneren Karten fertig sind, werden wir:
quelle
R , 65 Bytes
Probieren Sie es online!
Offensichtliche rekursive Implementierung der Spezifikation.
quelle
C
174167152 BytesRekursive Funktion
f
, die Speicher verliert ( 152 ):Rekursiv,
f
das unter Verwendung von Referenzen bei 167 nicht leckt :Ungolfed:
"Aber wie", fragen Sie, "kann dies in C beantwortet werden? Sicherlich gibt es in C keine verwalteten Arrays, und Sie können wirklich keine heterogenen Arrays haben ...?"
"Aha", erwidere ich, "denn ich habe an einem einfachen System von" Objekten "für (GNU-ish) C11 und ISO C ++ 11 gearbeitet".
Das vollständige Demo-Programm für diese Funktion ist:
Im Moment lebt es hier und du brauchst dieses Repo, um es zu benutzen.
Sie benötigen außerdem die
libfnv
für Ihre Plattform kompilierte Fowler-Noll-Vo-Hash-Bibliothek . Es befindet sich in diesem Repository und kann auch hier abgerufen werden .Dann kannst du machen
cc -DNODEBUG size.c path/to/libfnv.a -o size
.Die Implementierung ist nicht unbedingt effizient:
Aber es funktioniert! Das letzte Commit an Master (auf dem dieses Programm kompiliert wurde) war vor 2 Tagen, was bedeutet, dass diese Einreichung gültig ist.
quelle
Axiom 118 Bytes
ungolfed
Ergebnisse
quelle
APL (NARS), 24 Zeichen, 48 Byte
Dies wäre die wörtliche Übersetzung von "meiner" Axiom-Antwort hier ... In APL wäre die leere Liste "Zilde", die Sie mit "[]" angeben, "ist" [[] "," 1 2 3´ ist ´ [1,2,3] ´ ecc Einige Tests:
Für den Ausdruck der anderen Art von Ergebnissen schlägt die Übung vor, dass wir eine weitere Funktion benötigen (beide Funktionen RS und Rs sollten für die Übung in Ordnung sein).
Um zu sehen, wie einige Eingaben erscheinen, verwenden wir die o-Funktion:
Diese gedruckte Zilde und eine 8-Zilde-Liste:
quelle
Java, 96 Bytes
Probieren Sie es online aus.
Erläuterung:
quelle
Attache , 21 Bytes
Probieren Sie es online!
Es stellt sich heraus, dass der C # -Ansatz in Attache ziemlich kurz ist.
Alternativen
25 Bytes
f[x]:=#x+Sum!f=>IsArray\x
26 Bytes
f[x]:=#x+Sum[f=>IsArray\x]
35 Bytes
f:=Sum##{If[IsArray@_,1+f@_,1]}=>Id
35 Bytes
f:=Sum@Map[{If[IsArray@_,1+f@_,1]}]
37 Bytes
f[x]:=Sum[{If[IsArray@_,1+f@_,1]}=>x]
quelle
Clojure,
797751 BytesDie Eingabe muss eine Liste sein, kein Vektor. Beides würde durch Verwendung von unterstützt
sequential?
.Bisherige:
quelle
Python, 72 Bytes
quelle
0
undif
,0
undelse
, und ,)
undfor
.