Detect rotated strings

Read two strings from stdin.
Output Yes if one string is a rotated version of the other.
Otherwise output No

Testcases

Input

CodeGolf GolfCode


Output

Yes


Input

stackexchange changestackex


Output

Yes


Input

stackexchange changestack


Output

No


Input

Hello World


Output

No

• So (abcdefAB, ABabcdef) is a "YES"? – Eelvex Mar 9 '11 at 12:06
• Should it really be a rotation or is a combination fine too? eg. what will Stackexchange Stackchangeex return? – jpjacobs Mar 9 '11 at 12:08
• @Eelvex, yes. @jpjacobs, It would return No. The rotation is a shift, like those LED scrolling signs – gnibbler Mar 9 '11 at 12:19
• Are the strings always whitespace-free and separated by whitespace? – Joey Mar 9 '11 at 15:20
• More specifically, what characters are allowed in those strings? – Joey Mar 9 '11 at 15:48

APL (28)

Takes input on two lines.

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


Explanation:

• A←⍞: read a line of input and store it in A
• ⌽∘A¨⍳⍴A: Rotate A by x, for each x in [1..length A]. Gives a list, i.e. estT stTe tTes Test
• (⊂⍞)∊: read another line of input, and see if it is in this list.
• 1+: add one to this, giving 1 if the strings were not rotated and 2 if they were
• 'No' 'Yes'[...]: Select either the first or second element from the list 'No' 'Yes' depending on whether the strings were rotated or not.
• This value is output automatically.

Ruby 49 41

a,b=$*;puts (a*2).sub(b,'')==a ?:yes: :no  Edit: replaced gets.split by$*

• That's an ingenious idea. – Joey Mar 9 '11 at 21:40
• Very clever. :) – st0le Mar 18 '11 at 4:56
• $* is argv when the question specified stdin though. – Mathieu CAROFF Nov 19 '18 at 1:00 Python, 70 bytes a,b=raw_input().split() print ['No','Yes'][a in b*2and len(a)==len(b)]  Testing ... • +1 Nice, selecting the result from an array is clever! :-) – Tamara Wijsman Mar 9 '11 at 15:24 • The question states you should read two strings from stdin, which this solution does not. – Ventero Mar 9 '11 at 15:36 • @Ventero:Fixed. – Quixotic Mar 9 '11 at 18:43 • You can skip the space in print ['No – movatica Aug 12 '19 at 18:54 Python 70 Characters a,b=raw_input().split() print'YNeos'[len(a)<>len(b)or a not in 2*b::2]  Thanks to gnibbler for the slice trick. • Same problem as the GolfScript solution: If you input nn nfn, you get Yes, which is wrong. – Tamara Wijsman Mar 9 '11 at 14:28 • @TomWij Thanks for finding the bug. Corrected. Should work now. – fR0DDY Mar 9 '11 at 15:14 • You can replace <> by - as that will also result in 0 if they are of equal length. – Tamara Wijsman Mar 9 '11 at 15:28 • But what if they are not of equal length? Then it doesn't work so well :-) – hallvabo Mar 13 '11 at 13:38 • @hallvabo then the strings are not rotated version of each other. – fR0DDY Mar 13 '11 at 13:52 J, 47 y=:>2{ARGV (>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'  • Why the two J answers? – J B Mar 9 '11 at 19:49 • @JB: because this one uses the buildin rotate. Both answers su^H^H are not so good btw. There is a lot of room for golfing. – Eelvex Mar 9 '11 at 19:57 • why the other one, then, I'm tempted to ask? :-) – J B Mar 9 '11 at 20:06 • @JB: because I thought this one is barely legal ( :p ) [ while the other one extends nicely to lisp. ] – Eelvex Mar 9 '11 at 20:13 • errr... the other one seems to read input from the command-line as well – J B Mar 9 '11 at 20:15 According to the spec (same string lengths): Perl, 42 43 chars $.=pop;$_=(pop)x2;print+(qw'yes no')[!/$./]


If different sized strings are allowed, the solution would be:

$.=(pop)x8;$_=(pop)x9;print+(qw'yes no')[!/$./]  rbo • Same problem as the GolfScript solution: If you input nn nfn, you get Yes, which is wrong. – Tamara Wijsman Mar 9 '11 at 14:17 • seems to be ok (I missed the'!' in the first version) "nn nfn" => no "CodeGolf GolfCode" => yes – rubber boots Mar 9 '11 at 14:22 Golfscript, 31 ' '/:)~,\,=)~.+\/,(&'Yes''No'if  This one check length first, so it should work as expected. • :) and =) +1 for very happy code – TuxCrafting Oct 30 '16 at 23:48 J, 57 {&('No';'Yes')@-:/@:((/:~@(|."0 _~i.&$))&.>)&.(;:&stdin)_


