พับเมทริกซ์ขึ้น!


13

รับเมทริกซ์รวมค่าของขึ้น / ลงหรือซ้าย / ขวาเพื่อสร้าง X, พับมันขึ้นและกลับรายการ ฉันอธิบายอัลกอริทึมที่นี่:

ขั้นตอนวิธี

ข้อมูลที่คุณป้อนจะเป็นเมทริกซ์จตุรัสที่มีขนาดเป็นจำนวนคี่ในความสามารถเชิงตัวเลขที่สมเหตุสมผลของภาษาของคุณ

ลองดูเมทริกซ์ต่อไปนี้เป็นตัวอย่าง:

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

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

1   2   3   2   1
    ↓   ↓   ↓    
0 → 3   2   3 ← 0
        ↓        
4 → 2 → 5 ← 6 ← 3
        ↑        
7 → 4   7   9 ← 4
    ↑   ↑   ↑    
0   6   7   2   5

ขั้นตอนนี้ให้ผลลัพธ์ต่อไปนี้:

1        1
  5    5
    39
  17  15
0        5

จากนั้นเราพับมันโดยทำให้แบนราบ X และผสมผสานองค์ประกอบเข้ากับด้านบนซ้ายก่อนและล่างซ้ายสุด สิ่งนี้ให้ผลลัพธ์ต่อไปนี้:

1, 0, 5, 17, 39, 5, 15, 1, 5

คุณสามารถจินตนาการสิ่งนี้ว่าเป็นการยืดเส้นทแยงมุมหลักและหมุนทวนเข็มนาฬิกา

นี่คือผลลัพธ์สุดท้าย

ท้าทาย

ใช้อัลกอริทึมนี้ ช่องโหว่มาตรฐานใช้ ยอมรับรูปแบบ I / O ที่เหมาะสมทั้งหมด

กรณีทดสอบ

Input
Output

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

1, 0, 5, 17, 39, 5, 15, 1, 5

1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0

1, 6, 11, 16, 47, 7, 22, 5, 0

1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9

1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9

คุณสามารถเพิ่มกรณีทดสอบเมทริกซ์ "ไม่ใช่ 5 × 5" ได้หรือไม่?
สิ้นเชิงมนุษย์

1
@icrieverytim นี่คุณไป
HyperNeutrino

คำตอบ:


7

จาวาสคริปต์, 113 ไบต์

s=>(l=s.length-1,a=[],s.map((v,y)=>v.map((n,x)=>a[q=2*[x,y,l-y].sort((u,v)=>u-v)[1]+(y>l/2),q-=q>l]=~~a[q]+n)),a)


อืมม .. ทำไม~~? พวกเขาต่อต้านซึ่งกันและกันดังนั้นจึงไม่จำเป็นสำหรับพวกเขา
Kevin Cruijssen

2
@KevinCruijssen ~~undefined==0ดังนั้นนี่คือ golfier (a[q]||0)กว่า
Neil

@Neil undefinedโอ้ไม่เคยคิดเกี่ยวกับ เมื่อตอนที่ผมคัดลอกกรณีทดสอบTSH~~ใช้ผมสังเกตเห็นมันทำงานได้โดยไม่ต้อง และเนื่องจากการทำให้เป็นกลาง~~xคล้ายกัน-(-x)ทำให้ฉันคิดว่ามันถูกทำให้อยู่ที่นั่นโดยบังเอิญ ขอบคุณสำหรับการแก้ไข
Kevin Cruijssen

5

เยลลี่ , 25 23 21 ไบต์

AṂ×ṠṚ
LHŒRṗ2Ç€ḅLĠịFS€

ลองออนไลน์!

รุ่นทางเลือก 19 ไบต์

AṂ×ṠṚ
LHŒRṗ2Ç€ĠịFS€

สิ่งนี้ไม่ได้ใช้ในการทำงานเพราะĠประพฤติไม่เหมาะสมสำหรับอาร์เรย์ที่ซ้อนกัน ข้อแตกต่างเพียงอย่างเดียวคือคู่[q, p] ที่กล่าวถึงในวิธีการทำงานเรียงลำดับตามพจนานุกรมแทนการแม็พกับp + nqก่อนการเรียงลำดับ

