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"? Mar 9, 2011 at 12:06
• Should it really be a rotation or is a combination fine too? eg. what will Stackexchange Stackchangeex return? Mar 9, 2011 at 12:08
• @Eelvex, yes. @jpjacobs, It would return No. The rotation is a shift, like those LED scrolling signs Mar 9, 2011 at 12:19
• Are the strings always whitespace-free and separated by whitespace?
– Joey
Mar 9, 2011 at 15:20
• More specifically, what characters are allowed in those strings?
– Joey
Mar 9, 2011 at 15:48

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, 2011 at 21:40
• Very clever. :) Mar 18, 2011 at 4:56
• $* is argv when the question specified stdin though. Nov 19, 2018 at 1:00 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. 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! :-) Mar 9, 2011 at 15:24 • The question states you should read two strings from stdin, which this solution does not. Mar 9, 2011 at 15:36 • @Ventero:Fixed. Mar 9, 2011 at 18:43 • You can skip the space in print ['No Aug 12, 2019 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. Mar 9, 2011 at 14:28 • @TomWij Thanks for finding the bug. Corrected. Should work now. Mar 9, 2011 at 15:14 • You can replace <> by - as that will also result in 0 if they are of equal length. Mar 9, 2011 at 15:28 • But what if they are not of equal length? Then it doesn't work so well :-) Mar 13, 2011 at 13:38 • @hallvabo then the strings are not rotated version of each other. Mar 13, 2011 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, 2011 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. Mar 9, 2011 at 19:57 • why the other one, then, I'm tempted to ask? :-) – J B Mar 9, 2011 at 20:06 • @JB: because I thought this one is barely legal ( :p ) [ while the other one extends nicely to lisp. ] Mar 9, 2011 at 20:13 • errr... the other one seems to read input from the command-line as well – J B Mar 9, 2011 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. Mar 9, 2011 at 14:17 • seems to be ok (I missed the'!' in the first version) "nn nfn" => no "CodeGolf GolfCode" => yes Mar 9, 2011 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 Oct 30, 2016 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 ;) Feb 23, 2016 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] Oct 19, 2013 at 10:05
• @gnibbler nice trick, thanks for suggestion. I updated the code Oct 19, 2013 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. Mar 9, 2011 at 14:08
• Problem has been solved, remains low... :-) Mar 9, 2011 at 14:17
• Doesn't read from stdin as specified. Mar 9, 2011 at 16:57
• Now it does... :-) Mar 9, 2011 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. Mar 25, 2011 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. Mar 25, 2011 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 Jun 1, 2012 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, 2017 at 20:12

Husk, 14 bytes

Not sure about the rules here, Husk doesn't do IO at all. The closest alternative is a function:

!w¨Ye∫No¨€U¡ṙ1


Try it online!

Explanation

!w¨Ye∫No¨€U¡ṙ1
¡    -- iterate the following for ever:
ṙ1  --   rotate string by 1
U     -- only keep the longest prefix with unique elements
€      -- is the argument in that list?
¨Ye∫No¨       -- compressed string: "Yes No"
w              -- split on space
!               -- modular index (1-based)


Jelly, 17 13 bytes

ɠṙJɠeị“Yes“No


Try it online!

How it works

ɠṙJɠeị“Yes“No - Main link. Takes no arguments
ɠ             - Read a line from STDIN
J           - Indices; [1, 2, ..., len(S)]
ṙ            - All rotations of S
ɠe         - Read a line from STDIN; is that in the rotations?
ị“Yes“No - Index that into ["Yes", "No"]


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'. Mar 25, 2011 at 0:37