转置和对角线


21

对于这个挑战,您应该编写一个程序或函数来输出给定方阵的对角线。但是,如果对解决方案源代码的行和列进行转置,则它应该成为返回矩阵的对角线的程序或函数。继续阅读以了解详细信息...

规则

  • 解决方案的源代码被视为2D字符网格,由您选择的标准换行符分隔(换行,回车或两者结合)。
  • 源代码中的任何一行都不能长于上一行。以下是有效布局的一些示例:

    ###
    ###
    ###
    

    ########
    #######
    ###
    ###
    #
    

    这是一个无效布局的示例(因为第三行比第二行长):

    ######
    ####
    #####
    ###
    
  • 您的两个解决方案应该是彼此的换位,也就是说,您应该通过交换行和列来获得彼此的解决方案。这是两个有效对:

    abc
    def
    ghi
    

    adg
    beh
    cfi
    

    print 10
    (~^_^)~
    foo
    bar
    !
    

    p(fb!
    r~oa
    i^or
    n_
    t^
     )
    1~
    0
    

    请注意,空格与其他任何字符一样。特别是,尾随空格很重要,因为它们在转置中可能不是尾随空格。

  • 每个解决方案都应该是一个程序或函数,该程序或函数采用一个由一位整数组成的非空方阵作为输入。一种解决方案应输出矩阵所有对角线的列表,而另一种解决方案应输出所有反对角线的列表。您可以使用任何合理,明确的输入和输出格式,但是两种解决方案之间的格式必须相同(这也意味着它们要么必须既是函数,要么是两个程序)。

  • 每个对角线从左上角到右下角,应该从上到下进行排序。
  • 每个对角线从左下角到右上角,应该从上到下进行排序。

计分

为了鼓励解决方案尽可能“方形”,主要分数是解决方案的行数或列数,以较大者为准。越少越好。解决方案中的字符数打破了联系,不包括换行符。同样,少即是好。例:

abcd
efg
h

它及其转置的主要得分为4(因为有4列),并且平局得分为8(因为有8个非换行符)。请在答案的标题中引用这两个值。

测试用例

这两个解决方案执行的实际任务不应该是这里的主要挑战,但以下两个示例可以帮助您测试解决方案:

Input:
1 2 3
4 5 6
7 8 9
Diagonals:
3
2 6
1 5 9
4 8
7
Antidiagonals:
1
4 2
7 5 3
8 6
9

Input:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
Diagonals:
0
1 1
0 0 0 
1 1 1 1
0 0 0
1 1
0
Antidiagonals:
1
0 0
1 1 1
0 0 0 0
1 1 1
0 0
1


当我意识到沙箱发布是在您完成之前,是您的,在今天早上上SE之前,我意识到您已经发布了此...此时,我开始觉得自己一定是通灵的:P
ETHproductions

Answers:


19

Javascript,得分20 14,(258176非换行符)

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

示例代码段:

f=

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))

f=

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))


您可以启用语法突出显示吗?放置<!-- language-all: lang-javascript -->所述第一码块之前。
CalculatorFeline

8

MATL,得分10(100个非换行符)

%P!       
  Q&%     
  TXd!    
  %d      
     P!   
      "@% 
       Xz 
      %z  
         q
         !

一共有10行,每行10个字符(注意尾随空格)。

上面的代码产生对角线。在线尝试!

转置版本产生反对角线。在线尝试!

说明

注意

  • % 是注释符号,它将导致其余行被忽略。

  • Xd不能将连续两个字符之类的两字符函数分割为an X和a d

原始码

原始代码(已线性化且无注释部分)为

Q&TXd!P!"@Xzq!

其工作原理如下:

Q      % Implicit input. Add 1 to each entry to make them positive
&      % This modifes default inputs/ouputs of next function, which is Xd
       % Specifically, it specifies 2 inputs and 1 ouput
T      % Push true
Xd     % Diagonals of matrix. With second input true, it gives all diagonals,
       % starting from below. The columns are arranged as columns of a matrix,
       % padding with zeros
!P!    % Flip horizontally. This is to produce the correct display order
"      % For each column
  @    %   Push current column
  Xz   %   Remove zeros
  q    %   Subtract 1
  !    %   Transpose into a row
       % Implicit end. Implicit display of stack contents

