检测旋转的琴弦


20

从中读取两个字符串stdin。如果一个字符串是另一字符串的旋转版本,则
输出Yes。
否则输出No

测试用例

输入项

CodeGolf GolfCode

输出量

Yes

输入项

stackexchange changestackex

输出量

Yes

输入项

stackexchange changestack

输出量

No

输入项

Hello World

输出量

No

那么(abcdefAB,ABabcdef)是“是”吗?
— Eelvex 2011年

它真的应该是轮换还是组合也可以吗?例如。什么会Stackexchange Stackchangeex回来?
— jpjacobs 2011年

1
@Eelvex,是的。@jpjacobs,它将返回No。旋转是一种转变,就像那些LED滚动标志一样
— 刺鼻者

字符串是否总是无空格且由空格分隔?
— 乔伊

更具体地说,这些字符串中允许哪些字符?
— 乔伊

Answers:


7

APL(28)

接受两行输入。

'No' 'Yes'[1+(⊂⍞)∊⌽∘A¨⍳⍴A←⍞]

说明:

  • A←⍞:读取一行输入并将其存储在A中
  • ⌽∘A¨⍳⍴A:对于[1..length A]中的每个x,将A旋转x。给出一个列表,即estT stTe tTes Test
  • (⊂⍞)∊:读取另一行输入,然后查看它是否在此列表中。
  • 1+:在其中加上一个,如果未旋转则给定1,如果已经旋转则给定2
  • 'No' 'Yes'[... ]:'No' 'Yes'根据字符串是否旋转,从列表中选择第一个或第二个元素。
  • 该值是自动输出的。



6

Python 70个字符

a,b=raw_input().split()
print'YNeos'[len(a)<>len(b)or a not in 2*b::2]

感谢gnibbler的切片技巧。


1
与GolfScript解决方案相同的问题:如果输入nn nfn,则会得到Yes,这是错误的。
— Tamara Wijsman

@TomWij感谢您发现错误。已更正。现在应该工作。
— fR0DDY 2011年

您可以替换<>为-因为0它们的长度相等。
— Tamara Wijsman

但是,如果长度不相等怎么办?那就不好了:-)
— hallvabo 2011年

@hallvabo,则字符串不会彼此旋转。
— fR0DDY 2011年

5

J,47岁

y=:>2{ARGV
(>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'

为什么两个J回答?
— JB

@JB:因为这个使用内置旋转。两个答案su ^ H ^ H都不太好。有一个很大的空间,打高尔夫球。
— Eelvex 2011年

那么为什么我要问另一个呢?:-)
— JB

@JB:因为我认为这几乎是不合法的(:p)[,而另一个很好地扩展到了Lisp。]
— Eelvex 2011年

errr ...另一个似乎也从命令行读取了输入
— JB

5

根据规范(相同的字符串长度):

Perl,42个 43个字符

$.=pop;$_=(pop)x2;print+(qw'yes no')[!/$./]

如果允许使用不同大小的字符串,则解决方案是:

Perl,47个字符

$.=(pop)x8;$_=(pop)x9;print+(qw'yes no')[!/$./]

机器人


与GolfScript解决方案相同的问题:如果输入nn nfn,则会得到Yes,这是错误的。
— Tamara Wijsman

1
似乎还可以(我在第一个版本中错过了'!')“ nn nfn” => 否 “ CodeGolf GolfCode” => 是
— 胶靴

5

Golfscript,31岁

' '/:)~,\,=)~.+\/,(&'Yes''No'if

首先检查这个长度,因此应该可以正常工作。


:)和=)+1表示非常满意的代码
— TuxCrafting '16

4

J,57

