ไขว้ Dyadic


9

เช่นเดียวกับสัญลักษณ์ APL ส่วนใหญ่จะมีความหมายต่างกันเมื่อถูกเรียกด้วยอาร์กิวเมนต์หนึ่งตัว (transpose) เทียบกับสองข้อโต้แย้ง ความท้าทายนี้เกี่ยวข้องกับสิ่งหลังซึ่งคล้ายกับnumpy.moveaxisใน Python หรือpermuteใน MATLAB แต่มีประสิทธิภาพมากกว่า

order ⍉ Aเมื่อorderมีรายการที่แตกต่าง

เมื่อสมาชิกทั้งหมดของorderแตกต่างกันorder ⍉ Aเท่ากับ:

  • numpy.moveaxis(A, tuple(range(len(A.shape)), order) ใน Python หรือ
  • permute(A,order)ใน MATLAB อ้างจากเอกสารของหลัง:

B = permute (A, order) จัดเรียงขนาดของ A ใหม่เพื่อให้อยู่ในลำดับที่ระบุโดยลำดับเวกเตอร์ อาร์เรย์ผลลัพธ์ B มีค่าเดียวกับ A แต่ลำดับของตัวห้อยที่จำเป็นในการเข้าถึงองค์ประกอบเฉพาะนั้นได้รับการจัดเรียงใหม่ตามที่ระบุโดยคำสั่ง

ตัวอย่างเช่นสมมติว่าAเป็นอาเรย์ 3D B ← (2 0 1)⍉Aและให้ จากนั้น B ก็เป็นเช่นนั้นB[x0,x1,x2] = A[x2,x0,x1]สำหรับทุกคนx2,x0,x1

order ⍉ Aเมื่อorderมีรายการซ้ำ

เมื่อorderมีการเข้าซ้ำเราจะใช้เส้นทแยงมุมของอาเรย์ ตัวอย่างเช่นให้ A เป็นอาร์เรย์ 2x3x4 B ← (0 0 1)⍉Aใช้เส้นทแยงมุมเป็นชิ้น ๆAเพื่อสร้างBสิ่งB[x0,x1] = A[x0,x0,x1]นั้น ทราบว่าBเป็นอาร์เรย์ 2x4: ถ้าเป็น 3x4, เราจะต้องตั้งค่าที่จะออกจากขอบเขตของB[2, x1] = A[2, 2, x1] Aโดยทั่วไปkมิติของวันที่Bจะต่ำสุดของทั้งหมดดังกล่าวว่าA.shape[i]order[i] = k

ตัวอย่าง

พิจารณาทรานดิสไดร์order⍉Aโดยที่order = [2, 1, 0]และ A คือ 3x4x5

    A =
[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]
  [10 11 12 13 14]
  [15 16 17 18 19]]

 [[20 21 22 23 24]
  [25 26 27 28 29]
  [30 31 32 33 34]
  [35 36 37 38 39]]

 [[40 41 42 43 44]
  [45 46 47 48 49]
  [50 51 52 53 54]
  [55 56 57 58 59]]]

ผลลัพธ์ที่ได้คืออาร์เรย์ 5x4x3 B =

[[[ 0 20 40]
  [ 5 25 45]
  [10 30 50]
  [15 35 55]]

 [[ 1 21 41]
  [ 6 26 46]
  [11 31 51]
  [16 36 56]]

 [[ 2 22 42]
  [ 7 27 47]
  [12 32 52]
  [17 37 57]]

 [[ 3 23 43]
  [ 8 28 48]
  [13 33 53]
  [18 38 58]]

 [[ 4 24 44]
  [ 9 29 49]
  [14 34 54]
  [19 39 59]]]

ทราบว่าเมื่อยกตัวอย่างเช่น (x0, x1, x2) = (4,1,2) B[x0,x1,x2] = A[x2, x1, x0] = A[2,1,4] = 49เรามี

ถ้าแทนorder = [0, 0, 0]และAเป็นข้างต้นแล้วเราจะมีการส่งออกBเป็น 1 มิติขนาด 3 อาร์เรย์B = [0, 26, 52]เพื่อให้B[1] = B[x0] = A[x0,x0,x0] = A[1,1,1] = 26

อินพุต

ที่นี่เราใช้การจัดทำดัชนี 0 แต่คุณอาจใช้การจัดทำดัชนี 1 เช่นเดียวกับที่เป็นค่าเริ่มต้น APL

  • อาร์เรย์หลายมิติหรือซ้อนกันAของมิติn ≥ 1

  • รายการorderของnจำนวนเต็มบวกประกอบด้วยจำนวนเต็ม {0,1, ... , k} (หรือ {1, ... , k + 1} 1 ดัชนี) สำหรับบางk < nในลำดับใด ๆ อาจจะเป็น ด้วยการทำซ้ำ

เอาท์พุต

  • อาร์เรย์หลายมิติหรืออาร์เรย์ที่ซ้อนกันแสดงถึงผลลัพธ์ของการใช้ทรานสดิสไดร์ดิคกับอาร์กิวเมนต์เหล่านั้น (เอาต์พุตจะมีมิติk + 1 )

