首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是矩阵中心对称..。密码也是吗?

是矩阵中心对称..。密码也是吗?
EN

Code Golf用户
提问于 2018-07-16 20:24:37
回答 21查看 4.3K关注 0票数 37

定义

A 中心对称矩阵是一个平方矩阵 \C3 \mathbb{Z})\$ $满足下列关系:$$A_{i,\:j}=A_{n+1-i,\:n+1-j}$$

这类矩阵的

示例

下面是这样一个矩阵的对称性(借用自上述Wikipedia文章)的一个例子:

偶数边长(\$4\乘以4\$)中心对称矩阵:

$$\left(begin{矩阵}1&2&3&4\5和6&7&8&7&6&6&6&5&5&3&2&1\结束{矩阵}}\右)$$

一个奇数边长(3美元乘以3\$)一个:

$$\left(\begin{矩阵}1&2和3\5和6&5&2&1\结束{矩阵}\右)$$

任务和规范

给定一个大小至少为2的平方矩阵,输出两个不同且一致的值之一,以决定该矩阵是否为中心对称。你可以假设矩阵将完全由正整数组成。

However,您的代码也必须是中心对称的。也就是说,它必须是一个程序/函数(或等效项),它由\$n\$行组成,每一行在语言的编码中都包含\n字节,并且必须满足上面给出的定义,但必须使用字节而不是正整数。您提交的分数将为\n\$,而较低的n\n将更好。

您可以通过任何标准方法并以任何合理的格式获取输入并提供输出,同时注意到默认情况下禁止使用这些漏洞。您也可以(可选)选择大小\$n\$作为输入(除非您将输入作为1D列表,在这种情况下,您只能使用n^2$作为附加输入)。

测试用例

特鲁西:

代码语言:javascript
复制
[[1, 2], [2, 1]]
[[1, 2, 3], [5, 6, 5], [3, 2, 1]]
[[10, 5, 30], [2, 6, 2], [30, 5, 10]]
[[100, 100, 100], [100, 50, 100], [100, 100, 100]]
[[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]]
[[3, 4, 5, 6, 7], [5, 6, 7, 8, 9], [3, 2, 10, 2, 3], [9, 8, 7, 6, 5], [7, 6, 5, 4, 3]]

法尔西:

代码语言:javascript
复制
[[1, 2], [1, 2]]
[[1, 2, 10], [5, 6, 5], [11, 2, 1]]
[[14, 5, 32], [2, 6, 2], [30, 5, 16]]
[[19, 19, 19], [40, 50, 4], [19, 19, 19]]
[[1, 2, 20, 4], [7, 6, 7, 8], [8, 7, 6, 6], [3, 3, 2, 1]]
[[3, 4, 5, 6, 7], [5, 6, 7, 8, 9], [4, 5, 10, 4, 5], [5, 6, 7, 8, 9], [3, 4, 5, 6, 7]]
EN

回答 21

Code Golf用户

发布于 2018-07-16 21:20:42

果冻,得分2

代码语言:javascript
复制
⁼Ṛ
Ṛ⁼

在网上试试!

将输入作为扁平方阵(大小为n^2的向量)。

票数 18
EN

Code Golf用户

发布于 2018-07-17 00:15:12

Befunge-93,24

代码语言:javascript
复制
   &:00p110p920p::*:v   
vp01:+1g01-1pg02g01&_v#<
>00g`#v_>:           1$^
v2p011<  v:g00p029p01< @
>0g1+20p^>*:#v_1# .#<@ .
v+1g00gg02g01<$ >1+10pv0
>:10g-\88++20g -g-     |
vg02p011_v#`g00g01-1  <1
>1+20p   >:   ^ ^      <
                        
                        
                        
                        
                        
                        
<      ^ ^   :>   p02+1>
1<  1-10g00g`#v_110p20gv
|     -g- g02++88\-g01:>
0vp01+1> $<10g20gg00g1+v
. @<#. #1_v#:*>^p02+1g0>
@ <10p920p00g:v  <110p2v
^$1           :>_v#`g00>
<#v_&10g20gp1-10g1+:10pv
   v:*::p029p011p00:&   

在网上试试!

输入: n,后面跟着数组的元素,所有这些元素都由空格分隔。注意:如果输入足够大,可能需要使用不同的解释器。

我肯定有更好的方法,我只是想在Befunge试试这个。实际代码部分是上半部分。

怎么做?

代码分为两个主要部分,初始化验证

初始化:

代码语言:javascript
复制
   &:00p110p920p::*:v   
vp01:+1g01-1pg02g01&_v#<
>00g`#v_>:           1$^

代码的这一部分以ASCII字符的形式将输入矩阵写在代码下面。本节和下一节都使用代码左上角的三个单元格作为数据。它们以n, i, j的形式存储。

<#>验证:

代码语言:javascript
复制
                     v 
                     1
v2p011<  v:g00p029p01< @
>0g1+20p^>*:#v_1# .#<@ .
v+1g00gg02g01<$ >1+10pv0
>:10g-\88++20g -g-     |
vg02p011_v#`g00g01-1  <1
>1+20p   >:   ^ ^      <

本节根据条件i, j检查每个索引A_{i, j} = A_{n+1-i, n+1-j} 。然而,我们有一个问题:j8抵消了。为了解决这个问题,使用了以下公式:

i' = (n + 1) - i

j' = n + 1 - (j - 8) + 8 = (n + 1) + (8 + 8) - j

代码的其他部分是未读垃圾,以使其中心化。

票数 16
EN

Code Golf用户

发布于 2018-07-17 17:16:11

哈斯克尔,n= 8\$

没有评论!

将输入作为一维列表。

代码语言:javascript
复制
s a b=  
    a/=b
f =s<*> 
 reverse
esrever 
 >*

在网上试试!

\$n= 10$

将输入作为二维矩阵。

代码语言:javascript
复制
r =reverse
s a b=a/=b
f   =s<*>r
c  =concat
g =  f<$>c
c>$*

在网上试试!

感谢potato44在聊天方面的帮助。和林恩因为打了一排高尔夫球。

解释

这里的一般想法是一个简单的,我们concat的列表,并比较它是相反的。然而,由于我们想成为中心对称的,我们必须谨慎行事。首先,我们按照通常的方式编写代码:

代码语言:javascript
复制
g=((==)<*>reverse).concat

现在,为了使我们的反向行也是有效的,Haskell,我们需要方程的左边看起来像一个函数定义,tacnoc.)esrever>*<)==((没有。

解决这一问题的第一步是处理括号。

代码语言:javascript
复制
s a b=a==b
f=s<*>reverse
g=f.concat

然而,我们现在有一些新的问题。当反转时,.和==都是相同的,因此我们的反向行试图重新定义操作符(<*>反转是>*<,因此我们在这方面很好)。.可以用<$>代替,因为函数是函子。我们可以将==替换为/=,这会否定我们的输出,但这仍在规范范围内。现在我们有了

代码语言:javascript
复制
s a b=a/=b
f=s<*>reverse
g=f<$>concat

为了缩短我们的线路长度,我们别名concat和reverse。

代码语言:javascript
复制
r=reverse
s a b=a/=b
f=s<*>r
c=concat
g=f<$>c

现在,我们把所有的东西都做成正方形和中心对称。

较短的一维版本的工作方式与此相似,除非没有必要使用concat,我们可以通过删除它来保存两行代码。

票数 16
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/168683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档