Definieren wir die Funktion "Unwrapped Size" u
einer verschachtelten Liste l
(die nur Listen enthält) anhand der folgenden Regeln:
- Wenn
l
leer ist, dannu(l)
ist 1. - Wenn
l
nicht leeru(l)
ist, entspricht dies der Summe der unverpackten Größen aller Elemente inl
plus eins.
Ihre Aufgabe ist es, ein Programm (oder eine Funktion) zu schreiben, das eine Liste als Eingabe verwendet und die nicht umbrochene Größe der Liste ausgibt (oder zurückgibt).
Testfälle:
[] -> 1
[[[]],[]] -> 4
[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]] -> 19
[[[[]]]] -> 4
Das ist Code-Golf , also gewinnt das kürzeste Programm (in Bytes).
code-golf
string
array-manipulation
counting
Esolanging Fruit
quelle
quelle
()
statt verwenden[]
?[[[]][]]
stattdessen[[[]],[]]
in Ihrem zweiten Beispiel Eingaben in diesem Format vornehmen ?["This is some text [with square brackets in] ...[& maybe more than one pair]"]
?]
in vielen Sprachen die kürzeste Lösung zu sein scheint, gibt es auch viele Antworten, die diese Herausforderung tatsächlich durch Listenmanipulation lösen, und zumindest bei Esolangs unterscheidet sich das Zählen des Auftretens eines festen Zeichens erheblich vom Zählen die Vorkommen eines Eingabezeichens.Antworten:
Netzhaut , 1 Byte
Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)
Standardmäßig zählt Retina die Anzahl der Übereinstimmungen des angegebenen regulären Ausdrucks in der Eingabe. Die unverpackte Größe entspricht einfach der Anzahl der
[]
Paare in der Eingabe und damit der Anzahl der]
.quelle
Mathematica, 9 Bytes
Es hat sich herausgestellt, dass es dafür ein eingebautes gibt ...
Beachten Sie, dass dies nicht funktioniert, wenn die Listen tatsächlich Nicht-Listenelemente enthalten. Was
LeafCount
wirklich tut, ist die Anzahl der atomaren Unterausdrücke zu zählen. Zur Eingabe{{}, {{}}}
lautet der Ausdruck tatsächlich:Hier sind die atomaren Unterausdrücke eigentlich die Köpfe
List
.quelle
Brainfuck,
716159 BytesÜbernimmt die Eingabe von STDIN in dem in der Frage angegebenen Format und gibt das Zeichen aus, dessen ASCII-Code die "nicht umbrochene Größe" der Liste ist.
Ich bin immer noch ein absoluter Amateur bei Brainfuck, daher gibt es höchstwahrscheinlich noch viele Optimierungen, die vorgenommen werden können.
Probieren Sie es online!
Ungolfed:
quelle
JavaScript (ES6),
2927 BytesIch liebe es, wenn eine Rekursion so sauber ausfällt. Dies ist im Grunde eine Tiefensuche der Eingabe, bei der 1 addiert wird, wenn das Ende eines Arrays erreicht ist.
Wenn ein leeres Array in JS falsch wäre, könnten dies 24 Bytes sein:
Aber leider ist es nicht. Andere Versuche:
quelle
f=a=>a[0]?f(a.pop())+f(a):1
funktionieren (Gleiche Anzahl von Bytes)f=a=>a.reduce((n,a)=>n+f(a),1)
. Jetzt sindf=(n,a)=>n+a.reduce(f,1)
es nur noch 24 Bytes, aber leider sind die Parameter in der falschen Reihenfolge.)f=a=>a.map(a=>n+=f(a),n=1)&&n
Perl,
987 + 1 = 8 BytesBenötigt die
-p
FlaggeVielen Dank an @Dada für die Speicherung von zwei Bytes (ich liebe diesen Semikolon-Exploit übrigens)
quelle
-p
um 1 Byte zu sparen;)y;[;
, um ein weiteres Byte zu speichernCJam ,
75 BytesVielen Dank an Peter Taylor für das Entfernen von 2 Bytes! (
e=
anstelle vonf=:+
)Probieren Sie es online!
quelle
05AB1E , 4 Bytes
Probieren Sie es online!
Ich denke, es kann mehr Golf gespielt werden, aber das 'I' ist obligatorisch, andernfalls wird die Eingabe als tatsächliches Array anstelle einer Zeichenfolge betrachtet
quelle
"[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]]"
In der Eingabe wird dieseI
Anforderung entfernt, obwohl ich nicht weiß, ob dies zulässig ist.Labyrinth , 8 Bytes
Probieren Sie es online!
Erläuterung
Dies zählt die öffnenden Klammern mit ein bisschen bitweiser Magie. Wenn wir die Ergebnisse der Zeichencodes des bitweise berücksichtigen und von
[
,,
und]
mit2
, erhalten wir:Wenn wir also das Ergebnis dieser Operation für jedes Zeichen zusammenfassen, erhalten wir den doppelten Wert, den wir wollen.
Was den Code selbst betrifft, ist der 2x2-Block am Anfang eine kleine Schleife. Bei der ersten Iteration
&-
tun Sie nichts, außer dass sie eine explizite Null auf die impliziten Nullen am unteren Rand des Stapels setzen. Dies wird die laufende Summe sein (und es wird tatsächlich negativ sein, um ein Byte später zu speichern). Dann läuft die Schleife wie folgt ab:Sobald wir die Schleife verlassen, wird das folgende lineare Bit ausgeführt:
Die IP trifft dann einen Toten und dreht sich um. Bei einem
/
erneuten Ausführungsversuch wird das Programm aufgrund der versuchten Division durch Null abgebrochen.quelle
Python
32,3623 BytesMir ist aufgefallen, dass
u(l)
das gleich der Zahl[
in der String-Darstellung istl
, also versucht dieses Programm das zu tun. Wahrscheinlich könnte man noch mehr Golf spielen, wenn man einen anderen Weg findet, dies zu tun ...quelle
lambda x:`x`.count("[")
Python, 26 Bytes
Einfache rekursive Formel.
quelle
C #,
4641 Bytesl ist die Zeichenfolge der verschachtelten Liste. Teste es hier .
quelle
return
eine Ausdrucksfunktion verwenden. Auchchar
implizit wirft auf ,int
so dass Sie verwenden können ,91
statt'['
:int u(string l)=>l.Count(c=>c==91);
Weiterhin können Sie die Funktion Signatur löschen und eine Lambda - Methode verwenden:l=>l.Count(c=>c==91);
.Gelee , 4 Bytes
Verwendet keine String-Manipulation. Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Ruby, 13 (+1) Bytes
Mit
-n
Argument aufgerufen :BEARBEITEN: Wurde geändert, um die Antwort tatsächlich auszudrucken
quelle
->s{s.count ?[}
wäre eine gültige Vorlage.Regex, 1 Byte
Probieren Sie es online!
quelle
Brain-Flak ,
63, 61 BytesProbieren Sie es online! 58 Byte Code und +3 für das
-a
Flag, das die ASCII-Eingabe ermöglicht.Lesbare Version / Erklärung:
quelle
Befunge ,
221816 BytesTryItOnline!
Edit: Danke an Martin Ender für das Abschneiden von 4 Bytes!
Edit2: Dank an David Holderness für die Optimierung von zwei weiteren
quelle
/// 13 Bytes
Ausgabe in unary.
Probieren Sie es online!
Erläuterung:
quelle
///
?PHP, 35 Bytes
preg_match_all
Findet alle übereinstimmenden Instanzen des regulären Ausdrucks und gibt eine Zahl zurück. Aus diesem Grund werden die kurzen Echo-Tags benötigt.Wie die meisten Antworten zählt es die Anzahl
[
der Eingaben und gibt diese Anzahl ausquelle
]
anstelle von verwenden[
, müssen Sie nicht entkommen.count_chars()[91];
tut fast dasselbe, ist aber kürzer.Schläger 82 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
V , 10 Bytes
Probieren Sie es online!
Dies enthält einige nicht druckbare Zeichen, hier ist die lesbare Version:
<C-a>
repräsentiert "Strg-a" (ASCII0x01
) und<esc>
repräsentiert die Escape-Taste (ASCII0x1b
).Mehr Spaß, weniger Golf Version:
Probieren Sie es online!
quelle
Scala, 15 Bytes
Ungolfed:
count
zählt, wie viele Elemente ein Prädikat erfüllen, in diesem Fall92<
die Methode<
von92
.quelle
O , 15 Bytes
Probieren Sie es hier aus!
In der Eingabe müssen alle Kommas entweder entfernt oder durch Leerzeichen ersetzt werden.
Erläuterung
Wenn wir an einem String arbeiten dürfen: 10 Bytes
quelle
> <> ,
212018 BytesEdit: Punktzahl 1 für goto Aussagen!
Bearbeiten 2: Anscheinend unterscheidet sich> <> von Befunge darin, dass es einen IP-Versatz ungleich Null nach dem Einwickeln zulässt (mit anderen Worten, mithilfe einer Trampolinanweisung kann ich nach (1, 0) anstelle von (0, 0) einwickeln). Interessant.
TryItOnline!
quelle
Brainfuck, 28 Bytes
Probieren Sie es online aus.
Dies zählt die Anzahl der eingegebenen Zeichen, die durch 3 teilbar sind, dh die Anzahl der
]
Zeichen.Alternative 34-Byte-Lösung, bei der
[
Zeichen direkt gezählt und auf 8-Bit-Zellen zurückgegriffen werden:quelle
C
4846 BytesZwei Bytes dank kirbyfan64sos gespeichert
Code testen
Testfälle
quelle
*v++^91?0:i++
zui+=*v==91
, um 3 Byte zu speichern.i+=*v++==91
zwei Bytes speichern.tinylisp repl, 39 bytes
Definiert eine Funktion
u
, die wie folgt aufgerufen werden kann(u (q ((())()) ))
(für den zweiten Testfall). Wenn Sie dies in der Replikation tun, sparen Sie 4 Bytes durch automatisch geschlossene Klammern.Erläuterung
Das
x-(0-y)
Konstrukt ist notwendig, da tinylisp keine eingebaute Additionsfunktion hat, sondern nur eine Subtraktion.quelle
Befunge-98 ,
1211109 BytesTryItOnline!
Edit: Danke an Martin Ender für das Abschneiden eines Bytes
quelle
Haskell,
20 - 19 -17 BytesProbieren Sie es online!
Nimmt die Liste als String und setzt ein
1
für jede in eine Liste ein.]
Fasst dann alle1
s zusammen.Pointfree-Version: (19 Bytes)
Geht davon aus
, [ ]
sind die einzigen Zeichen in der Zeichenfolge. Filtert die Liste, um alle Zeichen größer als zu erhalten[
, die alle sind,]
und gibt die Länge zurück.Verwendung:
quelle
Bash + Coreutils, 29 Bytes
quelle
tr -d -c [|wc -c
, wodurch die Liste standardmäßig von der Standardeingabe gelesen wird.DASH , 14 Bytes
Zählt einfach
]
's. Verwendung:Bonuslösung, 15 Bytes
Dieser zählt rekursiv aus einer reellen Liste. Verwendung:
quelle