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$作为附加输入)。
特鲁西:
[[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]]法尔西:
[[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]]发布于 2018-07-17 00:15:12
号
&: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试试这个。实际代码部分是上半部分。
代码分为两个主要部分,初始化和验证。
初始化:
&:00p110p920p::*:v
vp01:+1g01-1pg02g01&_v#<
>00g`#v_>: 1$^代码的这一部分以ASCII字符的形式将输入矩阵写在代码下面。本节和下一节都使用代码左上角的三个单元格作为数据。它们以n, i, j的形式存储。
<#>验证:
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} 。然而,我们有一个问题:j被8抵消了。为了解决这个问题,使用了以下公式:
i' = (n + 1) - i
j' = n + 1 - (j - 8) + 8 = (n + 1) + (8 + 8) - j
代码的其他部分是未读垃圾,以使其中心化。
发布于 2018-07-17 17:16:11
没有评论!
将输入作为一维列表。
s a b=
a/=b
f =s<*>
reverse
esrever
>*\$n= 10$将输入作为二维矩阵。
r =reverse
s a b=a/=b
f =s<*>r
c =concat
g = f<$>c
c>$*感谢potato44在聊天方面的帮助。和林恩因为打了一排高尔夫球。
解释这里的一般想法是一个简单的,我们concat的列表,并比较它是相反的。然而,由于我们想成为中心对称的,我们必须谨慎行事。首先,我们按照通常的方式编写代码:
g=((==)<*>reverse).concat现在,为了使我们的反向行也是有效的,Haskell,我们需要方程的左边看起来像一个函数定义,tacnoc.)esrever>*<)==((没有。
解决这一问题的第一步是处理括号。
s a b=a==b
f=s<*>reverse
g=f.concat然而,我们现在有一些新的问题。当反转时,.和==都是相同的,因此我们的反向行试图重新定义操作符(<*>反转是>*<,因此我们在这方面很好)。.可以用<$>代替,因为函数是函子。我们可以将==替换为/=,这会否定我们的输出,但这仍在规范范围内。现在我们有了
s a b=a/=b
f=s<*>reverse
g=f<$>concat为了缩短我们的线路长度,我们别名concat和reverse。
r=reverse
s a b=a/=b
f=s<*>r
c=concat
g=f<$>c现在,我们把所有的东西都做成正方形和中心对称。
较短的一维版本的工作方式与此相似,除非没有必要使用concat,我们可以通过删除它来保存两行代码。
https://codegolf.stackexchange.com/questions/168683
复制相似问题