Bir matrisi dönüştürme


16

Bir matris A'nın (matrisin maksimum boyutlarının 100 olduğu) yeni bir matris B'ye dönüştürüldüğü bir program veya fonksiyon yazın. Yeni matris B'nin her elemanı, A matrisinin karşılık gelen elemanının pozitif komşularının toplamıdır. .

Sadece dört dikey yöndeki komşular dikkate alınır ve kenarlar etrafına sarılmaz.

Örnek girdi:

 1  2  3
 4 -1 -2
-3 -4 10
 1  2 10

Çıktı:

 6  4  2
 1  6 13
 5 12 10
 2 11 12

Kurallar:

  • Giriş olarak tamsayılar kullanın.
  • Bu bir , bu nedenle bayttaki en kısa kod kazanır.

3
Programlama Bulmacaları ve Kod Golf hoş geldiniz! Buradaki tüm zorluklar, hangi çözümün kazanması gerektiğini tartışmasız bir şekilde belirlemek için nesnel bir kazanma kriteri gerektirir. Genellikle, bu kod-golf , yani bayttaki en kısa kodun kazanacağı anlamına gelir. Ayrıca, geçerli giriş / çıkış formatlarını (2d dizi? Tek dize? Vb.) Belirtmek de yararlı olacaktır. Son olarak, kapsamadığınız bazı uç durumlar vardır; örneğin, bir sayı yalnızca negatif sayılarla çevrelenecek mi?
Kapı tokmağı

Teşekkür ederim. Sanırım [100] [100] 'e kadar ve evet, bir sayı negatif sayılarla çevrelenecek.
MT

Hangi yollarla girdi alabiliriz?
Maltysen

1
@Doorknob Boş bir sayı kümesinin toplamı 0
orlp

@Maltysen STDIN, sanırım.
MT

Yanıtlar:


10

MATL , 9 bayt

t0>*1Y6Z+

Çevrimiçi deneyin!

açıklama

Giriş matrisi, negatif değerleri 0'a eşit yapmak için uygun bir maske ile çarpılır. Daha sonra, her bir girişin komşularının toplamını hesaplamak için bir 2D evrişim uygulanır.

t     % Take input implicitly: 2D array. Duplicate
0>    % Is each entry positive? This gives a mask of positive values
*     % Multiply: set negative values of input array to zero
1Y6   % Predefined literal: [0 1 0; 1 0 1; 0 1 0]
Z+    % 2D convolution preserving size. Implicitly display

4
Telefonlara G / Ç olarak izin veriliyor mu?
orlp

Öyleyse, bu yenilebilirse şüphe ediyorum: p
Adnan

@Adnan Python'da değil
R. Kap

4
Bu adam zorunda, ben burada telefonu bu süre yaptı ve adamak ... Bu sorunların bazılarını çözmeye çalışırken benim zaman bazı
R. Kap

@ R.Kap "Telefondan yazdım" ("telefonda konuşurken yazmadım") demek istedim. İngilizcem için üzgünüm :-)
Luis Mendo

7

Oktav, 46 44 40 bayt

@Flawr
@ LuisMendo'nun çekirdeği sayesinde 2 bayt kaydedildi @ flawr en 4 bayt daha kısa oldu.

@(M)conv2(M.*(M>0),(x='aba')~=x','same')

Tıpkı @ LuisMendo'nun yanıtı gibi! Sadece daha az ... golf.

Burada ideone'de görebilirsiniz .


COMON, tam olarak bu cevabı göndermek üzereydim.
flawr

1
Kaydetmek (x='aba')~=x'yerine 6 bayt kullanabilirsiniz[0 1 0;1 0 1;0 1 0]
Luis Mendo

2
@LuisMendo Bu büyücülük nedir?
beher

1
@cat .*eleman-bilge matris çarpımıdır. Boole matrisi, MATLAB büyük ölçüde tipsizdir, sayısal olarak kabul edilir. Yani M>0sadece bir maske gibi davranmaktadır.
beher

1
(x='aba')~=x'. Bu sadece @Luis harika!
Stewie Griffin

2

JavaScript (ES6), 99 94 bayt

a=>a.map((b,i)=>b.map((_,j)=>(g=(c=j,k=j)=>c[k]>0&&c[k])(a[i-1])+g(a[i+1])+g(b,j-1)+g(b,j+1)))

İki boyutlu bir diziyi kabul eder ve döndürür.

Düzenleme: Tamamen tanımlanmamış bir değeri ilettiğinizde, örneğin bir dizinin sonunu dizine eklediğinizde, varsayılan bağımsız değişkenlerin çalıştığını keşfettiğimde tamamen yeniden yazılır.



@Socialz Neils sürümü daha eski.
flawr

@flawr Bazı insanlar bu mesaj zincirine gönderi sırasına göre değil, oy sırasına göre bakıyor olabilirler, bu yüzden ilgili cevabı yorumladım. Bu, kullanıcınınkinden 4 bayt daha uzun.
ascx

Yani temelde diğer yazı tanıtımı istiyorum ??
flawr

@Socialz 4 byte daha uzun, evet ;-)
Neil

2

JavaScript (ES6), 95 93 bayt

document.write("<pre>"+(

m=>m.map((a,r)=>a.map((_,c)=>(s=(x,y=0)=>(n=(m[r+y]||0)[c+x])>0&&n)(1)+s(-1)+s(0,1)+s(0,-1)))

)([[  1,  2,  3 ],
   [  4, -1, -2 ],
   [ -3, -4, 10 ],
   [  1,  2, 10 ]])

.join`\n`)



0

Mathcad, bayt

3x3 çekirdeğe sahip filtrelenmiş dizinin standart 2D evrişimini kullanır. Negatif eleman toplamları ve çapraz çekirdeğe sahip varyantlar, programın en az bayt için çalışmadığı için parça telafisi olarak eklenir.

resim açıklamasını buraya girin


Mathcad puanlaması olarak girilen bayt sayısı henüz belirlenmedi. Ancak, klavye eşdeğeri kullanılarak, matris girişinin toplamı saymadığı varsayılarak 28 baytlık bölgedir.

Yukarıdaki resimde gördüğünüz şeyin, çözümün Mathcad'da tam olarak nasıl girildiği ve görüntülendiğini unutmayın.


0

Jöle, 23 20 18 bayt

0;+ḊṖ
ZÇ€Z+Ç€
+AHÇ

Çevrimiçi deneyin!

Algoritma

Diyelim ki sadece bir satır var: [1,2,3,4].

Diyelim ki A sıfırı önermenin bir sonucudur, yani [0,1,2,3,4].

B, ilk öğenin çıkarılmasının sonucudur, yani [2,3,4].

Daha sonra nihai sonuç basitçe A + B vektörleştirilir, daha sonra son öğeyi kaldırılır.

Şimdi, algoritma bunu her satıra ve her sütuna uygulamak, sonra bunların vektörleştirilmiş toplamını bulmaktır.

Her sütuna mı ?! Jelly'in bunu desteklemediğini sanıyordum ...

Haklısın. Bu nedenle, onu aktardım, her satıra uyguladım, sonra tekrar aktardım.

Negatif sayıları kaldırmak için algoritma

Burada, her sayıya mutlaklarını eklersiniz. Her pozitif sayıyı ikiye katlarken negatif sayıları etkili bir şekilde ortadan kaldırır. Sonra, tüm matrisi yarıya indirin.


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.