ลองออนไลน์!

พื้นหลัง

เราเริ่มต้นด้วยการแทนที่องค์ประกอบด้วยพิกัดเพิ่มขึ้นไปทางซ้ายและลงและวาง(0, 0)ที่กึ่งกลางของเมทริกซ์

สำหรับเมทริกซ์ 7x7 Mเราจะได้พิกัดต่อไปนี้

(-3,-3) (-3,-2) (-3,-1) (-3, 0) (-3, 1) (-3, 2) (-3, 3)
(-2,-3) (-2,-2) (-2,-1) (-2, 0) (-2, 1) (-2, 2) (-2, 3)
(-1,-3) (-1,-2) (-1,-1) (-1, 0) (-1, 1) (-1, 2) (-1, 3)
( 0,-3) ( 0,-2) ( 0,-1) ( 0, 0) ( 0, 1) ( 0, 2) ( 0, 3)
( 1,-3) ( 1,-2) ( 1,-1) ( 1, 0) ( 1, 1) ( 1, 2) ( 1, 3)
( 2,-3) ( 2,-2) ( 2,-1) ( 2, 0) ( 2, 1) ( 2, 2) ( 2, 3)
( 3,-3) ( 3,-2) ( 3,-1) ( 3, 0) ( 3, 1) ( 3, 2) ( 3, 3)

ตอนนี้เราคำนวณค่าสัมบูรณ์ขั้นต่ำของแต่ละคู่พิกัดและคูณเครื่องหมายของทั้งสองพิกัดโดยการจับคู่(i, j)ถึง(sign (i) m, sign (j) m)โดยที่m = min (| i | , | J |)

(-3,-3) (-2,-2) (-1,-1) ( 0, 0) (-1, 1) (-2, 2) (-3, 3)
(-2,-2) (-2,-2) (-1,-1) ( 0, 0) (-1, 1) (-2, 2) (-2, 2)
(-1,-1) (-1,-1) (-1,-1) ( 0, 0) (-1, 1) (-1, 1) (-1, 1)
( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0)
( 1,-1) ( 1,-1) ( 1,-1) ( 0, 0) ( 1, 1) ( 1, 1) ( 1, 1)
( 2,-2) ( 2,-2) ( 1,-1) ( 0, 0) ( 1, 1) ( 2, 2) ( 2, 2)
( 3,-3) ( 2,-2) ( 1,-1) ( 0, 0) ( 1, 1) ( 2, 2) ( 3, 3)

จะต้องรวมองค์ประกอบเมทริกซ์ที่สอดคล้องกับคู่เดียวกัน การตรวจสอบการสั่งซื้อของจำนวนเงินที่เราแผนที่แต่ละคู่(P, Q)เพื่อ+ p NQที่nคือจำนวนแถว / คอลัมน์ของM

-24 -16  -8   0   6  12  18
-16 -16  -8   0   6  12  12
 -8  -8  -8   0   6   6   6
  0   0   0   0   0   0   0
 -6  -6  -6   0   8   8   8
-12 -12  -6   0   8  16  16
-18 -12  -6   0   8  16  24

คำสั่งของผลรวมสอดคล้องกับคำสั่งของจำนวนเต็มที่สอดคล้องกับข้อสรุปของมัน

มันทำงานอย่างไร

LHŒRṗ2Ç€ḅLĠịFS€  Main link. Argument: M (matrix)

L                Compute n, the length (number of rows) of M.
 H               Halve it.
  ŒR             Symmetric range; map t to [-int(t), ..., 0, int(t)].
    ṗ2           Compute the second Cartesian power, yielding all pairs [i, j]
                 with -t ≤ i, j ≤ t.
      ǀ         Map the helper link over the resulting array of pairs.
         L       Yield n.
        ḅ        Unbase; map each pair [q, p] to (p + nq).
          Ġ      Group the indices of the resulting array of n² integers by their
                 corresponding values, ordering the groups by the values.
            F    Flatten M.
           ị     Index into the serialized matrix.
             S€  Compute the sum of each group.


