-join("$args"-split'\b'|%{(,$(,$_[0]*$n+$_))[!!($n=$($_-1))]})
ลองออนไลน์!
ชำรุด
ช่างเป็นระเบียบ!
เริ่มจาก$args
ซึ่งเป็นอาร์เรย์องค์ประกอบเดียวที่มีสตริง RLE ฉันบังคับให้เป็นสตริงจริงโดยการตัดคำพูด
จากนั้นแบ่งตามขอบเขตของคำ (เป็น\b
regex) นั่นจะทำให้ฉันมีสตริงที่แต่ละองค์ประกอบเป็นจำนวนหรือโทเค็น BF ที่มาหลังจากจำนวน ดังนั้นในตัวอย่างที่ 4 องค์ประกอบแรกของอาร์เรย์แยกนี้10
, +]>+>
, 3
,+>
(ทั้งหมดเป็นสตริง)
ต่อไปฉันไปป์นั้นเข้าสู่ForEach-Object
( %
) เพื่อจัดการกับแต่ละองค์ประกอบองค์ประกอบ
ตรงกลางเป็นที่นิยมเล่นกอล์ฟ PowerShell ด้วยการบิด; โดยพื้นฐานแล้วมันเป็นตัวดำเนินการประกอบไปด้วย DIY ซึ่งคุณสร้างอาร์เรย์ 2 องค์ประกอบจากนั้นสร้างดัชนีโดยใช้นิพจน์บูลีนที่คุณต้องการทดสอบโดยที่ผลลัพธ์เท็จให้องค์ประกอบ 0 และผลลัพธ์จริงให้องค์ประกอบที่ 1
ในกรณีนี้ฉันสร้างอาร์เรย์องค์ประกอบเดียวด้วยตัวดำเนินการคอมม่า unary ,
เพราะฉันไม่ต้องการผลลัพธ์ในกรณีจริง
ก่อนอื่นให้ดูที่ตัวทำดัชนีแม้ว่ามันจะถูกเรียกใช้ในภายหลัง
แนวคิดนี้คือ$_
(องค์ประกอบปัจจุบัน) อาจเป็นหมายเลขที่ถูกต้องหรือสตริงอื่น ๆ หากเป็นตัวเลขฉันต้องการ$n
เป็นค่าของจำนวนนั้นลบ 1 (เป็นตัวเลขไม่ใช่สตริง) ถ้าไม่ฉันต้องการ$n
จะเท็จ -y
PowerShell มักจะพยายามบังคับค่าทางขวาให้กับประเภทของด้านซ้าย แต่ก็สามารถขึ้นอยู่กับการดำเนินการ นอกจากนี้"10"+5
จะให้สตริงใหม่กับคุณ"105"
ในขณะที่10+"5"
จะให้จำนวนเต็ม (15
)
แต่สายไม่สามารถลบออกดังนั้นแทนที่จะ PowerShell สามารถอนุมานค่าตัวเลขโดยอัตโนมัติด้วยเชือกที่ด้านซ้ายของลบจึงจะช่วยให้"10"-5
5
ดังนั้นฉันจะเริ่มต้นด้วย$_-1
ซึ่งจะให้ตัวเลขที่ฉันต้องการเมื่อ$_
เป็นจำนวนจริง แต่เมื่อมันไม่ใช่ฉันจะไม่ได้อะไรเลย บนพื้นผิว "ไม่มีอะไร" เป็นเท็จ แต่ปัญหาคือว่าจะหยุดการทำงานของการมอบหมายนั้นดังนั้น$n
จะรักษาค่าก่อนหน้านี้ ไม่ใช่สิ่งที่ฉันต้องการ!
ถ้าฉันห่อมันด้วย subexpression แล้วเมื่อมันล้มเหลวฉันก็จะได้ค่าที่$($_-1)
ไม่แน่นอน:
สิ่งที่ได้รับมอบหมาย$n
และเนื่องจากการกำหนดนั้นถูกห่อด้วยวงเล็บเองค่าที่ได้รับมอบหมายจะ$n
ถูกส่งผ่านไปยังไปป์ไลน์ด้วย
เนื่องจากฉันใช้มันในตัวสร้างดัชนีและฉันต้องการ1
ถ้าการแปลงสำเร็จฉันจึงใช้สองบูลีน - not
นิพจน์!!
เพื่อแปลงค่านี้เป็นบูลีน การแปลงตัวเลขที่ประสบความสำเร็จกลายเป็นจริงในขณะที่ความว่างเปล่าไร้สาระทำให้เราหวานหวาน0
ที่อนุญาตให้ส่งคืนองค์ประกอบเดียวในอาร์เรย์ประกอบไปด้วยของปลอม
กลับไปที่อาร์เรย์นั้นองค์ประกอบคือ: $("$($_[0])"*$n*$_)
$(,$_[0]*$n+$_)
"$($_[0])"
- นี่เป็นวิธีที่น่ารำคาญที่จะได้รับตัวอักษรตัวแรกขององค์ประกอบปัจจุบัน (สมมติว่ารับ+
มาจาก+[>+
) แต่เป็นสตริงและไม่ใช่[char]
วัตถุ ฉันต้องการให้เป็นสตริงเพราะฉันสามารถคูณสตริงด้วยตัวเลขเพื่อทำซ้ำ แต่ฉันไม่สามารถทำได้ด้วยอักขระ
จริงๆแล้วฉันจัดการเพื่อบันทึกตัวละคร 4 ตัวโดยใช้[char]
อาเรย์แทนสตริง (โดยใช้คอมม่า unary อื่น,
) ดังนั้นฉันสามารถลบเครื่องหมายคำพูดและนิพจน์ย่อยพิเศษได้ ฉันสามารถคูณอาร์เรย์เพื่อทำซ้ำองค์ประกอบ และเนื่องจากผลลัพธ์ทั้งหมดของการทำซ้ำนี้กลายเป็นอาร์เรย์ต่อไปและจำเป็นต้องมี-join
แก้ไขการใช้อาร์เรย์ที่นี่ไม่มีค่าใช้จ่ายเพิ่มเติม
แล้วฉันคูณว่าสตริงอาร์เรย์โดย$n
จะซ้ำ$n
ครั้ง จำได้ว่า$n
อาจจะเป็น$null
หรืออาจเป็นค่าของตัวเลขก่อนหน้าลบหนึ่ง
จากนั้น+$_
เพิ่มองค์ประกอบปัจจุบันลงที่ส่วนท้ายของอักขระตัวแรกที่ซ้ำกันขององค์ประกอบนั้น นั่นคือสาเหตุที่$n
เป็นลบ
วิธีนี้10+[>+
ลงท้ายด้วย$n
9 เท่ากับจากนั้นเราสร้าง 9 +
และเพิ่มกลับเข้าไปใน+[>+
สตริงเพื่อรับ 10 สิ่งที่ต้องการบวกองค์ประกอบอื่น ๆ พร้อมสำหรับการขี่
องค์ประกอบถูกห่อใน subexpression $()
เพราะเมื่อ$n
ใด$null
นิพจน์ทั้งหมดจึงล้มเหลวดังนั้นการสร้างอาร์เรย์จึงล้มเหลวดังนั้นตัวสร้างดัชนีจะไม่ทำงานดังนั้น$n
ไม่ได้รับมอบหมาย
เหตุผลที่ฉันใช้เคล็ดลับแบบไตรภาคนี้เป็นเพราะหนึ่งในลักษณะเฉพาะของมัน: ซึ่งแตกต่างจากผู้ประกอบการไตรภาคที่แท้จริงการแสดงออกที่กำหนดองค์ประกอบที่ทำได้รับการประเมินว่าพวกเขาเป็น "เลือก" หรือไม่และเป็นอันดับแรกสำหรับเรื่องนั้น
เนื่องจากฉันจำเป็นต้องกำหนดและใช้$n
ในการทำซ้ำที่แยกต่างหากจึงมีประโยชน์ ค่าองค์ประกอบอาร์เรย์ที่ประกอบไปด้วยสามส่วนได้รับการประเมินด้วย$n
ค่าของการวนซ้ำก่อนหน้านี้จากนั้นตัวทำดัชนีจะกำหนดใหม่$n
สำหรับการวนซ้ำปัจจุบัน
ดังนั้นForEach-Object
ลูปจะแสดงผลลัพธ์ทุกอย่างที่ควรจะเป็น (กลุ่มของข้อผิดพลาดที่เราไม่สนใจ) แต่เป็นอาร์เรย์ของสตริงใหม่
เพื่อให้สิ่งทั้งหมดถูกห่อในวงเล็บแล้วนำหน้าด้วย unary -join
เพื่อให้สตริงออก