转换矩阵


16

编写将矩阵A(矩阵的维的最大值为100)转换为新矩阵B的程序或函数。新矩阵B的每个元素都是矩阵A对应元素的正邻居之和。 。

仅考虑四个正交方向上的邻居,并且边缘不环绕。

输入示例:

 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],是的,一个数字将被负数包围。
2016年

我们可以通过什么方式进行输入?
Maltysen '16

1
@Doorknob一个空数字集的总和为
0。– orlp

我猜@Maltysen STDIN。
2016年

Answers:


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 2016年

好吧,我怀疑这是否可以击败:p
Adnan

@Adnan在Python中不是
R. Kap

4
这个家伙在电话里做了这个,我在这里,不得不奉献一些时间来尝试解决其中的一些问题……
R. Kap 2016年

@ R.Kap我的意思是“在电话上键入”(不是“在电话上交谈时键入”)。对不起我的英语:-)
路易斯·门多

7

八度,46 44 40字节

@flawr节省了2个字节
@LuisMendo的内核比@flawr的内核短4个字节。

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

就像@LuisMendo的答案一样!只有更少...高尔夫球。

您可以在ideone上看到它。


COMON,我正要发布这个确切答案。
瑕疵的2016年

1
您可以使用保存6个字节,(x='aba')~=x'而不是使用[0 1 0;1 0 1;0 1 0]
Luis Mendo

2
@LuisMendo这是什么巫术?
烧杯

1
@cat .*是逐元素矩阵乘法。在MATLAB中,布尔矩阵基本上是无类型的,被视为数字。所以M>0只是充当面具。
烧杯2016年

1
(x='aba')~=x'。太棒了@Luis!
Stewie Griffin

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

接受并返回一个二维数组。

编辑:当我发现默认参数在传递显式未定义的值(例如,从数组末尾索引时)有效时,将完全重写。



@Socialz Neils版本较旧。
瑕疵的2016年

@flawr某些人可能会按投票顺序而不是发布日期顺序查看此消息链,因此我评论了相关答案。这个比用户的字节长4个字节。
ascx

因此,您基本上想刊登其他帖子?
瑕疵的2016年

@Socialz多了4个字节,是;-)
Neil

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


1

带有SciPy的Python,127个字节

from scipy.signal import*
lambda A,r=range(3):convolve2d([[x*(x>0)for x in y]for y in A],[[0,1,0],[1,0,1],[0,1,0]],mode='same')

这将使用Luis Mendo方法计算结果。

在线尝试


0

Mathcad,字节

对3x3内核使用过滤后的数组的标准2D卷积。还添加了带有负元素和和对角线内核的变体,作为对程序没有运行最少字节的部分补偿。

在此处输入图片说明


由于尚未确定Mathcad得分,因此没有输入字节数。但是,使用键盘等效性,假设矩阵输入不计入总数,则为28个字节的区域。

请注意,在上图中,您所看到的正是在Mathcad中输入和显示解决方案的方式。


0

果冻,23 20 18字节

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

在线尝试!

算法

假设只有一行:[1,2,3,4]。

假设A是前置零的结果,即[0,1,2,3,4]。

B是删除第一项(即[2,3,4])的结果。

然后将最终结果简单地进行A + B向量化,然后删除最后一项。

现在,算法是将此算法应用于每一行以及每一列,然后找到它们的矢量化总和。

到每一列?我以为果冻不支持这个...

你是对的。因此,我将其换位,应用于每行,然后再次换位。

消除负数的算法

在这里,您只需将每个数字的绝对值相加即可。它可以有效消除负数,同时将每个正数加倍。然后,将整个矩阵减半。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.