减去折矩阵


21

挑战:

给定一个NxN矩阵,其中和八个不同的“折叠选项”之一,输出带有减去值的2D数组/列表。N2

八个折叠选项是:从左到右;从左到右。右到左; 从上到下; 从下到上 从左上到右下; 从右上到左下; 从左下到右上;从右下到左上。

分步示例:

输入矩阵:

[[ 1, 3, 5, 7],
 [ 0, 8, 6, 4],
 [ 1, 1, 1, 1],  (a'th row in the explanation below)
 [ 1,25, 0,75]]

使用从上到下的折叠选项,我们将输出以下结果:

[[ 1,-7,-5,-3],
 [ 0,22,-5,68]]

为什么?我们从上到下折叠。由于矩阵尺寸是均匀的,因此我们没有中间层可以保持原样。的 “第i行将由被减去第i行”(本来 “第i行用于奇数维矩阵); 因此成为。然后,将第行减去第行(对于奇数维矩阵,将是第行);因此成为。a[1, 1, 1, 1](a1)(a2)[1-0, 1-8, 1-6, 1-4][1, -7, -5, -3](a+1)[1, 25, 0, 75](a2)(a3)[1-1, 25-3, 0-5, 75-7][0, 22, -5, 68]

使用折叠选项bottomright-to-topleft(上面具有相同的输入矩阵),我们将输出以下结果:

[[-74,  2,  1,  7],
 [  0,  7,  6],
 [-24,  1],
 [  1]]

通过以下折减:

[[1-75,  3-1,  5-4,    7],
 [ 0-0,  8-1,    6],
 [1-25,    1],
 [   1]]

挑战规则:

  • 您可以[A-Za-z]在范围内使用八个不同的字母或数字作为折叠选项。数字或可能是最常见的选择,但如果你想为一些聪明的计算范围内使用不同的号码,随意这样做。请说明您在答案中使用了哪些折叠选项。[99,99][1..8][0..7]
  • 输入矩阵将始终是一个正方形NxN矩阵,因此您不必处理任何矩形NxM矩阵。也将始终至少为2,因为无法折叠空白矩阵或1x1矩阵。N
  • 矩阵的输入将始终包含范围内的非负数(因此,输出中的数字将在范围内)。[0,999][999,999]
  • 通过(反)对角折叠或奇数维垂直/水平折叠,中间的“层”将保持不变。
  • I / O是灵活的。可以是2D数组/整数列表;可以以空格和换行符分隔的字符串返回或打印;您可以修改输入矩阵并替换应该使用的数字null或超出[-999, 999]范围的数字以表示它们已消失;等等等

一般规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于具有默认I / O规则的答案,因此允许您使用STDIN / STDOUT,具有适当参数的函数/方法以及返回类型的完整程序。你的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接(即TIO)。
  • 另外,强烈建议为您的答案添加说明。

测试用例:

输入矩阵1:

Input-matrix (for the following eight test cases):
[[ 1, 3, 5, 7],
 [ 0, 8, 6, 4],
 [ 1, 1, 1, 1],
 [ 1,25, 0,75]]

Input-folding option: left-to-right
Output: [[2,6],[-2,4],[0,0],[-25,74]]

Input-folding option: right-to-left
Output: [[-6,-2],[-4,2],[0,0],[-74,25]]

Input-folding option: top-to-bottom
Output: [[1,-7,-5,-3],[0,22,-5,68]]

Input-folding option: bottom-to-top
Output: [[0,-22,5,-68],[-1,7,5,3]]

Input-folding option: topleft-to-bottomright
Output: [[7],[6,-1],[1,-7,-2],[1,24,0,74]]

Input-folding option: topright-to-bottomleft
Output: [[1],[-3,8],[-4,-5,1],[-6,21,-1,75]]

Input-folding option: bottomleft-to-topright
Output: [[1,3,4,6],[8,5,-21],[1,1],[75]]

Input-folding option: bottomright-to-topleft
Output: [[-74,2,1,7],[0,7,6],[-24,1],[1]]

输入矩阵2:

Input-matrix (for the following eight test cases):
[[17, 4, 3],
 [ 8, 1,11],
 [11, 9, 7]]

Input-folding option: left-to-right
Output: [[4,-14],[1,3],[9,-4]]

Input-folding option: right-to-left
Output: [[14,4],[-3,1],[4,9]]

Input-folding option: top-to-bottom
Output: [[8,1,11],[-6,5,4]]

Input-folding option: bottom-to-top
Output: [[6,-5,-4],[8,1,11]]

Input-folding option: topleft-to-bottomright
Output: [[3],[1,7],[11,1,-10]]

Input-folding option: topright-to-bottomleft
Output: [[17],[4,1],[8,-2,7]]

Input-folding option: bottomleft-to-topright
Output: [[17,-4,-8],[1,2],[7]]

Input-folding option: bottomright-to-topleft
Output: [[10,-7,3],[-1,1],[11]]

折叠选项的顺序重要吗?
过期的数据

另外,我们能否仅输出所有可能折叠的8xNxN矩阵?
过期的数据

该测试样本是否应该翻转输入折叠选项:从下到上输出:[[-1,7,5,3],[0,-22,5,-68]]?
OrangeCherries

同样对于矩阵2,17-11是6,不是4?
OrangeCherries

@ExpiredData如规则中所指定,您可以使用A-Za-zrange中的任何字母或任何整数[-999,999],因此顺序无关紧要。抱歉,但是您必须根据输入输出正确的折页,因此不允许输出全部八折。
凯文·克鲁伊森

Answers:


5

八度256个 248 244 248字节

m=d=x=@(a,b=1)rot90(a,b)
y=@(a,b=2)flip(a,b)
z=@(a,b=1)tril(a+1e3,-1)+a-x(y(tril(a)))+b*diag(diag(a))
f=@(a,b){m=((a-y(a))(:,1:(d=size(a,2)/2))),-y(m),m=y(x((a=x(a))-y(a)))(d+1:end,:),y(m,1),-y(z(a,-1)),x(z(x(a,2)),2),z(a=x(a,3)),x(z(x(a,2)),2)}{b}

在线尝试!

路易斯·门多Luis Mendo)-2个字节(并且有点整理)

