索引总和并去除我的矩阵


9

索引总和并去除我的矩阵

给定您喜欢的语言的matrix / 2d数组

输入:

  • 矩阵将始终具有奇数长度
  • 矩阵将永远是完美的正方形
  • 矩阵值可以是您语言中的任何整数(正数或负数)

例:

1  2  3  4  5  6  7
2  3  4  5  6  7  8
3  4  50 6  7  8  9
4  5  6 100 8  9  10
5  6  7  8 -9  10 11
6  7  8  9  10 11 12
7  8 900 10 11 12 0

定义:

  • “中心号码”定义为在左,右,上和下具有相同数量的数字的号码

在这种情况下,其最中间的100

  • “外壳”是其x和y索引为0或矩阵大小的数字的集合

1  2  3  4  5  6  7
2                 8
3                 9
4                 10
5                 11
6                 12
7  8 900 10 11 12 0

你的任务:

将每行和每列的值乘以它们从1开始的索引后,将其加到中心数

例如单行

4  5  6  7  8

每个数字

number * index + number * index.....

4*1 + 5*2 + 6*3 + 7*4 + 8*5 => 100

例:

 2 -3 -9  4  7  1  5  => 61
-2  0 -2 -7 -7 -7 -4  => -141
 6 -3 -2 -2 -3  2  1  => -10
 8 -8  4  1 -8  2  0  => -20
-5  6  7 -1  8  4  8  => 144
 1  5  7  8  7 -9 -5  => 10
 7  7 -2  2 -7 -8  0  => -60
                         |
78 65 60 45 -15 -89 10   => 154
                     |
                     => -16
  • 对于所有行和列,您可以组合这些值。
  • 现在您也将这些总和=> 154-16 = 138
  • 您将该数字添加到“中心数字”并删除矩阵的“外壳”

 0 -2 -7 -7 -7     => -88
-3 -2 -2 -3  2     => -15
-8  4 1+138 -8  2  => 395
 6  7 -1  8  4     => 69
 5  7  8  7 -9     => 26

19 69 442 30 -26

这样做直到最后得到一个数字

-2 -2 -3     => -15
 4  1060 -8  => 2100
 7 -1  8     => 29

27 2115 5
  • 加2114 + 2147至1060
  • 除去“外壳”并得到5321
  • 现在我们只剩下一个号码

这是输出!

测试用例:

-6

-6

-7 -1  8
-4 -6  7
-3 -6  6

2

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

-365

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

17611

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

-28473770

这是一个代码高尔夫挑战,因此字节数最少的程序将获胜


您是正确的,多数民众赞成在错字
downrep_nation

3
为什么负数会成为问题?我认为挑战不应该针对esolang进行调整,但也许反过来更合适
downrep_nation

@LuisMendo我认为这不是问题,规则“矩阵值可以是您的语言中的任何整数”对我来说意味着,如果您的语言没有负数,则不应该支持它们。
致命

实际上那是正确的。但随后的测试用例将无法正常工作
downrep_nation

2
“我不认为挑战应该适合世界语言,但反过来也许更合适”,应该刻在石头上
edc65

Answers:


4

MATL36 34字节

tnq?`t&+stn:*sytn2/)+ 7M(6Lt3$)tnq

输入是带有;行分隔符的2D数组

在线尝试!验证所有测试用例

说明

tnq       % Take input. Duplicate, get number of elements, subtract 1
?         % If greater than 0
  `       %   Do...while
    t     %     Duplicate
    &+    %     Sum matrix with its transpose
    s     %     Sum each column. Gives a row vector
    tn:   %     Vector [1 2 ...] with the same size
    *     %     Multiply element-wise
    s     %     Sum of vector. This will be added to center entry of the matrix
    y     %     Duplicate matrix
    tn2/  %     Duplicate, get half its number of elements. Gives non-integer value
    )     %     Get center entry of the matrix, using linear index with implicit rounding
    +     %     Add center entry to sum of previous vector
    7M    %     Push index of center entry again
    (     %     Assgined new value to center of the matrix
    6Lt   %     Array [2 j1-1], twice. This will be used to remove shell
    3$)   %     Apply row and col indices to remove outer shell of the matrix
    tnq   %     Duplicate, number of elements, subtract 1. Falsy if matrix has 1 entry
          %   End do...while implicitly. The loop is exited when matrix has 1 entry
          % End if implicitly
          % Display stack implicitly

