Bir matris katlayın!


13

Bir matris verildiğinde, X oluşturmak için değerlerini yukarı / aşağı veya sola / sağa toplayın, katlayın ve listeyi döndürün. Algoritmayı burada açıklıyorum:

Algoritma

Girişiniz, dilinizin makul sayısal kapasitesi dahilinde tek boyutlu kare tam sayı matrisi olacaktır.

Örnek olarak aşağıdaki matrisi ele alalım:

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

İlk olarak, her sayıyı ana diyagonal veya antidiagonal olan en yakın sayıya ekleyin. Yani, matrisi ana diyagonal ve antidiagonal boyunca dört bölüme ayırın ve sonra her bölümdeki tüm sayıları merkeze doğru toplayın, şöyle:

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

Bu adım aşağıdaki sonucu verir:

1        1
  5    5
    39
  17  15
0        5

Daha sonra, X'i düzleştirip öğeleri ilk önce sol üst ve sol alt en son ile iç içe geçirerek katlarız. Bu, aşağıdaki sonucu verir:

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

Bunu ana diyagonal uzanma ve saat yönünün tersine döndürme olarak hayal edebilirsiniz.

Bu nihai sonuçtur.

Meydan okuma

Bu algoritmayı uygulayın. Standart boşluklar geçerlidir. Tüm makul I / O formatları kabul edilebilir.

Test Durumları

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 değil" bir matris test durumu ekleyebilir misiniz?
totallyhuman

1
@icrieverytim buraya
HyperNeutrino

Yanıtlar:


7

JavaScript, 113 bayt

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)


Hmm .. neden ~~? Birbirlerini nötralize ederler, bu yüzden onlara ihtiyaç yoktur.
Kevin Cruijssen

2
@KevinCruijssen ~~undefined==0, bu yüzden daha golfçü (a[q]||0).
Neil

@Neil Ah, düşünmemişti undefined. Tsh kullanılan test davasını kopyaladığımda, olmadan çalıştı fark ettim ~~. Ve ~~xbenzer şekilde birbirini -(-x)nötralize ettiğinden, bir şekilde oraya kazara konulduğunu düşündüm. Düzeltme için teşekkürler.
Kevin Cruijssen

5

Jöle , 25 23 21 bayt

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

Çevrimiçi deneyin!

Alternatif sürüm, 19 bayt

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

Bu işe yaramadı çünkü Ġiç içe diziler için yanlış davrandılar. Tek fark, Nasıl çalışır bölümünde belirtilen [q, p] çiftlerinin , sıralamadan önce onları p + nq ile eşlemek yerine sözlükbilimsel olarak sıralanmasıdır.

Çevrimiçi deneyin!

Arka fon

Öğelerini koordinatlarla değiştirerek, sola ve aşağı doğru artırarak ve matrisin ortasına (0, 0) yerleştirerek başlarız .

7x7 M matrisi için aşağıdaki koordinatları elde ederiz.

(-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)

Şimdi her bir koordinat çiftinin minimum mutlak değerini hesaplıyor ve her iki koordinat işaretini de onunla çarpıyoruz, (i, j) ile (işaret (i) m, işaret (j) m) 'yi eşleştiriyoruz , burada 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)

Aynı çifte karşılık gelen matris elemanlarının toplanması gerekir. Toplamlar sırasını belirlemek için, her bir çifti bir haritada (p, q) için p + nq , burada n, sıraları / sütun sayısıdır 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

Toplamların sırası, tamsayıların sırasına karşılık gelen tamsayılara karşılık gelir.

Nasıl çalışır

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
bu harika.
Uriel

5

Python, 159 158 bayt

def f(m):l=len(m)-1;r=range(1,l);return m[0][::l]+f([[sum(m[x][1%y*y:(y>l-2)-~y])+m[0][y]*(x<2)+m[l][y]*(x>l-2)for y in r]for x in r])+m[l][::l]if l else m[0]

Çevrimiçi deneyin!


1
y+1+(y>l-2)olabilir (y>l-2)-~y.
Jonathan Frech


2

APL (Dyalog) , 60 bayt *

Meslektaşım Marshall ile işbirliği içinde .

Anonim önek lambda. Matrisi argüman olarak alır ve vektörü döndürür. Birçok sistemde varsayılan olarak ⎕IO ( I ndex O rigin) sıfır olduğunu varsayar .

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

Çevrimiçi deneyin!

{} Anonim lambda; doğru argüman (Yunan alfabesinin en sağdaki harfi olarak):

⍴⍵ argümanın şekli (iki özdeş öğenin listesi)

r← olarak depola r( r ho'da olduğu gibi)

 Tüm ɩ o boyutta bir dizinin ndices, yani (0 0), (0 1)...

i← mağazada i( i ota'da olduğu gibi)

=/¨ Koordinatların eşit olduğu Boole (yani köşegen)

() Bu anonim zımni önek fonksiyonunu uygulayın:

   tartışmayı tersine çevirmek

  ⊢∨ VEYA değiştirilmemiş argümanla

, ravel (basit listeye düzelt)

 Şimdi köşegenler için bir Boole maskesi var.

()/⍨ Aşağıdakileri filtrelemek için bunu kullanın:

  ⊢⍵rargümanı  ver (ayırmak )

  {}⌺r Her öğe üzerinde r-onighhoodhood (gerektiği gibi sıfırlarla doldurulmuş) ile sağ argüman ( ) olarak adlandırılan anonim infix lambda'yı ve yastıklı satırların, sütunların (alt / sağ için negatif, hiçbiri için sıfır) iki öğe listesini arayın. sol argüman olarak ( ):

   r÷2 böl rikisiyle

    ilk elemanı seç (aynılar)

    döşeyin

   s← olarak kaydet s( s hape için)

   i∊⍨¨ her elemanı için i, eğer Boolean süyesi ise

   ⍵× mahalleyi onunla çarp

   ()↓ Aşağıdaki satır ve sütun sayısını bırakın (alt / sağ için negatif):

    ×⍺ Sol argümanın işareti (örneğin, küreklerin yönü)

    - negate

     çarpın sbununla

   , ravel (listeye düzelt)

   +/ toplam (artı azaltma)

Şimdi tam bir matris matrisimiz var, ancak okunan tüm değerleri sütun şeklinde filtrelememiz gerekiyor.

   devrik

  , ravel (basit listeye düzelt)


* Olarak sayarak ⎕U233A . Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.