{&('No';'Yes')@-:/@:((/:~@(|."0 _~i.&$))&.>)&.(;:&stdin)_

样品使用:

$ echo -n CodeGolf GolfCode | jconsole rotate.ijs
Yes
$ echo -n stackexchange changestackex | jconsole rotate.ijs
Yes
$ echo -n stackexchange changestack | jconsole rotate.ijs
No
$ echo -n Hello World | jconsole rotate.ijs
No

3

Windows PowerShell,76

$a,$b=-split$input
('No','Yes')[+!($a.length-$b.length)*"$b$b".contains($a)]

3

JavaScript,51

function f(a,b)a&&(a+a).replace(b,"")==a?"Yes":"No"

JavaScript没有规范的宿主,因此此答案写成两个参数的函数。如果我们不允许JS 1.7功能(表达式闭包),则得分最高为60。

在SpiderMonkey shell中,得分为71:

[a,b]=readline().split(" ");print(a&&(a+a).replace(b,"")==a?"Yes":"No")

5年后的现在,您可以使用=>功能符号了;)
— J Atkin

3

蟒蛇,66 63

a,b = raw_input()。split()
print'YNeos'[a!=(2 * a).replace(b,“”):: 2]

69 char中的另一种解决方案

a,b = raw_input()。split()
print ['No','Yes'] [a in b * 2 and len(a)== len(b)]

2
print'YNeos'[a!=(2*a).replace(b,"")::2]
— gnibbler

@gnibbler好招,谢谢你的建议。我更新了代码
— 编码人员

2

J,84

y=:(>1{ARGV),:(>2{ARGV)
((0{y)e.(y&((]$0{[),(]-~[:}.[:$[)$1{[)/.i.}.$y)){'No',:'Yes'

2

JavaScript(120个字符)

function f(a,b) {for (i=0,A=a.split("");A.join("")!=b&&i++<a.length;A.push(A.shift()));return A.join("")==b?'Yes':'No';}

输出:

f('CodeGolf','GolfCode'); //Yes
f('stackexchange','changestackex'); //Yes
f('stackexchange','changestack'); //No
f('Hello','World'); //No
f('nn','nBn'); //No

2

Ruby,共58(62)个字符

a,b=gets.split;$><<(a.size==b.size&&/#{a}/=~b*2?:Yes: :No)

此解决方案假定输入仅包含字母数字字符(实际上,在正则表达式内没有特殊含义的所有内容都可以)。

没有此限制的解决方案要长4个字符

a,b=gets.split;$><<(a.size==b.size&&(b*2).index(a)?:Yes: :No)


2

PHP,61

<?echo preg_match('/^(.+)(.*) \\2\\1$/',fgets(STDIN))?Yes:No;

2

红宝石,41岁

puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No

不打印任何内容,输入'aaa aaa'(在我的机器上)为':No'。正则表达式方法可能是一个好主意。
— steenslag 2011年

修复实际从stdin而不是args打印和输入的问题:puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No-将其升至41个字符。
— Nemo157 2011年

2

Haskell(98 96个字符)

g x y@(t:r)(z:w)|x==y="Yes"|1>0=g x(r++[t])w
g _ _[]="No"
f(x:y:_)=g x y y
main=interact$f.words

2

Q(50 43个字符)

{`No`Yes x in((!)(#)y)rotate\:y}." "vs(0:)0

2

斯卡拉78

val b=readLine split " "
print(b(0).size==b(1).size&&(b(0)+b(0)contains b(1)))

尺寸检查实在令人遗憾,没有它,计数下降到54

val a=readLine split " "
print(a(0)+a(0)contains a(1))

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".length产量为56
— 用户未知


2

GolfScript,25个字节

' '/~.2*@/''+='Yes''No'if

怎么运行的

             # STACK: "CodeGolf GolfCode"
' '/         # Split input string by spaces.
             # STACK: [ "CodeGolf" "GolfCode" ]
~            # Dump the array.
             # STACK: "CodeGolf" "GolfCode"
.            # Duplicate the topmost string.
             # STACK: "CodeGolf" "GolfCode" "GolfCode"
2*           # Repeat the topmost string.
             # STACK: "CodeGolf" "GolfCode" "GolfCodeGolfCode"
@            # Rotate the three topmost strings.
             # STACK: "GolfCode" "GolfCodeGolfCode" "CodeGolf"
/            # Split the second topmost string around the topmost one.
             # STACK: "GolfCode" [ "Golf" "Code" ]
''+          # Flatten the array of strings.
             # STACK: "GolfCode" "GolfCode"
=            # Check for equality.
             # STACK: 1
'Yes''No'if  # Push 'Yes' for 1, 'No' for 0.
             # STACK: "Yes"


1

Lua 115个字符

a,b=io.read():match"(%w+) (%w+)"c=b repeat c=c:sub(2,-1)..c:sub(1,1) s=s or a==c until b==c print(s and"Yes"or"No")

1

C程序-146

char b[99],c[99],*p,*q;main(n){q=(p=b+(n=strlen(gets(c))))+n;sprintf(b,"%s%s"
,c,c);for(gets(c);p>b&&strcmp(p,c);--p,*--q=0);puts(p>b?"Yes":"No");}

1

PHP,82个字符

<?$s=split(" ",fgets(STDIN));echo str_replace($s[1],"",$s[0].$s[0])==$s[0]?Yes:No;

1

perl,123个字符

@s1=split(//,shift);
$s2=shift;
$i=0;
while($i<=@s1){
    if(join("",@s1) eq $s2){die "yes";}
    unshift @s1,pop @s1;
    $i++;
}
die "no";

1

红宝石,30 37

gets
puts~/^(.+)(.*) \2\1$/?:Yes: :No

打印“ true”和“ false”而不是“ yes”和“ no”的版本:

gets
p !! ~/^(.+)(.*) \2\1$/

两者都使用不同长度的字符串(与旧的字符串不同)


如果两个字符串的长度相同,则可以工作,但是在“ golfcode golf”之类的输入上失败。
— steenslag 2011年

1

Python 2,86个字符

a,b=raw_input().split()
print"Yes"if any(a==b[n:]+b[:n]for n in range(len(a)))else"No"

1

Perl(只是一个快速修复)

橡胶靴解决方案的修复程序,作为我的新用户,我目前无法评论,所以我将发布一个新答案。

由于上述方法使用了根据用户输入构造的正则表达式,因此可以执行小的正则表达式注入,如下所示:

> perl -le'$。= pop; $ _ =(pop)x2; print +(qw / yes no /)[!/$./]'任何'。*'
是

解决方法是使用\ Q(也称为quotemeta):

> perl -le'$。= pop; $ _ =(pop)x2; print +(qw / yes no /)[!/ \ Q $。/]'任何'。*'
没有

可以使用'say'进一步缩短代码本身,但这只是读者的练习:)


此外,print+(qw/yes no/)[您可以写print qw(yes no)[短两个字符的文字来代替。
— Timwi
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.