-join("$args"-split'\b'|%{(,$(,$_[0]*$n+$_))[!!($n=$($_-1))]})
ลองออนไลน์!
ชำรุด
ช่างเป็นระเบียบ!
เริ่มจาก$argsซึ่งเป็นอาร์เรย์องค์ประกอบเดียวที่มีสตริง RLE ฉันบังคับให้เป็นสตริงจริงโดยการตัดคำพูด
จากนั้นแบ่งตามขอบเขตของคำ (เป็น\bregex) นั่นจะทำให้ฉันมีสตริงที่แต่ละองค์ประกอบเป็นจำนวนหรือโทเค็น 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"-55
ดังนั้นฉันจะเริ่มต้นด้วย$_-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+[>+ลงท้ายด้วย$n9 เท่ากับจากนั้นเราสร้าง 9 +และเพิ่มกลับเข้าไปใน+[>+สตริงเพื่อรับ 10 สิ่งที่ต้องการบวกองค์ประกอบอื่น ๆ พร้อมสำหรับการขี่
องค์ประกอบถูกห่อใน subexpression $()เพราะเมื่อ$nใด$nullนิพจน์ทั้งหมดจึงล้มเหลวดังนั้นการสร้างอาร์เรย์จึงล้มเหลวดังนั้นตัวสร้างดัชนีจะไม่ทำงานดังนั้น$nไม่ได้รับมอบหมาย
เหตุผลที่ฉันใช้เคล็ดลับแบบไตรภาคนี้เป็นเพราะหนึ่งในลักษณะเฉพาะของมัน: ซึ่งแตกต่างจากผู้ประกอบการไตรภาคที่แท้จริงการแสดงออกที่กำหนดองค์ประกอบที่ทำได้รับการประเมินว่าพวกเขาเป็น "เลือก" หรือไม่และเป็นอันดับแรกสำหรับเรื่องนั้น
เนื่องจากฉันจำเป็นต้องกำหนดและใช้$nในการทำซ้ำที่แยกต่างหากจึงมีประโยชน์ ค่าองค์ประกอบอาร์เรย์ที่ประกอบไปด้วยสามส่วนได้รับการประเมินด้วย$nค่าของการวนซ้ำก่อนหน้านี้จากนั้นตัวทำดัชนีจะกำหนดใหม่$nสำหรับการวนซ้ำปัจจุบัน
ดังนั้นForEach-Objectลูปจะแสดงผลลัพธ์ทุกอย่างที่ควรจะเป็น (กลุ่มของข้อผิดพลาดที่เราไม่สนใจ) แต่เป็นอาร์เรย์ของสตริงใหม่
เพื่อให้สิ่งทั้งหมดถูกห่อในวงเล็บแล้วนำหน้าด้วย unary -joinเพื่อให้สตริงออก