Aus meist historischen Gründen ist Bash ein ziemliches Durcheinander von Syntax- und Programmierparadigmen - dies kann das Golfen umständlich und manchmal frustrierend machen. Allerdings hat es ein paar Tricks im Ärmel, die es häufig mit anderen Mainstream-Skripten konkurrieren lassen Sprachen. Eine davon ist die Strebendehnung .
Es gibt zwei grundlegende Arten der Klammererweiterung:
- Listenklammern können durch Kommas getrennte Listen beliebiger Zeichenfolgen enthalten (einschließlich Duplikate und der leeren Zeichenfolge). Zum Beispiel
{a,b,c,,pp,cg,pp,}wird auf erweiterta b c pp cg pp(beachten Sie die Leerzeichen um die leeren Zeichenfolgen). - Sequenzklammern können durch getrennte Sequenzendpunkte enthalten
... Optional..kann eine weitere folgen, gefolgt von einer Schrittgröße. Sequenzendpunkte können entweder Ganzzahlen oder Zeichen sein. Die Sequenz steigt automatisch auf oder ab, je nachdem welcher Endpunkt größer ist. Beispielsweise:{0..15}wird zu erweitern0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15{-10..-5}wird zu erweitern-10 -9 -8 -7 -6 -5{3..-6..2}wird zu erweitern3 1 -1 -3 -5{a..f}wird zu erweiterna b c d e f{Z..P..3}wird zu erweiternZ W T Q
Darüber hinaus können Sequenz- und Listenklammern mit Listenklammern vorhanden sein:
{a,b,{f..k},p}wird zu erweiterna b f g h i j k p{a,{b,c}}wird zu erweiterna b c
Die geschweiften Klammern werden auf beiden Seiten durch Zeichenfolgen ohne Leerzeichen erweitert. Beispielsweise:
c{a,o,ha,}twird zu erweiterncat cot chat ct
Dies funktioniert auch für mehrere miteinander verkettete geschweifte Klammern:
{ab,fg}{1..3}wird zu erweiternab1 ab2 ab3 fg1 fg2 fg3
Dies kann sehr komplex werden. Beispielsweise:
{A..C}{x,{ab,fg}{1..3},y,}wird zu erweiternAx Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
Befindet sich zwischen den Erweiterungen jedoch ein Leerzeichen, werden sie einfach als separate Erweiterungen erweitert. Beispielsweise:
{a..c} {1..5}wird zu erweiterna b c 1 2 3 4 5
Beachten Sie, wie die Reihenfolge immer erhalten bleibt.
Einträge für diese Herausforderung erweitern die Bash-Klammer-Erweiterungen wie oben beschrieben. Bestimmtes:
- eval by
bash(oder andere Shells, die eine ähnliche Expansion durchführen) ist nicht erlaubt - Sequenzklammern werden immer von Nummer zu Nummer, von Kleinbuchstaben zu Kleinbuchstaben oder von Großbuchstaben zu Großbuchstaben ohne Vermischung angegeben. Zahlen sind ganze Zahlen im 32-Bit-Bereich mit Vorzeichen. Wenn angegeben, ist die optionale Schrittgröße immer eine positive ganze Zahl. (Beachten Sie, dass die Bash auch erweitert
{A..z}wird, dies kann jedoch für diese Herausforderung ignoriert werden.) - Einzelne Elemente in geschweiften Klammern bestehen immer nur aus alphanumerischen Groß- und Kleinbuchstaben (einschließlich leerer Zeichenfolge).
- Listenklammern können beliebige Schachtelungen anderer Klammererweiterungen enthalten
- geschweifte Klammern können beliebig oft verkettet werden. Dies wird durch die Speicherkapazität Ihrer Sprache begrenzt. Sie können also theoretisch beliebig viele Verkettungen durchführen, wenn jedoch die Speicherkapazität erschöpft ist, zählt dies nicht für Sie.
Die Beispiele im obigen Text dienen als Testfälle. Zusammengefasst, wobei jede Eingabezeile derselben Ausgabezeile entspricht, sind sie:
Eingang
{0..15}
{-10..-5}
{3..-6..2}
{a..f}
{Z..P..3}
{a,b,{f..k},p}
{a,{b,c}}
c{a,o,ha,}t
{ab,fg}{1..3}
{A..C}{x,{ab,fg}{1..3},y,}
{a..c} {1..5}
{a{0..100..10},200}r
Ausgabe
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-10 -9 -8 -7 -6 -5
3 1 -1 -3 -5
a b c d e f
Z W T Q
a b f g h i j k p
a b c
cat cot chat ct
ab1 ab2 ab3 fg1 fg2 fg3
Ax Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
a b c 1 2 3 4 5
a0r a10r a20r a30r a40r a50r a60r a70r a80r a90r a100r 200r