Golfscript Diagonal Array


11

มีวิธีใดบ้างใน Golfscript ที่จะนำเส้นทแยงมุมทั้งหมดของอาเรย์เข้าสู่อาเรย์เดี่ยว?

ตัวอย่างเช่นสำหรับอาร์เรย์

[[1 2 3][4 5 6][7 8 9]]

กลับ

[[7][4 8][1 5 9][2 6][3]]

(ไม่จำเป็นต้องเรียงตามลำดับ) และสำหรับ

["ABCD""EFGH""IJKL"]

กลับ

["I""EJ""AFK""BGL""CH""D"]

(ไม่จำเป็นต้องเรียงตามลำดับนั้น) สมมติว่าความยาวของอาร์เรย์เหมือนกัน

ฉันกำลังดิ้นรนกับการหามันออกมา ฉันพยายามทำบางสิ่งด้วย=และวนซ้ำผ่าน(length+1)ตัวอักขระ th ของสตริง แต่นั่นไม่ได้ผล มีคนช่วยฉันได้ไหม

ฉันต้องการวิธีที่สั้นที่สุดในการทำเช่นนี้ถ้าเป็นไปได้


นี่ไม่ใช่เว็บไซต์ถามตอบปกติของคุณ คุณต้องมีเกณฑ์การชนะ ฉันแนะนำเนื้อหายอดนิยมสำหรับผู้เริ่มต้น
Timtech

@Timtech ฉันเข้าใจ ฉันจะลองแลกเปลี่ยนปกติ
โยสิยาห์พระพุทธเจ้าพระพุทธเจ้า

7
คำถามคำแนะนำเกี่ยวกับสนามกอล์ฟเฉพาะภาษาเป็นทางการในหัวข้อ: meta.codegolf.stackexchange.com/a/1725/20260
xnor

5
@xnor คุณเชื่อมโยงกับคำตอบที่ผิด นั่นคือเกี่ยวกับรายการเคล็ดลับเหล่านั้นที่เรามี แต่การขอคำแนะนำเฉพาะในหัวข้อก็จะดีถ้าคนสามารถหยุด downvoting และปิดการลงคะแนนนี้
Martin Ender

7
@ สตีฟเวอร์ริลล์ฉันไม่เห็นด้วยที่ควรทำสิ่งเหล่านี้กับ CW ที่ใช้เฉพาะกับคำถามรายการ (ในความเป็นจริงผมไม่ได้เห็นว่าผู้ที่ควรจะ CW) แต่มีจริงๆเหตุผลสำหรับคำถามคำแนะนำเฉพาะที่จะเป็น CW ไม่มี - พวกเขามีพื้นการแข่งขันกอล์ฟไมโครเพิ่มประสิทธิภาพและผู้คนที่ตอบ พวกเขาสมควรได้รับการเป็นตัวแทนของมัน (เช่นเดียวกับผู้ถามหากคำถามนั้นน่าสนใจ)
Martin Ender

คำตอบ:


8

พิจารณา

[
    "ABCD"
    "EFGH"
    "IJKL"
]

เพื่อให้ได้เส้นทแยงมุมหลักและเส้นทแยงมุมด้านบนเราสามารถเลื่อนถ่านตัวแรกของแถวที่สองและสองตัวแรกจากสาม:

[
    "ABCD"
    "FGH"
    "KL"
]

โปรดทราบว่าคอลัมน์ทั้งหมดสอดคล้องกับแนวทแยงดังนั้น "การซิป" อาเรย์ (เช่นการสลับแถวและคอลัมน์) จะให้ผลอาร์เรย์ที่มีสี่ diagonals ดังกล่าวข้างต้น:

[
    "AFK"
    "BGL"
    "CH"
    "D"
]

เรายังคงคิดถึงเส้นทแยงมุมด้านล่างเส้นทแยงมุมหลัก

หากเราซิปตัวเองและทำซ้ำกระบวนการข้างต้นเราจะได้รับอาร์เรย์ที่มีเส้นทแยงมุมหลักและเส้นทแยงมุมด้านล่างทั้งหมด ทั้งหมดที่เหลือไว้เพื่อคำนวณชุดยูเนี่ยนของทั้งสองอาร์เรย์

วางมันทั้งหมดเข้าด้วยกัน:

[.zip]{:A,,{.A=>}%zip}/|


[.zip]{              }/  # For the original array and it's transpose, do the following:
       :A                # Store the array in A.
         ,,{    }%       # For each I in [ 0 1 ... len(A) ], do the following:
            .A=>         # Push A[I] and shift out its first I characters.
                  zip    # Transpose the resulting array.
                       | # Perform set union.

ลองออนไลน์

ในที่สุดหากเราต้องการ diagonals เพียงเพราะเราค้นหาสตริงในตัวพวกมัน (เช่นในWord Search Puzzleซึ่งฉันคิดว่าเป็นแรงบันดาลใจให้กับคำถามนี้) วิธีการที่ "สะอาดน้อยลง" ก็อาจเหมาะสมเช่นกัน

คุณสามารถใช้ได้

..,n**\.0=,\,+)/zip

เพื่อให้ได้เส้นทแยงมุมทั้งหมดรวมถึงอักขระตัวดึงบรรทัดที่ไม่จำเป็น

ฉันได้อธิบายกระบวนการโดยละเอียดในคำตอบนี้แล้ว

ลองออนไลน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.