行列を変換する


16

行列A(行列の次元の最大値が100)が新しい行列Bに変換されるプログラムまたは関数を記述します。新しい行列Bの各要素は、行列Aの対応する要素の正の隣接要素の合計です。 。

直交する4方向の近傍のみが考慮され、エッジはラップアラウンドしません。

入力例:

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

出力:

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

ルール:

  • 入力として整数を使用します。
  • これはであるため、バイト単位の最短コードが優先されます。

3
プログラミングパズルとコードゴルフへようこそ!ここでのすべての課題には、どのソリューションが勝つべきかを決定的に決定するために、客観的な勝利基準が必要です。通常、これはcode-golfであり、バイト単位の最短コードが優先されます。さらに、有効な入力/出力形式(2d配列?単一文字列?など)を指定すると役立ちます。最後に、カバーしていないエッジケースがいくつかあります。たとえば、数値が負の数値のみで囲まれることはありますか?
ドアノブ

ありがとうございました。[100] [100]までで、はい、数字は負の数字で囲まれます。
MT

どのような方法で入力できますか?
マルティセン

1
@Doorknob空の数値セットの合計は0です。
orlp16年

@Maltysen STDIN、私は推測する。
MT

回答:


10

MATL、9バイト

t0>*1Y6Z+

オンラインでお試しください!

説明

入力行列は、負の値が0になるように適切なマスクによって乗算されます。次に、2D畳み込みが適用されて、各エントリの近傍の合計が計算されます。

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
電話はI / Oとして許可されていますか?
orlp

それでは、これが勝てるのかどうかは疑わしい:p-
アドナン

@AdnanでのPythonそうではありません
R.ガプス

4
この男はすること、ここで私は電話でしばらくやった、と捧げる ...これらの問題の一部を解決しようとする私の時間の一部を
R.ガプス

@ R.Kap「電話で入力する」ことを意味しました(「電話で話している間に入力する」ではありません)。私の英語についてすみません:-)
ルイスメンドー

7

オクターブ、46 44 40バイト


@flawrのおかげで2バイト節約されました @LuisMendoのカーネルは@flawrのカーネルより4バイト短くなりました。

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

同じようLuisMendoさん@答え!少ない...ゴルフ。

こちらideoneで見ることができます。


COMON、私はちょうどこの正確な答えを投稿しようとしていました。
flawr

1
(x='aba')~=x'代わりに[0 1 0;1 0 1;0 1 0]
ルイスメンドー

2
@LuisMendoこの魔術とは何ですか?
ビーカー

1
@cat .*は、要素ごとの行列乗算です。ブール行列は、MATLABのほとんどが型なしであり、数値として扱われます。だから、M>0ちょうどマスクとして機能しています。
ビーカー

1
(x='aba')~=x'。それはすごい@Luisです!
スティーヴィーグリフィン

2

JavaScript(ES6)、99 94バイト

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

2次元配列を受け入れて返します。

編集:配列の末尾からインデックスを作成するときなど、明示的に未定義の値を渡すときにデフォルト引数が機能することを発見したとき、完全に書き直されました。



@Socialz Neilsのバージョンは古いです。
-flawr

@flawr投稿日順ではなく投票順でこのメッセージチェーンを見ている人がいるかもしれないので、その関連する答えをコメントしました。これはユーザーのものより4バイト長くなります。
ascx

あなたは基本的に他の投稿を宣伝したいですか??
-flawr

@Socialzは4バイト長かった、はい;
ニール

2

JavaScript(ES6)、95 93バイト

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、バイト

3x3カーネルでフィルター処理された配列の標準2D畳み込みを使用します。負の要素の合計と対角カーネルを持つバリアントも、最小バイトで実行されていないプログラムの部分補正として追加されました。

ここに画像の説明を入力してください


Mathcadスコアリングがまだ決定されていないため、バイトカウントが入力されていません。ただし、キーボード等価を使用すると、マトリックス入力が合計にカウントされないと仮定すると、28バイトの領域になります。

上記の画像に表示されているのは、Mathcadでソリューションがどのように入力および表示されているかです。


0

ゼリー、23 20 18バイト

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

オンラインでお試しください!

アルゴリズム

[1、2、3、4]という1つの行のみがあるとします。

Aがゼロを追加した結果、つまり[0,1,2,3,4]であるとしましょう。

Bは、最初のアイテム、つまり[2,3,4]を削除した結果です。

その後、最終結果は単純にA + Bベクトル化され、最後のアイテムが削除されます。

さて、アルゴリズムはこれをすべての行とすべての列に適用し、ベクトル化された合計を見つけることです。

各列に!?Jellyはこれをサポートしていないと思います...

あなたが正しい。したがって、私はそれを転置し、各行に適用してから、再度転置しました。

負の数を削除するためのアルゴリズム

ここでは、各番号に絶対値を追加します。負の数を効果的に排除しながら、正の数をそれぞれ2倍にします。次に、マトリックス全体を半分にします。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.