Untuk sebagian besar alasan historis, bash cukup membingungkan dan sintaksis dan paradigma pemrograman - ini bisa membuatnya canggung dan terkadang membuat frustasi bermain golf. Namun bash memiliki beberapa trik di lengannya yang sering membuatnya kompetitif dengan skrip utama lainnya. bahasa. Salah satunya adalah ekspansi brace .
Ada dua jenis dasar ekspansi brace:
- Daftar kawat gigi mungkin berisi daftar string arbitrary yang dipisahkan koma (termasuk duplikat dan string kosong). Misalnya
{a,b,c,,pp,cg,pp,}
akan diperluas kea b c pp cg pp
(perhatikan spasi di sekitar string kosong). - Urutan kawat gigi mungkin berisi titik akhir urutan yang dipisahkan oleh
..
. Secara opsional, orang lain..
dapat mengikuti, diikuti oleh ukuran langkah. Titik akhir urutan dapat berupa bilangan bulat atau karakter. Urutan akan secara otomatis naik atau turun sesuai dengan titik akhir mana yang lebih besar. Sebagai contoh:{0..15}
akan diperluas ke0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
akan diperluas ke-10 -9 -8 -7 -6 -5
{3..-6..2}
akan diperluas ke3 1 -1 -3 -5
{a..f}
akan diperluas kea b c d e f
{Z..P..3}
akan diperluas keZ W T Q
Di luar ini, kurung kurawal dan daftar mungkin ada dengan kurung kurawal:
{a,b,{f..k},p}
akan diperluas kea b f g h i j k p
{a,{b,c}}
akan diperluas kea b c
Kawat gigi mengembang dengan string non-spasi putih di kedua sisi. Sebagai contoh:
c{a,o,ha,}t
akan diperluas kecat cot chat ct
Ini juga berfungsi untuk beberapa kawat gigi yang disatukan:
{ab,fg}{1..3}
akan diperluas keab1 ab2 ab3 fg1 fg2 fg3
Ini bisa menjadi sangat kompleks. Sebagai contoh:
{A..C}{x,{ab,fg}{1..3},y,}
akan diperluas keAx 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
Namun, jika ada ruang kosong di antara ekspansi, maka mereka hanya memperluas sebagai ekspansi terpisah. Sebagai contoh:
{a..c} {1..5}
akan diperluas kea b c 1 2 3 4 5
Perhatikan bagaimana pesanan selalu dipertahankan.
Entri untuk tantangan ini akan memperluas ekspansi bash brace seperti dijelaskan di atas. Khususnya:
- eval by
bash
(atau cangkang lain yang melakukan ekspansi serupa) tidak diizinkan - kurung kurawal akan selalu berupa angka-ke-angka, huruf kecil ke huruf kecil atau huruf besar ke huruf besar tanpa pencampuran. Angka akan berupa bilangan bulat dalam rentang 32-bit yang ditandatangani. Jika diberikan, ukuran langkah opsional akan selalu menjadi bilangan bulat positif. (Perhatikan bahwa bash juga akan berkembang
{A..z}
, tetapi ini mungkin diabaikan untuk tantangan ini) - masing-masing item dalam kawat gigi daftar akan selalu hanya terdiri dari karakter alfanumerik huruf besar dan kecil (termasuk string kosong)
- daftar kawat gigi dapat berisi sarang sembarang dari ekspansi penjepit lainnya
- kurung kurawal dapat digabungkan beberapa kali secara acak. Ini akan dibatasi oleh ingatan bahasa Anda, jadi harapannya adalah bahwa Anda secara teoritis dapat melakukan jumlah gabungan acak tetapi jika / ketika Anda kehabisan memori itu tidak akan diperhitungkan melawan Anda.
Contoh dalam teks di atas berfungsi sebagai testcases. Ringkasnya, dengan setiap jalur input sesuai dengan jalur output yang sama, mereka adalah:
Memasukkan
{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
Keluaran
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