弦的旋转对称


9

旋转“是通过将字符串分成两部分并颠倒其顺序进行的”。如果对象在应用操作之后未更改,则该对象在操作下是对称的。因此,“旋转对称”是字符串在“旋转”之后保持不变的事实。

给定一个非空字符串,该字符串s仅包含从a到的字母z,输出该字符串旋转对称性的最高顺序。

测试用例:

input        output
a            1
abcd         1
abab         2
dfdfdfdfdfdf 6

这是 。以字节为单位的最短答案将获胜。有标准漏洞




这与找到小于字符串大小的对称旋转数相同。正如@ 0'指出的那样,它们形成一个循环组,因此找到最高阶与找到组的大小相同。这将使目前尚不清楚的任务解释更加清晰。
Ad Hoc Garf Hunter,

Answers:


8

视网膜,15字节

(^.+?|\1)+$
$#1

在线尝试!

通过重复子字符串来匹配整个字符串(由于ungreedy,优先考虑较短的子字符串.+?),并将整个字符串替换为我们使用的重复次数。


哦,当然不满意。这是我在努力挣扎.*(.+)$(?<=^(\1)*)……
尼尔(Neil)


3

05AB1E,8个字节

gGDÀ})QO

在线尝试!

说明

gG  }      # len(input)-1 times do:
  D        # duplicate
   À       # rotate left
     )     # wrap result in a list
      Q    # compare each to input for equality
       O   # sum


2

Prolog(SWI),64字节

A+B:-findall(X,(append(X,Y,A),append(Y,X,A)),[_|Z]),length(Z,B).

在线尝试!

定义一个谓词+/2,该谓词将字符串(以字符代码列表的形式)作为其第一个参数(A),并将其第二个参数(B)设置为最高阶对称旋转的顺序。

说明

该程序使用以下事实:字符串上的一组对称旋转是一个循环组,因此,一组对称旋转的顺序等于最高阶对称旋转的顺序。因此,程序可以通过找到输入字符串上对称旋转的总数来计算所需的结果。

代码说明

大部分繁重的工作都是通过调用findall/3谓词来完成的。所述findall/3谓词认定为第一个参数(所有不同的可能的值X在这种情况下),使得给定的作为第二个参数的表达式为真((append(X,Y,A),append(Y,X,A)),稍后更多)。最后,它将这些可能的值中的每一个X作为最终值存储在列表中([_|Z])中。

传递到表达式findall/3作为第二arugment,(append(X,Y,A),append(Y,X,A))使用append/3谓词来指定X一些尚未定义的级联Y必须等于A,输入字符串,和在相同Y级联与X也必须等于A。这意味着X必须是A这样的前缀,如果将其从的前面删除A并添加到后面,则结果字符串与相同AX具有此属性的s 集与的对称旋转几乎一一对应A。总是存在一种重复计数的情况,这是由于空字符串和A都是前缀A对应于的0旋转A。由于的0-rotation A始终是对称的,因此Xs from 的结果列表的长度findall/3将比上的对称旋转的数量大1 A

为了解决重复计数问题,我在findall/3谓词的第三个参数上使用了模式匹配。在Prolog中,列表以其头部(第一个元素)和尾部(其余元素)成对表示。因此,[_|Z]表示一个列表,其尾部等于Z。这意味着的长度Zfindall/3谓词找到的前缀数少一个,因此等于的对称旋转数A。最后,我使用length/2谓词B将长度设置为Z


2

JavaScript(ES6),42 41字节

@ l4m2节省了1个字节

s=>s.length/s.match`(.+?)\\1*$`[1].length

测试用例


f=s=>s.length/s.match`(.+?)\\1*$`[1].length
l4m2

1

Japt,7个字节

¬x@¥UéY

在线测试!

说明

 ¬ x@   ¥ UéY
 q xXY{ ==UéY}  // Expanded
Uq xXY{U==UéY}  // Variable introduction
                // Implicit: U = input string
Uq              // Split U into chars.
   xXY{      }  // Map each item X and index Y by this function, then sum the results:
       U==UéY   //   Return U equals (U rotated by Y characters).
                // Implicit: output result of last expression



0

Haskell,49个字节

g x=sum[1|a<-[1..length x],drop a x++take a x==x]

在线尝试!

Haskell,49个字节

g x=sum[1|(a,_)<-zip[1..]x,drop a x++take a x==x]

在线尝试!

说明

这使用了指出的简单解决方案@ 0'。由于字符串的旋转形成一个循环组,因此最高阶元素与该组的大小相同,因此我们可以通过找到对称旋转数来获得单位的阶数。

简单的代码执行列表理解并计算保留原始字符串的转数。


您可以使用drop<>take,而不是使用(++)保存3个字节,像这样
ბიმო

(<>)在我使用的Haskell版本中,@ BMO 并不是序幕。
Ad Hoc Garf Hunter'Apr
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.