由于TB的校正,+ 2个字节

1-索引操作,用于从1到8的b值:

R-L
L-R
B-T
T-B
BR-TL
TR-BL
BL-TR
TL-BR

这让我头疼,我待会儿打高尔夫球。


建议rows(a)而不是size(a,2)
ceilingcat

5

果冻 39  34 字节

通过结合两个“功能”中的一些功能,可能会进一步打高尔夫球。
...是的: -5感谢NickKennedy!

ṃ“Z“Ṛ“U“ “ŒDṙL ZZṚ”ŒḄFḲj“ŒH_Ṛ}¥/”v

在线尝试!

接受整数(指令)和数字列表(矩阵)的二元链接。

[99,99]

           Instruction  |  integer
------------------------+---------
         left-to-right  |     4
         right-to-left  |    14
         top-to-bottom  |     9
         bottom-to-top  |    39
topleft-to-bottomright  |    65
topright-to-bottomleft  |    15
bottomleft-to-topright  |    10
bottomright-to-topleft  |     0

怎么样?

该链接创建了Jelly代码,然后使用M作为输入对其进行求值...

ṃ“Z“Ṛ“U“ “ŒDṙL ZZṚ”ŒḄFḲj“ŒH_Ṛ}¥/”v - Link: integer, I; matrix, M
 “Z“Ṛ“U“ “ŒDṙL ZZṚ”                - list of lists of characters = ["Z", "Ṛ", "U", " ", "ŒDṙL ZZṚ"]
ṃ                                  - base decompress (I) using those lists as the digits
                                   -  ...i.e. convert to base 5 and then convert the digits:
                                   -          [1,2,3,4,0] -> ["Z", "Ṛ", "U", " ", "ŒDṙL ZZṚ"]
                   ŒḄ              - bounce
                                   -  ...e.g. [a, b, c] -> [a, b, c, b, a]
                     F             - flatten to a list of characters
                      Ḳ            - split at spaces
                       j           - join with:
                        “ŒH_Ṛ}¥/”  -   list of characters = "ŒH_Ṛ}¥/"
                                 v - evaluate as Jelly code with an input of M

