В основному з історичних причин, баш - це досить симпатичний синтаксис та парадигми програмування - це може зробити його незручним і часом неприємним для гольфу. Однак, у нього є кілька хитрощів в рукаві, які часто можуть зробити його конкурентоспроможним іншим основним сценарієм мови. Одне з них - розширення брекетів .
Існує два основних типи розширення дужок:
- Список дужок може містити розділені комами списки довільних рядків (включаючи дублікати та порожній рядок). Наприклад
{a,b,c,,pp,cg,pp,}, розгорнеться доa b c pp cg pp(відзначте пробіли навколо порожніх рядків). - Брекети послідовності можуть містити кінцеві точки послідовності, розділені на
... За бажанням..може слідувати інший із наступним розміром кроку. Кінцевими точками послідовності можуть бути або цілі числа, або символи. Послідовність автоматично піднімається або опускається відповідно до того, яка кінцева точка більша. Наприклад:{0..15}розшириться до0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15{-10..-5}розшириться до-10 -9 -8 -7 -6 -5{3..-6..2}розшириться до3 1 -1 -3 -5{a..f}розшириться доa b c d e f{Z..P..3}розшириться доZ W T Q
Крім цього, дужки послідовності та списку можуть існувати з дужками списку:
{a,b,{f..k},p}розшириться доa b f g h i j k p{a,{b,c}}розшириться доa b c
Підтяжки розширюються за допомогою рядків без пробілів з обох боків від них. Наприклад:
c{a,o,ha,}tрозшириться доcat cot chat ct
Це також працює для декількох дужок, об'єднаних разом:
{ab,fg}{1..3}розшириться доab1 ab2 ab3 fg1 fg2 fg3
Це може вийти досить складним. Наприклад:
{A..C}{x,{ab,fg}{1..3},y,}розшириться до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..c} {1..5}розшириться доa b c 1 2 3 4 5
Зверніть увагу, як завжди зберігається порядок.
Записи для цього виклику розширять розширення bash brace, як описано вище. Зокрема:
- eval
bash(або іншими оболонками, які виконують подібне розширення) не дозволяється - Брекети послідовності завжди будуть числоми до числа, малими літерами або великими літерами або великими літерами без змішування. Числа будуть цілими числами в 32-бітному діапазоні, підписаному. Якщо дано, необов'язковий розмір кроку завжди буде додатним цілим числом. (Зверніть увагу, що bash також буде розширюватися
{A..z}, але це може бути проігноровано для цього виклику) - окремі елементи в дужках списку завжди будуть складатися лише з великих і малих буквено-цифрових символів (пустий рядок включений)
- список брекетів може містити довільні вкладення інших розгорнень дужок
- брекети можуть бути об'єднані довільною кількістю разів. Це буде обмежено пам’яттю вашої мови, тому ви очікуєте, що теоретично ви можете робити довільну кількість конкатенацій, але якщо / коли у вас закінчиться пам'ять, це не буде рахуватися проти вас.
Приклади в тексті вище служать тестами. Узагальнено, кожен рядок вводу відповідає одному рядку виводу:
Вхідні дані
{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
Вихідні дані
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