ด้วยเหตุผลทางประวัติศาสตร์ส่วนใหญ่การทุบตีนั้นค่อนข้างจะเป็นการหลบเลี่ยงวากยสัมพันธ์และกระบวนทัศน์การเขียนโปรแกรม - สิ่งนี้สามารถทำให้มันอึดอัดใจและบางครั้งก็น่าหงุดหงิดกับการเล่นกอล์ฟอย่างไรก็ตามมันมีเทคนิคเล็กน้อย ภาษา หนึ่งในนั้นคือการขยายตัวรั้ง
มีการขยายรั้งสองประเภทพื้นฐาน:
- วงเล็บปีกการายชื่ออาจมีรายการของสตริงที่กำหนดเองโดยคั่นด้วยเครื่องหมายจุลภาค (รวมถึงรายการที่ซ้ำกันและสตริงว่าง) ตัวอย่างเช่น
{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 ดังอธิบายข้างต้น โดยเฉพาะอย่างยิ่ง:
bash
ไม่อนุญาตให้ใช้eval โดย(หรือเชลล์อื่นที่มีการขยายตัวคล้ายกัน)- การจัดฟันแบบลำดับจะเป็นตัวเลขต่อจำนวนตัวพิมพ์เล็กถึงตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ต่อตัวพิมพ์ใหญ่โดยไม่มีการผสม ตัวเลขจะเป็นจำนวนเต็มในช่วงเซ็นชื่อแบบ 32 บิต หากกำหนดขนาดขั้นตอนเพิ่มเติมจะเป็นจำนวนเต็มบวกเสมอ (โปรดทราบว่าการทุบตีจะขยาย
{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