然后,这八个选项分别为:

left-to-right           (4): ŒH_Ṛ}¥/
right-to-left          (14): ṚŒH_Ṛ}¥/Ṛ
top-to-bottom           (9): ZŒH_Ṛ}¥/Z
bottom-to-top          (39): ZṚŒH_Ṛ}¥/ṚZ
topleft-to-bottomright (65): ṚUŒDṙLŒH_Ṛ}¥/ZZṚUṚ
topright-to-bottomleft (15): UŒDṙLŒH_Ṛ}¥/ZZṚU
bottomleft-to-topright (10): ṚŒDṙLŒH_Ṛ}¥/ZZṚṚ
bottomright-to-topleft  (0): ŒDṙLŒH_Ṛ}¥/ZZṚ

这些(0和除外4)将M使用Z(换位),(反向)和U(反向)中的一些进行转换;然后是两个函数之一(请参见下文),然后是设置转换的逆过程(如果有),以代码的相反过程实现。

内部两个功能是:

ŒH_Ṛ}¥/ - Function A: Fold bottom-to-top: matrix, M
ŒH       - split M into two equal lists of rows (first half bigger by 1 if need be)
      / - reduce by:
     ¥  - last two links as a dyad:
    }   -  using the right argument (i.e. second half):
   Ṛ    -    reverse
  _     -  subtract

ŒDṙLŒH_Ṛ}¥/ZZṚ - Function B: Fold topright-to-bottomleft: matrix, M
ŒD             - diagonals of M
  ṙ            - rotate left by:
   L           -   length of M (puts them in order from bottom left most)
    ŒH_Ṛ}¥/    - same action as calling Function A on the diagonals
           Z   - transpose
            Z  - transpose
             Ṛ - reverse

1
很好,我想知道是否有人会使用稍微灵活的输入选项!很高兴了解如何使用这些值对Jelly代码进行便利的基础转换,以评估所需的折叠率。:)
凯文·克鲁伊森

使用答案中的一些代码,并重用这两个代码的通用代码,这是一个34字节的代码:tio.run
Nick Kennedy

如果允许使用16位整数,则长度可能会更短
Nick Kennedy

使用16位整数作为选择哪个折叠的参数的非竞争性
Nick Kennedy

@NickKennedy-谢谢。我喜欢拆分并加入!我必须稍后再返回以完全更改描述。
乔纳森·艾伦

3

JavaScript(ES6), 149 ...  133128 字节

(matrix)(d)0d7NaN

0=1=2=3=4=5=6=7=

m=>d=>m.map((r,y)=>r.map((v,x)=>v-=(w=m.length+~y)-(p=[x+x-y,y,x,q=w+y-x][d&3])&&[r[q],m[w][x],m[q][w],m[x][y]][d>3^p>w?d&3:m]))

在线尝试!

已评论

m => d =>                   // m[] = matrix; d = direction
  m.map((r, y) =>           // for each row r[] at position y in m[]:
    r.map((v, x) =>         //   for each value v at position x in r[]:
      v -=                  //     subtract from v:
        (                   //       define w as:
          w = m.length + ~y //         the width of input matrix - y - 1
        ) - (               //       and compare it with
          p = [             //       p defined as:
            x + x - y,      //         2 * x - y for vertical folding
            y,              //         y for horizontal folding
            x,              //         x for diagonal folding
            q = w + y - x   //         q = w + y - x for anti-diagonal folding
          ][d & 3]          //       using d MOD 4
        ) &&                //       if p is equal to w, leave v unchanged
        [                   //       otherwise, subtract:
          r[q],             //         r[q] for vertical folding
          m[w][x],          //         m[w][x] for horizontal folding
          m[q][w],          //         m[q][w] for diagonal folding
          m[x][y]           //         m[x][y] for anti-diagonal folding
        ][                  //       provided that we're located in the target area:
          d > 3 ^           //         test p < w if d > 3 
          p > w ? d & 3     //         or p > w if d <= 3
                : m         //         and yield either d MOD 4 or m[]
        ]                   //       (when using m[], we subtract 'undefined' from v,
                            //       which sets it to NaN instead)
    )                       //   end of inner map()
  )                         // end of outer map()