4

Python 2.7,229字节

这是我第一次尝试这样的事情,因此希望我遵循所有规则进行提交。这只是一个将列表列表作为参数的函数。我觉得总和和清单理解力可能会有所缩短,但这对我来说太难了。:D

def r(M):
  t=len(M)
  if t==1:return M[0][0]
  M[t/2][t/2]+=sum(a*b for k in [[l[x] for l in M]for x in range(0,t)]for a,b in enumerate(k,1))+sum([i*j for l in M for i,j in enumerate(l,1)])
  return r([p[+1:-1]for p in M[1:-1]])

感谢Eastrkly Irk帮助我剃光了几个字节。


1
您可以删除运算符之间的几个空格(...) + sum([i*j...-> ...)+sum([i*j...),但总体来说,很棒的第一篇文章!!!
Rɪᴋᴇʀ

哦,错过了。谢谢!
杰里米(Jeremy)

1
此外,...]for ...作品。您可以像这样删除至少2个空格。(列表的末尾命中for循环)
Rɪᴋᴇʀ

3

C#,257个字节

这是一个 esolang的答案

void f(int[][]p){while(p.Length>1){int a=p.Length;int r=0;for(int i=0;i<a;i++)for(int j=0;j<a;j++)r+=(i+j+2)*p[i][j];p[a/2][a/2]+=r;p=p.Where((i,n)=>n>0&&n<p.Length-1).Select(k=>k.Where((i,n)=>n>0&&n<p.Length-1).ToArray()).ToArray();}Console.Write(p[0][0]);

松散:

void f(int[][]p)
    {
        while (p.Length>1)
        {
            int a=p.Length;
            int r=0; //integer for number to add to middle
            for (int i = 0; i < a; i++)
                for (int j = 0; j < a; j++)
                    r +=(i+j+2)*p[i][j]; //add each element to counter according to their 1 based index
            p[a / 2][a / 2] += r; //add counter to middle
            p = p.Where((i, n) => n > 0 && n < p.Length - 1).Select(k => k.Where((i, n) => n > 0 && n < p.Length - 1).ToArray()).ToArray(); //strip outer shell from array
        }
        Console.Write(p[0][0]); //print last and only value in array
    }

2
嘿,J不是一个esolang。
英里

如果不包含using System.Linq和,则不会编译using System。不过,我不确定规则是否要求这样做。
Yytsi

它不是一个完整的程序,它只是一个功能,所以据我所知还可以。我的意思是,我还需要在属性和makefile中包括App.config和所有字节吗?否
downrep_nation

@downrep_nation这很奇怪,因为我看到有人在源代码中仅将其包含在函数中并将其包含在乐谱中时将其包括在源中。
Yytsi

现在,当我考虑到这一点时,我认为您应该导入atleast System.Linq。其他需要导入才能使用某些功能的语言也要经过相同的过程,因此我认为假定每个模块都已用C#加载到内存中是不公平的。
Yytsi'6

2

J,66个字节

([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)

基于挑战中描述的过程的简单方法。

[:+/^:2#\*]+|:得到总和。]+(i.@,~=](]+*)<.@-:)@#*是一种将中心乘以总和的特别丑陋的方法。[:}:@}."1@}:@}.卸下外壳。可能有更好的方法来执行此操作。

用法

   f =: ([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)
   f _6
_6
   f _7 _1 8 , _4 _6 7 ,: _3 _6 6
2
   f 6 7 _2 5 1 , _2 6 _4 _2 3 , _1 _4 0 _2 _7 , 0 1 4 _4 8 ,: _8 _6 _5 0 2 
_365
   f 8 3 5 6 6 _7 5 , 6 2 4 _2 _1 8 3 , 2 1 _5 3 8 2 _3 , 3 _1 0 7 _6 7 _5 , 0 _8 _4 _9 _4 2 _8 ,8 _9 _3 5 7 8 5 ,: 8 _1 4 5 1 _4 8
17611
   f (13 13 $ _9 _7 2 1 1 _2 3 _7 _3 6 7 1 0 _7 _8 _9 _2 7 _2 5 4 7 _7 8 _9 8 _4 4 _1 0 1 5 _3 7 1 _2 _9 4 8 4 8 1 _1 0 7 4 6 _9 3 _9 3 _9 _6 _8 _4 _8 _9 2 1 1 _8 8 2 6 _4 _8 _5 1 1 2 _9 3 7 2 5 _6 _1 2 _8 _5 _7 _4 _9 _2 5 0 2 _4 2 0 _2 _3 _6 _3 2 _9 8 1 _5 5 0 _4 _1 _9 _9 _9 _8 0 _5 _7 1 _2 1 _4 _1 5 7 _6 _9 4 _2 8 7 _9 _5 3 _1 1 8 4 _6 6 _3 _4 3 5 6 8 _2 5 _1 _7 _9 _1 7 _9 4 6 7 6 _8 5 1 0 _3 0 _3 _2 5 _4 0 0 0 _1 7 4 _9 _4 2)
_28473770

2

Brachylog,114字节

{l1,?hh.|:{:Im:I:?:{[L:I:M]h:JmN,Ll:2/D(IJ,M{$\:?c:{:{:ImN,I:1+:N*.}f+.}a+.}:N+.;'(DIJ),N.)}f.}f:7a$\:7a&.}.
brbr.

老实说,我感到惊讶。至少我意识到Brachylog确实需要内置一个“该元素的更改值”…

用法示例:

?- run_from_file('code.brachylog', '[[0:_2:_7:_7:_7]:[_3:_2:_2:_3:2]:[_8:4:139:_8:2]:[6:7:_1:8:4]:[5:7:8:7:_9]]', Z).
Z = 5321 .

说明

更具可读性(且更长)的版本:

{l1,?hh.|:2f:7a$\:7a&.}.
:Im:I:?:3f.
[L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.)
$\:?c:5a+.
:6f+.
:ImN,I:1+:N*.
brbr.

我只是大致解释每个谓词(即除第一行即主谓词+谓词1以外的每一行)的作用:

  • 主谓词+谓词1 {l1,?hh.|:2f:7a$\:7a&.}.:如果输入只有一行,则结束算法并返回唯一值。否则找到满足谓词2的所有行,然后将谓词7应用于结果矩阵,然后将谓词7应用于转置,然后递归调用。

  • 谓词2 :Im:I:?:3f.:取I矩阵的第t行,找到满足谓词3的该行的所有值,并使用I和作为附加输入。

  • 谓词3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.)L是行,I是行的索引,M是矩阵。N是的J第th个元素L。如果L被2除的长度等于IJ,则输出为N矩阵上谓词4的结果的和。否则输出为just N。该谓词本质上将重新创建矩阵,但将中心元素添加到总和中。

  • 谓词4 $\:?c:5a+.:在矩阵的每一行和每一列上应用谓词5,将输出与结果之和统一。

  • 谓词5 :6f+.:在行中找到谓词6的所有有效输出,并将输出与结果列表的总和统一。

  • 谓词6 :ImN,I:1+:N*.:  N是该I行的th值,用统一输出N * (I+1)

  • 谓词7 brbr.:删除矩阵的第一行和最后一行。


2

APL,56个字符

{{1 1↓¯1 ¯1↓⍵+(-⍴⍵)↑(⌈.5×⍴⍵)↑+/(⍵⍪⍉⍵)+.×⍳≢⍵}⍣(⌊.5×≢⍵)⊣⍵}

用英语:

  • ⍣(⌊.5×≢⍵) 重复“将尺寸的大小四舍五入”的次数
  • (⍵⍪⍉⍵)+.×⍳≢⍵ 矩阵的内积及其与索引向量的转置
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ 转换结果填充为0的矩阵
  • 1 1↓¯1 ¯1↓ 去除外壳
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.