Vì hầu hết các lý do lịch sử, bash khá khó hiểu về cú pháp và mô hình lập trình - điều này có thể khiến nó trở nên lúng túng và đôi khi làm nản lòng khi chơi golf. ngôn ngữ. Một trong số đó là mở rộng cú đúp .
Có hai loại mở rộng niềng răng cơ bản:
- Danh sách dấu ngoặc có thể chứa danh sách các chuỗi tùy ý được phân tách bằng dấu phẩy (bao gồm các chuỗi trùng lặp và chuỗi trống). Ví dụ
{a,b,c,,pp,cg,pp,}
sẽ mở rộng thànha b c pp cg pp
(lưu ý các khoảng trắng xung quanh các chuỗi trống). - Niềng răng trình tự có thể chứa các điểm cuối trình tự cách nhau bởi
..
. Tùy chọn khác..
có thể theo sau, theo sau là một kích thước bước. Điểm cuối trình tự có thể là số nguyên hoặc ký tự. Trình tự sẽ tự động tăng hoặc giảm theo điểm cuối nào lớn hơn. Ví dụ:{0..15}
sẽ mở rộng sang0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
sẽ mở rộng sang-10 -9 -8 -7 -6 -5
{3..-6..2}
sẽ mở rộng sang3 1 -1 -3 -5
{a..f}
sẽ mở rộng sanga b c d e f
{Z..P..3}
sẽ mở rộng sangZ W T Q
Ngoài ra, niềng răng chuỗi và danh sách có thể tồn tại với niềng răng danh sách:
{a,b,{f..k},p}
sẽ mở rộng sanga b f g h i j k p
{a,{b,c}}
sẽ mở rộng sanga b c
Niềng răng mở rộng với các chuỗi không phải khoảng trắng ở hai bên của chúng. Ví dụ:
c{a,o,ha,}t
sẽ mở rộng sangcat cot chat ct
Điều này cũng hoạt động cho nhiều niềng răng nối với nhau:
{ab,fg}{1..3}
sẽ mở rộng sangab1 ab2 ab3 fg1 fg2 fg3
Điều này có thể nhận được khá phức tạp. Ví dụ:
{A..C}{x,{ab,fg}{1..3},y,}
sẽ mở rộng sangAx 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
Tuy nhiên, nếu có khoảng trắng giữa các lần mở rộng, thì chúng chỉ đơn giản là mở rộng thành các mở rộng riêng biệt. Ví dụ:
{a..c} {1..5}
sẽ mở rộng sanga b c 1 2 3 4 5
Lưu ý làm thế nào để trật tự luôn được bảo tồn.
Bài dự thi cho thử thách này sẽ mở rộng bash brace mở rộng như mô tả ở trên. Đặc biệt:
- eval bởi
bash
(hoặc các shell khác thực hiện mở rộng tương tự) không được phép - niềng răng theo thứ tự sẽ luôn luôn là số từ số đến chữ thường, chữ thường đến chữ thường hoặc chữ hoa thành chữ hoa mà không trộn lẫn. Các số sẽ là số nguyên trong phạm vi được ký 32 bit. Nếu được cung cấp, kích thước bước tùy chọn sẽ luôn là một số nguyên dương. (Lưu ý rằng bash cũng sẽ mở rộng
{A..z}
, nhưng điều này có thể bị bỏ qua cho thử thách này) - các mục riêng lẻ trong dấu ngoặc nhọn sẽ luôn chỉ bao gồm các ký tự chữ và số in hoa và in thường (bao gồm chuỗi trống)
- danh sách niềng răng có thể chứa các tổ tùy ý của các mở rộng niềng răng khác
- niềng răng có thể được nối số lượng tùy ý của số lần. Điều này sẽ bị giới hạn bởi bộ nhớ ngôn ngữ của bạn, vì vậy, kỳ vọng là về mặt lý thuyết bạn có thể thực hiện số lượng kết nối tùy ý nhưng nếu / khi bạn hết bộ nhớ sẽ không được tính vào bạn.
Các ví dụ trong văn bản trên phục vụ như là thử nghiệm. Tóm tắt, với mỗi dòng đầu vào tương ứng với cùng một dòng đầu ra, chúng là:
Đầu vào
{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
Đầu ra
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