3

果冻71 34字节

ḃ2ŒḄ,UZṚŒDṙLƊŒH_Ṛ}¥/$ZZṚƊṚZ8ƭ$ị@¥ƒ

在线尝试!

测试套件

完整的程序。正确的论点是矩阵。左参数是折叠的类型:

44 = L-R
40 = R-L
36 = T-B
32 = B-T
50 = TL-BR
34 = TR-BR
54 = BL-TR
38 = BR-TL

重写以使用5位双射二进制作为输入。请注意,上面给出的程序不能多次重复工作。


1

八度482字节,459字节

决定折叠方向的输入是:
1)从左到右
2)从下到上
3)从右到左
4)从上到下
5)tr至bl
6)br至tl
7)bl至tr
8)tl至br
每个呼叫仅生成指定的折叠,而不是所有折叠(可能会占用更少的字节)。最大的问题是,在这种情况下,我无法弄清楚如何将折叠1-4和5-8放在同一循环中。但是至少八度具有漂亮的矩阵。

    function[m]=f(n,o)
    k=length(n);m=NaN(k);if(o<5)
    if(mod(o,2)>0)n=n'end
    q=[0,0,k+1,k+1](o)
    for x=1:ceil(k/2)if(x*2>k)m(x,:)=n(x,:)else
    for a=1:k
    m(abs(q-x),a)=n(abs(q-x),a)-n(abs(q-(k+1-x)),a)end
    end
    end
    if(mod(o,2)>0)m=flipud(m')end
    else
    if(mod(o,2)>0)n=flip(n)end
    q=[0,0,k+1,k+1](o-4)
    for x=1:k
    for a=1:k+1-x
    if(a==k+1-x)m(x,a)=n(x,a)else
    m(abs(q-x),abs(q-a))=n(abs(q-x),abs(q-a))-n(abs(q-(k+1-a)),abs(q-(k+1-x)))end
    end
    end
    end
    if(mod(o,2)>0)m=flip(m)end
    end

在线尝试!

输出抑制消耗字节数,因此请忽略不是return语句的所有内容(ans =)。


您在写入“ end”时丢失了多少字节?
过期的数据

您不必写完吗?
OrangeCherries

除非您对其进行重组,否则您就可以这样做,因为它不是一堆if / else和for语句
Expired Data

在您的代码中,有很多我什至不知道您可以在matlab中完成的工作。
OrangeCherries

我对八度tbh不太了解,它可能很容易保存50-100字节
过期数据

1

木炭78 77字节

F⁴«UMηE⮌η§μλ¿⁼ιθUMηEκ⎇‹⊕⊗νLη⁻μ§⮌κν⎇›⊕⊗νLηωμ¿⁼ι﹪θ⁴UMηEκ⎇‹λν⁻짧ηνλ⎇›λνωμ»Eη⪫ι,

在线尝试!链接是详细版本的代码。使用以下折叠选项:

0   top-to-bottom
1   left-to-right
2   bottom-to-top
3   right-to-left
4   bottomright-to-topleft
5   topright-to-bottomleft
6   topleft-to-bottomright
7   bottomleft-to-topright

折叠的值将替换为空字符串。说明:

F⁴«≔UMηE⮌η§μλ

旋转阵列四次。

¿⁼ιθUMηEκ⎇‹⊕⊗νLη⁻μ§⮌κν⎇›⊕⊗νLηωμ

适当时水平折叠阵列。

¿⁼ι﹪θ⁴UMηEκ⎇‹λν⁻짧ηνλ⎇›λνωμ

适当时对角折叠阵列。

»Eη⪫ι,

将阵列旋转回其原始方向后,将其输出。

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.