คุณสามารถเขียนโปรแกรมฟังก์ชั่นและอื่น ๆ ตามที่อนุญาตโดยมาตรฐานปัจจุบันของเมตา

หากภาษาของคุณมีบิวด์อินขอแนะนำให้เขียนวิธีการแก้ปัญหาโดยไม่ต้องใช้บิวอินเพื่อให้ได้คำตอบที่น่าสนใจ

กรณีทดสอบ

กรณีทดสอบบน TIO

การใช้งาน Python อ้างอิงเร็ว ๆ นี้

หมายเหตุสำหรับการอ่านกรณีทดสอบ: ใน APL แกนสุดท้ายและแกนสุดท้ายของอาร์เรย์จะเรียงตามคอลัมน์และแถวตามลำดับ


4
APL, 1 ไบต์:: P
Quintec

1
ที่จริงแล้วสัญลักษณ์ APL จำนวนมากจะใช้อาร์กิวเมนต์ที่สองที่เป็นค่าเริ่มต้นเมื่อเรียกด้วยอาร์กิวเมนต์เดียว ซึ่งรวมถึงการที่ใช้ดัชนีแกนตรงกันข้ามเป็นค่าเริ่มต้นเพื่อให้⍉Aเป็นเช่นเดียวกับ(2 1 0)⍉Aถ้าAเป็นอาร์เรย์ 3 มิติและโดยทั่วไปมี⍉A (⌽⍳≢⍴A)⍉A
Adám

@lirtosiast คำถามเกี่ยวกับ i / o: อาร์เรย์หลายมิติสามารถแสดงเป็นคู่ของรูปร่าง (รายการมิติ) และเนื้อหา (องค์ประกอบทั้งหมดตามลำดับพจนานุกรมของดัชนี) หรือไม่
ngn

@ngn ฉันจะบอกว่าไม่ได้ตอนนี้ แต่คุณควรถามเมตาว่ารูปแบบที่เป็นที่ยอมรับโดยค่าเริ่มต้น
lirtosiast

@lirtosiast Anecdotally, Dyalog APL [number-of-dimensions,first-dimension-length,second-dimension-length,…,last-dimension-length,first-element,second-element,…,last-element]ร้านค้าภายในอาร์เรย์เป็น
Adám

คำตอบ:


4

APL (Dyalog Unicode) , 34 ไบต์SBCS

นี่คือเพื่อนร่วมงานของฉันรหัส 's (แก้ไขเล็กน้อยจากโรเจอร์ฮุย : ประวัติความเป็นมาของ APL 50 ฟังก์ชั่น , บทที่ 30 ) โพสต์ได้รับอนุญาตอย่างชัดเจน

tacit infix lambda (สามารถใช้เป็นแบบดรอปอิน)

{⍵[(⊂⊂⍺)⌷¨,¨⍳⍺[⍋⍺]{⌊/⍵}⌸(⍴⍵)[⍋⍺]]}

ลองออนไลน์!

{} dfn; เป็นอาร์กิวเมนต์ที่เหลือ (แกน)คืออาร์กิวเมนต์ที่ถูกต้อง (อาร์เรย์)
เช่น[2,2,1]และ[[[1,2],[3,4]]]

⍵[... ทำ] ดัชนีอาร์เรย์ด้วย:

  (⍴⍵)[] รูปร่าง (ความยาวของแกน) ของอาร์เรย์จัดทำดัชนีโดย:
  [1,2,2]

   ⍋⍺ เวกเตอร์ที่ให้คะแนน (ดัชนีที่จะจัดเรียง) ของแกน
   [3,1,2]
  [2,1,2]

  ⍺[⍋⍺]{}⌸ ใช้แกนเรียงเป็นคีย์เพื่อจัดกลุ่มนั้นและสำหรับแต่ละกลุ่ม:
  [1,2,2]{"1":[2],"2":[1,2]}

   {⌊/⍵} ค้นหาความยาวแกนต่ำสุด
   {"1":2,"2":1}[2,1]

   สร้างดัชนีในระบบคาร์ทีเซียนของมิติเหล่านั้น
  [[[1,1]],[[2,1]]]

   ตรวจสอบให้แน่ใจว่าดัชนีของแต่ละพิกัดเป็นเวกเตอร์ (จะเป็นสเกลาร์ถ้าเป็นเวกเตอร์)
  [[[1,1]],[[2,1]]]

  (... จัดทำ)⌷¨ ดัชนีแต่ละรายการด้วยสิ่งต่อไปนี้:

   ⊂⊂⍺ แกน (ล้อมรอบเป็นทวีคูณครั้งเดียวสำหรับเลือกเซลล์เหล่านั้นตามแกนแรกและแกนเดี่ยวเท่านั้นและหนึ่งครั้ง¨เพื่อจับคู่เวกเตอร์แต่ละอันทางด้านขวาด้วยแกนทั้งชุดทางด้านซ้าย)
   2 1 2
  [[[1,1,1]],[[1,2,1]]]
[[1],[3]]

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