转置代码

线性化的转置代码为

P!QT&Xd!P!"@Xzq!

与原始代码相比,有以下两个区别:

  • T并被&交换。这是无效的,因为T它是文字,而不是函数,所以它不会拦截&规范。
  • P! 一开始就添加了。

添加的代码修改了输入矩阵,以使修改后的矩阵的对角线成为输入的反对角线:

P      % Implicit input. Flip vertically
!      % Transpose

7

果冻,得分7,49个非换行字节

对角印刷程序

......U
......Œ
......D
......ṙ
......L
......Ṛ
ŒDṙLṚUU

在线尝试!

反对角印刷程序

......Œ
......D
......ṙ
......L
......Ṛ
......U  
UŒDṙLṚU

在线尝试!

较旧的答案(无序输出),得分3,6个非换行字节

对角印刷程序

UU
UŒ
ŒD

在线尝试!

反对角印刷程序

UUŒ
UŒD

在线尝试!


6

果冻,得分4(12个字符)

以前的分数:5(16个字符),4(16个字符)

原版的

ŒDṙṚ
D  ñ
ṙLñL

在线尝试!

转置

ŒDṙ
D L
ṙ ñ
ṚñL

在线尝试!

背景

对角线

获得方矩阵对角线(最上到最下)的直接方法如下。

ŒDṙLṚ

对于输入矩阵MŒD列出M的对角线,从主对角线开始向上移动。

对于输入

1 2 3
4 5 6
7 8 9

这产生

1 5 9
2 6
3
7
4 8

ṙL然后使用计算M的长度,L并将结果length(M)单位向左旋转。

对于我们的示例,长度为3,我们得到

7
4 8
1 5 9
2 6
3

最后,反转对角线的顺序,返回

3
2 6
1 5 9
4 8
7

对于我们的示例输入。

反对角线

可以使用相同的构造块来获得方矩阵的对角线(同样,从上到下)。

ṚŒDṙL

对于输入矩阵M首先反转行的顺序。

对于输入

1 2 3
4 5 6
7 8 9

这产生

7 8 9
4 5 6
1 2 3

和以前一样,ŒDṙL生成结果的对角线(最底到最顶)。

对于我们的示例,此返回

1
4 2
7 5 3
8 6
9

如预期的。

怎么运行的

在Jelly中,每行都定义一个链接(函数)。特别是,最后一行定义了main链接,该链接在程序启动时执行。

必须调用其他链接。该答案使用ñ,它会按顺序执行下面的链接。ñ环绕,因此当从主链接调用它时,它将在第一行执行链接。

原版的

主要链接

ṙLñL

接受一个输入矩阵M,使用来计算其长度L,然后使用来向左旋转输入length(M)个单位(请注意,这不会改变M),最后调用结果(M)和length( M)作为参数。

第一个链接

ŒDṙṚ

计算的对角线中号ŒD(所看到的上一节中),旋转结果长度(M)单位向左,然后反转其结果的顺序

永远不会调用第二个链接。

转置

主要链接

 ṚñL

接受一个输入矩阵M,并使用来计算其逆。然后,它计算的长度中号L并调用自变量的第一链路反向(M)长度(M)

第一个链接

ŒDṙ

然后计算的对角线反向(M)ŒD(如上一节中所看到的),最后旋转结果长度(M)单元和左

其余的链接永远不会调用。


5

R,得分14 13 11(99 95个非换行符)

感谢@Giuseppe将分数提高了1。通过在换位中使用冗余来减少一些字符。目前,非高尔夫语言的最佳成绩!

######`,scr
`::`(#:fpoo
pryr,#:)llw
f)(###`(i((
split (#tmm
p,col(p#())
)+row#r#m-)
(p)))#y#,#)
######r

并转置:

#`pfsp)(#
#:r)p,+p#
#:y(lcr)#
#`r#ioo)#
#(,#tlw)#
#### (###
`::`(pryr
,f)(####
split(m,
col(m)-#
row(m)))

在线尝试!


1
row(m)+col(m)对于反对角线较短。
朱塞佩

@Giuseppe当然,谢谢!现在编辑。
rturnbull

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.