Sample use:

$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


Windows PowerShell, 76

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


JavaScript, 51

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


JavaScript doesn't have a canonical host, so this answer is written as a function of two arguments. The score goes up to 60 if we disallow JS 1.7 features (expression closures).

In the SpiderMonkey shell this would be (for a score of 71):

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

• 5 years later and now you can use the => function notation ;) – J Atkin Feb 23 '16 at 1:28

Python, 66 63

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


Another solution in 69 char

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

• print'YNeos'[a!=(2*a).replace(b,"")::2] – gnibbler Oct 19 '13 at 10:05
• @gnibbler nice trick, thanks for suggestion. I updated the code – Coding man Oct 19 '13 at 11:26

J, 84

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


JavaScript (120 chars)

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';}


Output:

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


Ruby, 58 (62) characters

a,b=gets.split;$><<(a.size==b.size&&/#{a}/=~b*2?:Yes: :No)  This solution assumes the input contains only alphanumeric characters (actually everything that doesn't have a special meaning inside a regular expression is ok). A solution that doesn't have this constraint is 4 characters longer a,b=gets.split;$><<(a.size==b.size&&(b*2).index(a)?:Yes: :No)


Python, 71

a,b=raw_input().split()
print'Yes'if a in b*2and len(a)==len(b)else'No'

• Same problem as the GolfScript solution: If you input nn nfn, you get Yes, which is wrong. – Timwi Mar 9 '11 at 14:08
• Problem has been solved, remains low... :-) – Tamara Wijsman Mar 9 '11 at 14:17
• Doesn't read from stdin as specified. – Wooble Mar 9 '11 at 16:57
• Now it does... :-) – Tamara Wijsman Mar 9 '11 at 18:59

<?echo preg_match('/^(.+)(.*) \\2\\1$/',fgets(STDIN))?Yes:No;  Ruby, 41 puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No

• Doesn't print anything, results in ':No' for input 'aaa aaa' (on my machine). The regexp approach could be a good idea though. – steenslag Mar 25 '11 at 0:43
• Fix to actually print and input from stdin instead of args: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No - ups it to 41 chars. – Nemo157 Mar 25 '11 at 4:12 Haskell (98 96 chars) 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


Q (50 43 chars)

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


Scala 78

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


It's a shame about the size check, without it the count drops to 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 yields 56 – user unknown Jun 1 '12 at 3:49

bash 56

read a b
[[ $a$a =~ $b&&$b$b =~$a ]]&&echo Yes||echo No


GolfScript, 25 bytes

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


How it works

             # 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"


CJam, 21 bytes

r]r_,,\f{\{(+}*}_@+^!

• This answer seems to return 0/1 instead of No/Yes. – ბიმო Dec 15 '17 at 20:12

Lua 115 chars

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")


C program - 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");}


PHP, 82 characters

<?$s=split(" ",fgets(STDIN));echo str_replace($s[1],"",$s[0].$s[0])==$s[0]?Yes:No;  perl, 123 chars @s1=split(//,shift);$s2=shift;
$i=0; while($i<=@s1){
if(join("",@s1) eq $s2){die "yes";} unshift @s1,pop @s1;$i++;
}
die "no";


Ruby, 30 37

gets
puts~/^(.+)(.*) \2\1$/?:Yes: :No  A version that prints "true" and "false" instead of "yes" and "no": gets p !! ~/^(.+)(.*) \2\1$/


Both of these work with different-length strings (unlike the old one)

• Does work if the two strings have the same length, but fails on input like 'golfcode golf'. – steenslag Mar 25 '11 at 0:37

Python 2, 86 Characters

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


Perl (just a quick fix)

A fix to rubber boots' solution, being a new user that I am I can't comment yet so I'll just post a new answer.

As the mentioned method uses a regular expression constructed from user input, it is possible to perform a small regex injection, as follows:

> perl -le '$.=pop;$_=(pop)x2;print+(qw/yes no/)[!/$./]' anything '.*' yes  The fix is to use \Q (known also as quotemeta): > perl -le '$.=pop;$_=(pop)x2;print+(qw/yes no/)[!/\Q$./]' anything '.*'
no


The code itself could be further shortened using 'say' but this is left as an exercise to the reader :)

• Furthermore, instead of print+(qw/yes no/)[ you can probably write print qw(yes no)[ which is two characters shorter. – Timwi Apr 12 '11 at 22:58