Z powodów historycznych bash jest dość mieszanką paradygmatów składniowych i programistycznych - może to sprawiać, że gra w golfa jest niewygodna, a czasem frustrująca. Ma jednak kilka sztuczek, które często sprawiają, że jest konkurencyjny w stosunku do innych skryptów głównego nurtu Języki. Jednym z nich jest rozszerzenie nawiasów klamrowych .
Istnieją dwa podstawowe typy rozszerzania nawiasów:
- Nawiasy klamrowe mogą zawierać rozdzielone przecinkami listy dowolnych ciągów (w tym duplikatów i pustych ciągów). Na przykład
{a,b,c,,pp,cg,pp,}zostanie rozwinięty doa b c pp cg pp(zwróć uwagę na spacje wokół pustych ciągów). - Nawiasy klamrowe mogą zawierać punkty końcowe sekwencji oddzielone
... Opcjonalnie..może nastąpić inny , a następnie rozmiar kroku. Punktami końcowymi sekwencji mogą być liczby całkowite lub znaki. Sekwencja automatycznie wzniesie się lub zejdzie w zależności od tego, który punkt końcowy jest większy. Na przykład:{0..15}rozwinie się do0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15{-10..-5}rozwinie się do-10 -9 -8 -7 -6 -5{3..-6..2}rozwinie się do3 1 -1 -3 -5{a..f}rozwinie się doa b c d e f{Z..P..3}rozwinie się doZ W T Q
Poza tym nawiasy klamrowe sekwencji i list mogą istnieć z nawiasami klamrowymi:
{a,b,{f..k},p}rozwinie się doa b f g h i j k p{a,{b,c}}rozwinie się doa b c
Nawiasy klamrowe rozszerzają się z ciągami znaków spacji po każdej ich stronie. Na przykład:
c{a,o,ha,}trozwinie się docat cot chat ct
Działa to również w przypadku wielu nawiasów klamrowych połączonych razem:
{ab,fg}{1..3}rozwinie się doab1 ab2 ab3 fg1 fg2 fg3
To może stać się dość skomplikowane. Na przykład:
{A..C}{x,{ab,fg}{1..3},y,}rozwinie się doAx 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
Jeśli jednak między rozwinięciami występuje spacja, wówczas rozwijają się one po prostu jako osobne rozszerzenia. Na przykład:
{a..c} {1..5}rozwinie się doa b c 1 2 3 4 5
Zwróć uwagę, jak porządek jest zawsze zachowany.
Wpisy dotyczące tego wyzwania będą rozszerzać rozszerzenia nawiasów klamrowych, jak opisano powyżej. W szczególności:
- eval przez
bash(lub inne powłoki, które wykonują podobne rozszerzenie) jest niedozwolone - nawiasy klamrowe sekwencji zawsze będą numer-na-numer, małe na małe lub duże na duże bez mieszania. Liczby będą liczbami całkowitymi w zakresie 32-bitowym ze znakiem. Jeśli podano, opcjonalny rozmiar kroku zawsze będzie dodatnią liczbą całkowitą. (Pamiętaj, że bash również się rozwinie
{A..z}, ale można to zignorować w przypadku tego wyzwania) - poszczególne elementy w nawiasach listowych zawsze będą się składać wyłącznie ze znaków alfanumerycznych pisanych wielkimi i małymi literami (w tym pusty ciąg znaków)
- nawiasy klamrowe mogą zawierać dowolne zagnieżdżenia innych rozszerzeń nawiasów klamrowych
- nawiasy klamrowe mogą być konkatenowane dowolną liczbę razy. Będzie to ograniczone pamięcią twojego języka, więc oczekuje się, że teoretycznie możesz wykonać dowolną liczbę konkatenacji, ale jeśli / kiedy zabraknie ci pamięci, nie będziesz się liczył.
Przykłady w powyższym tekście służą jako przypadki testowe. Podsumowując, każdy wiersz danych wejściowych odpowiada tej samej linii danych wyjściowych:
Wejście
{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
Wynik
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