Symme-尝试此三角试用


17

通过添加一些空格和换行符(并使其保持相同的阅读顺序),可以将长度为正三角数(1、3、6、10、15 ...)的字符串排列为“等边文字三角形”。

例如,长度为10的字符串ABCDEFGHIJ变为:

   A
  B C
 D E F
G H I J

编写一个包含这样的字符串的程序或函数,只包含字符01。(您可以假定输入有效。)

对于所得的“等边文字三角形”,输出(打印或返回)表示对称类型的四个数字之一:

  • 2如果三角形具有双边对称性,则输出。也就是说,它从任意一个角到另一侧的中点都有一条对称线。

    例子:

     0
    1 1
    
     1
    0 1
    
      0
     0 1
    0 1 0
    
       1
      1 1
     1 0 1 
    0 1 1 1
    
  • 3如果三角形具有旋转对称性,则输出。也就是说,它可以旋转120°而没有视觉变化。

    例子:

       0
      1 0
     0 1 1
    0 1 0 0
    
       0
      0 1
     1 0 0
    0 0 1 0
    
        1
       0 1
      1 1 1
     1 1 1 0
    1 0 1 1 1
    
         1
        0 1
       0 0 1
      1 0 0 0
     1 0 0 0 0
    1 0 0 1 1 1
    
  • 输出6如果三角形有两个双边和旋转对称。也就是说,它与同时输出2和的条件相匹配3

    例子:

    0
    
    1
    
     0
    0 0
    
      1
     0 0
    1 0 1
    
       0
      0 0
     0 1 0
    0 0 0 0
    
  • 输出1,如果三角形既无双边也不旋转对称。

    例子:

      1
     1 0
    0 0 0
    
      0
     0 1
    1 0 1
    
       1
      1 0
     1 1 1 
    1 1 1 1
    
        1
       1 1
      1 1 1 
     0 0 0 1
    1 1 1 1 1
    

以字节为单位的最短代码获胜。抢七是较早的答案。

除了可选的尾随换行符之外,输入字符串还可能没有空格/换行符填充或结构-它应该是纯0的和1

如果需要,可以使用任何两个不同的可打印ASCII字符代替01

测试用例

直接取自示例。

011 -> 2
101 -> 2
001010 -> 2
1111010111 -> 2
0100110100 -> 3
0011000010 -> 3
101111111010111 -> 3
101001100010000100111 -> 3
0 -> 6
1 -> 6
000 -> 6
100101 -> 6
0000100000 -> 6
110000 -> 1
001101 -> 1
1101111111 -> 1
111111000111111 -> 1

将任何输入“旋转” 120°当然会得到相同的输出。


这个头衔只是痛苦 ......
Rɪᴋᴇʀ

9
@EᴀsᴛᴇʀʟʏIʀᴋ只是三点忽略它。
加尔文的爱好

@HelkaHomba为什么……为什么……
clismique

Answers:


9

CJam,37 29 28 27字节

感谢Sp3000节省了3个字节。

q{T):T/(\s}h]{z_Wf%_}3*])e=

测试套件。

这重用了来自此挑战的一些三角形旋转技巧。

这也适用于相同的字节数:

q{T):T/(\s}h]3{;z_Wf%_}%)e=

说明

首先,快速回顾一下我链接到上面的三角柱。我们将三角形表示为二维(参差不齐的)列表,例如

[[0 1 1]
 [0 0]
 [0]]

三角形的对称组有6个元素。通过旋转三角形,长度为3的循环,通过沿某个轴镜像,长度为2的循环。方便地,旋转对应于执行两次不同的反射。我们将使用以下几点思考来做到这一点:

  1. 转置列表意味着沿主对角线反射它,因此我们得到:

    [[0 0 0]
     [1 0]
     [1]]
    
  2. 反转每一行代表一个反射,它交换了顶部的两个角。将其应用于换位的结果,我们得到:

    [[0 0 0]
     [0 1]
     [1]]
    

使用这两个变换,并保持中间结果,我们可以生成输入的所有六个对称。

还要注意的一点是,在这样的列表上转置的行为:

[[0]
 [1 0]
 [1 0 0]
 []]

因为这就是我们在拆分输入之后的结果。方便地,在转置之后,CJam将所有行向左冲洗,这意味着它实际上摆脱了多余的部分[],并将其变为对以上两个转换有用的形式(所有形式都没有改变三角形的实际布局,使其超出了反射对称性):

[[0 1 1]
 [0 0]
 [0]]

有了这些,下面是代码:

q       e# Read input.
{       e# While the input string isn't empty yet...
  T):T  e#   Increment T (initially 0) and store it back in T.
  /     e#   Split input into chunks of that size.
  (     e#   Pull off the first chunk.
  \s    e#   Swap with remaining chunks and join them back together
        e#   into a single string.
}h
]       e# The stack now has chunks of increasing length and an empty string
        e# as I mentioned above. Wrap all of that in an array.
{       e# Execute this block 3 times...
  z_    e#   Transpose and duplicate. Remember that on the first iteration
        e#   this gets us a triangle of the desired form and on subsequent
        e#   iterations it adds one additional symmetry to the stack.
  Wf%_  e#   Reverse each row and duplicate.
}3*
        e# The stack now has all 6 symmetries as well as a copy of the
        e# last symmetry.
]       e# Wrap all of them in a list.
)       e# Pull off the copy of the last symmetry.
e=      e# Count how often it appears in the list of symmetries.
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.