Per motivi prevalentemente storici, bash è un vero miscuglio di sintassi e paradigmi di programmazione - questo può renderlo imbarazzante e talvolta frustrante per giocare a golf. Tuttavia ha qualche asso nella manica che spesso può renderlo competitivo con altri script tradizionali le lingue. Uno di questi è l' espansione del tutore .
Esistono due tipi base di espansione del controvento:
- Le parentesi graffe elenco possono contenere elenchi separati da virgole di stringhe arbitrarie (inclusi duplicati e stringa vuota). Ad esempio
{a,b,c,,pp,cg,pp,}si espanderà aa b c pp cg pp(notare gli spazi attorno alle stringhe vuote). - Le parentesi graffe di sequenza possono contenere punti finali separati da
... Opzionalmente..può seguirne un altro , seguito da una dimensione del gradino. Gli endpoint della sequenza possono essere numeri interi o caratteri. La sequenza salirà o scenderà automaticamente in base a quale endpoint è maggiore. Per esempio:{0..15}si espanderà a0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15{-10..-5}si espanderà a-10 -9 -8 -7 -6 -5{3..-6..2}si espanderà a3 1 -1 -3 -5{a..f}si espanderà aa b c d e f{Z..P..3}si espanderà aZ W T Q
Oltre a ciò, possono esistere parentesi graffe di sequenza ed elenco con parentesi graffe di elenco:
{a,b,{f..k},p}si espanderà aa b f g h i j k p{a,{b,c}}si espanderà aa b c
Le parentesi graffe si espandono con stringhe non bianche su entrambi i lati. Per esempio:
c{a,o,ha,}tsi espanderà acat cot chat ct
Questo funziona anche con più apparecchi concatenati insieme:
{ab,fg}{1..3}si espanderà aab1 ab2 ab3 fg1 fg2 fg3
Questo può diventare piuttosto complesso. Per esempio:
{A..C}{x,{ab,fg}{1..3},y,}si espanderà aAx 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
Tuttavia, se c'è spazio tra le espansioni, allora si espandono semplicemente come espansioni separate. Per esempio:
{a..c} {1..5}si espanderà aa b c 1 2 3 4 5
Nota come l'ordine viene sempre preservato.
Le voci per questa sfida espanderanno le espansioni di parentesi graffe come descritto sopra. In particolare:
bashnon è consentito valutare da (o altre shell che eseguono un'espansione simile)- le parentesi graffe di sequenza saranno sempre da numero a numero, da minuscole a minuscole o da maiuscole a maiuscole senza miscelazione. I numeri saranno numeri interi nell'intervallo con segno a 32 bit. Se indicato, la dimensione del passaggio opzionale sarà sempre un numero intero positivo. (Nota che anche bash si espanderà
{A..z}, ma questo può essere ignorato per questa sfida) - i singoli elementi tra parentesi graffe saranno sempre composti solo da caratteri alfanumerici maiuscoli e minuscoli (stringa vuota inclusa)
- le parentesi graffe possono contenere annidamenti arbitrari di altre espansioni di parentesi graffe
- le parentesi graffe possono essere concatenate un numero arbitrario di volte. Questo sarà limitato dalla memoria del tuo linguaggio, quindi l'aspettativa è che teoricamente puoi fare un numero arbitrario di concatenazioni, ma se / quando esaurisci la memoria che non conterà contro di te.
Gli esempi nel testo sopra servono come testcase. Riassumendo, con ogni linea di input corrispondente alla stessa linea di output, sono:
Ingresso
{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
Produzione
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