AṂ×ṠṚ            Helper link. Argument: [i, j] (index pair)

A                Absolute value; yield [|i|, |j|].
 Ṃ               Minimum; yield m := min(|i|, |j|).
   Ṡ             Sign; yield [sign(i), sign(j)].
  ×              Multiply; yield [p, q] := [sign(i)m, sign(j)m].
    Ṛ            Reverse; yield [q, p].

5
มันยอดเยี่ยม
Uriel



2

APL (Dyalog) 60 ไบต์ *

ในการทำงานร่วมกันกับเพื่อนร่วมงานของฉันมาร์แชลล์

คำนำหน้าไม่ระบุชื่อแลมบ์ดา รับเมทริกซ์เป็นอาร์กิวเมนต์และส่งคืนเวกเตอร์ ถือว่า⎕IO ( I ndex O rigin) เป็นศูนย์ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ

{(,⍉{+/,(s×-×⍺)↓⍵×i∊¨⍨s←⌊⊃r÷2}⌺r⊢⍵)/⍨,(⊢∨⌽)=/¨i←⍳r←⍴⍵}

ลองออนไลน์!

{} แลมบ์ดานิรนาม เป็นอาร์กิวเมนต์ที่ถูกต้อง (เป็นอักษรที่ถูกต้องที่สุดของตัวอักษรกรีก):

⍴⍵ รูปร่างของการโต้แย้ง (รายการของสององค์ประกอบที่เหมือนกัน)

r← เก็บเป็นr(เหมือนในr ho)

 ทั้งหมดɩ ndices ของอาร์เรย์ของขนาดที่ว่าคือ(0 0), (0 1)...

i← เก็บในi(ในi ota)

=/¨ บูลีนที่พิกัดเท่ากัน (เช่นเส้นทแยงมุม)

() ใช้ฟังก์ชั่นนำหน้าโดยปริยายโดยไม่ระบุชื่อ:

   ย้อนกลับอาร์กิวเมนต์

  ⊢∨ หรือว่าด้วยอาร์กิวเมนต์ที่ไม่ได้แก้ไข

, ravel (ยืดลงในรายการอย่างง่าย)

 ตอนนี้เรามีหน้ากากบูลีนสำหรับแนวทแยงมุม

(... )/⍨ ใช้สิ่งนั้นเพื่อกรองสิ่งต่อไปนี้:

  ⊢⍵ ให้ผลผลิต (แยกต่างหากr) อาร์กิวเมนต์

  {}⌺r เรียกแลมบ์ดาแบบไม่ระบุชื่อต่อไปนี้ในแต่ละองค์ประกอบด้วยr-neighbourhood (เบาะด้วยศูนย์ตามต้องการ) เป็นอาร์กิวเมนต์ที่ถูกต้อง ( ) และรายการองค์ประกอบสองรายการของแถวที่มีเบาะจำนวนคอลัมน์คอลัมน์ (ลบด้านล่าง / ขวาไม่มีศูนย์) เป็นอาร์กิวเมนต์ที่เหลือ ( ):

   r÷2 หารrด้วยสอง

    เลือกองค์ประกอบแรก (เหมือนกัน)

    ชั้นมัน

   s← เก็บเป็นs(สำหรับs hape)

   i∊⍨¨ สำหรับแต่ละองค์ประกอบของiบูลีนถ้าsเป็นสมาชิกของมัน

   ⍵× คูณละแวกนั้นด้วย

   (... )↓ วางจำนวนแถวและคอลัมน์ต่อไปนี้ (ลบด้านล่าง / ขวา):

    ×⍺ Signum ของอาร์กิวเมนต์ซ้าย (เช่นทิศทางของการเติม)

    - ลบล้าง

     คูณsด้วย

   , ravel (ตรงเข้าไปในรายการ)

   +/ รวม (บวกลดลง)

ตอนนี้เรามีเมทริกซ์เต็มจำนวน แต่เราจำเป็นต้องกรองค่าทั้งหมดที่อ่านตามคอลัมน์

   transpose

  , ravel (ยืดลงในรายการอย่างง่าย)


* โดยนับเป็น ลองออนไลน์!⎕U233A

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