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,}t
wird 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
Antworten:
Ruby,
405403401400 BytesEin weiser Mann (Jamie Zawinski) sagte einmal: "Manche Leute denken, wenn sie mit einem Problem konfrontiert werden, 'ich weiß, ich werde reguläre Ausdrücke verwenden.' Jetzt haben sie zwei Probleme. "
Ich glaube nicht, dass ich dieses Zitat voll und ganz geschätzt habe, bis ich versucht habe, dieses Problem mit rekursivem regulären Ausdruck zu lösen. Anfangs schienen die Regex-Fälle einfach zu sein, bis ich mich mit Randfällen befassen musste, in denen Buchstaben neben Klammern vorkamen, und dann wusste ich, dass ich in der Hölle war.
Wie auch immer, führen Sie es hier online mit Testfällen aus
Ungolfed:
quelle
Python 2.7,
752728 BytesWow, das ist wie ein Haufen Code-Golf in einer Herausforderung!
Vielen Dank an @Neil für die Kürzung eines Lambdas
Erläuterung
b
: berechnet den Bereich gemäß den Spezifikationen.e
: Gibt die Position der äußersten Klammer zurück. Iterativ.m
: teilt äußerste Elemente in Kommas auf. Rekursivn
: Kombiniert Arrays, während nach Leergut gesucht wird.Ich konnte nichtand/or
zur Arbeit gehen.p
: Wo die meiste Arbeit erledigt ist. Überprüft alle Fälle (Bereich, nur Liste, muss kombiniert werden). Rekursivo
: Was sollte Eingang nehmen. Formate Eingabe / Ausgabe anp
.Ich habe das Gefühl, dass ich mich an einigen Stellen verbessern kann, also werde ich versuchen, mehr Golf zu spielen. Auch sollte ich in der Erklärung näher darauf eingehen.
quelle
[c+d for c in a for d in b] or a or b
zu arbeiten.JavaScript (Firefox 30-57),
465427425 ByteDie ES6-Version
f
wiegt zusätzlich 10 Byte:Erläuterung: Beginnt damit, Leerzeichen in Kommas zu ändern und die gesamte Zeichenfolge
{}
aus Gründen der Konsistenz einzufügen (danke an @Blue für die Idee). Sucht dann nach allen{..}
Konstrukten und erweitert sie zu{,}
Konstrukten. Next verwendet die Rekursion, um alle{,}
Konstrukte wiederholt von innen nach außen zu erweitern. Ersetzt schließlich alle Kommas durch Leerzeichen.quelle