检测旋转的琴弦


20

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

测试用例

输入项

CodeGolf GolfCode

输出量

Yes

输入项

stackexchange changestackex

输出量

Yes

输入项

stackexchange changestack

输出量

No

输入项

Hello World

输出量

No

那么(abcdefABABabcdef)是“是”吗?
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.