20
\$\begingroup\$

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

46 Answers 46

1
\$\begingroup\$

Clojure, 95

The function rotated? simply tests one string against all possible rotations of the other. Brute force.

(defn rotated?
  [a b]
  (let[l (count a)
       b (seq b)]
    (->> a cycle (partition l 1) (take l) (some #{b}))))

I personally don't care where the input strings come from, but if it has to be stdin...

(apply rotated? (.split (read-line) " "))

This would add 38 to character count, if strings were whitespace separated.

(rotated? (read-line) (read-line))

This would add 32 to character count, if strings were newline separated. The function rotated? works with any characters in the strings.

\$\endgroup\$
1
\$\begingroup\$

Fixed to say Yes/No and improved (91 chars)

import List;f[a,b]|a`elem`[x++y|x<-tails b|y<-inits b]="Yes";f _="No";main=interact$f.words

original Haskell (92 chars) that says True/False

import Data.List;f(a:b:_)=any(a==)$zipWith(++)(tails b)(inits b);main=interact(show.f.words)
\$\endgroup\$
  • \$\begingroup\$ You can save a few characters with import List and also by using $ instead of parens around the argument to interact. But your program outputs True and False instead of the required Yes and No, so that might take a few extra chars to fix. \$\endgroup\$ – user1011 Apr 15 '11 at 3:38
1
\$\begingroup\$

Bash, 70 65 59 55 characters

new approach:

read a b;c=$a$a;[[ ${c/$b/} == $a ]]&&echo yes||echo no
\$\endgroup\$
  • \$\begingroup\$ solution 2 fails on echo ofofo fofof | bash rotated.sh - doesn't it? Else I would remove even more WS: read a b[[ $a$a =~ $b&&${#a}-eq${#b} ]]&& echo yes||echo no. I had a very similar idea, and think it works. \$\endgroup\$ – user unknown May 30 '12 at 6:21
  • \$\begingroup\$ You're right, more ws can be removed, and the paratheses! Need a ; after the read tho. \$\endgroup\$ – daniero May 30 '12 at 14:16
  • \$\begingroup\$ @userunknown - hah, got'cha ;) \$\endgroup\$ – daniero May 31 '12 at 23:13
  • \$\begingroup\$ You can remove a blank before and one behind ==. \$\endgroup\$ – user unknown Jun 1 '12 at 3:41
  • 1
    \$\begingroup\$ I tried, but then it always return 'yes'. \$\endgroup\$ – daniero Jun 7 '12 at 14:46
1
\$\begingroup\$

JavaScript - 66

p=prompt,a=p(),b=p();alert(!b.match(a)&&!!b+b.match(a)?'Yes':'No')
\$\endgroup\$
  • \$\begingroup\$ 1) This says True for “foo” and “foot”. 2) The output has to be “Yes” or “No”. The other participants spent great amount of code to produce the required output. Please do so. \$\endgroup\$ – manatwork Oct 18 '13 at 13:46
  • \$\begingroup\$ Is the problem true/false or that 'foo' is not a rotation of 'foot'? \$\endgroup\$ – tristin Oct 18 '13 at 13:51
  • \$\begingroup\$ 1) Giving wrong result for “foo” and “foot”, is a bug. 2) Producing different output then required, is just deviation. Many answers fail to conform with the requirements in various degrees – some got downvoted, others not. Is up to you to decide whether you risk some downvotes or correct them. \$\endgroup\$ – manatwork Oct 18 '13 at 14:27
  • \$\begingroup\$ Should be working now. \$\endgroup\$ – tristin Oct 18 '13 at 14:38
  • \$\begingroup\$ Much better. It gives “Yes” for “foo” and “.*”, but as the question owner still not replied to the comment about allowed characters, let us suppose that only the character classed used in the samples are allowed. \$\endgroup\$ – manatwork Oct 18 '13 at 15:01
1
\$\begingroup\$

05AB1E, 20 bytes

Code:

DgFÀD²Qi"Yes",q}}"No

Uses CP-1252 encoding. Try it online!

\$\endgroup\$
1
\$\begingroup\$

Jelly, 17 bytes

ɠṙ-$LСɠeị“Yes“No

Try it online!

How it works

ಠ_ಠ 10 bytes for I/O

ɠṙ-$LСɠeị“Yes“No - Main link. No arguments
ɠ                 - Take a string from STDIN. Call that A
     С           - Repeat, collecting the results. Call that C
    L             -   Repetitions: Length of A
 ṙ-$              -   Link: Rotate once to the left
       ɠ          - Take a string from STDIN. Call that B
        e         - Is B in A? Yields 1 or 0
          “Yes“No - Yield ["Yes", "No"]
         ị        - 1-based index into the above list
\$\endgroup\$
1
\$\begingroup\$

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)
\$\endgroup\$
1
\$\begingroup\$

Jelly, 16 bytes

ɠJṙ@€ɠe@ị“Yes“No

Try it online!

Many thanks to @cairdcoinheringaahing and @MrXcoder for helping me out in chat.

Explanation:

ɠ                   # The first string
  ṙ@€               # Rotated by...
 J                  #   The indexes of each element in the string
     ɠ              # The second string
      e@            # Exists in that list of strings.
                    # (either '0' or '1')
        ị           # Indexed into the list...
         “Yes“No    # ["yes", "no"]
\$\endgroup\$
1
\$\begingroup\$

jq -Rn, 62 + 4 = 65 bytes

len('if[inputs|explode|sort|implode]|.[0]==.[1]then"Yes"else"No"end')

As in the accepted answer, the two strings should be on separate lines. -R is used to avoid having to quote the input strings, and -n is used to disable the default input processing because inputs takes care of that.

\$\endgroup\$
1
\$\begingroup\$

Stax, 11 bytes

Ä:∩ö┌┘/YJTI

Run and debug it

This program takes input on two lines.

Unpacked, ungolfed, and commented, it looks like this.

:(      get all rotations
s|#     other input is a member of rotations?
`n!`    "Yes"
.No     "No"
?       (a ? b : c)

Run this one

\$\endgroup\$
1
\$\begingroup\$

C (gcc), 118 113 111 bytes

-5 bytes thanks to ceilingcat

i,l,r;f(s,t)char*s,*t;{for(l=r=0,i=strlen(s);i--;)r=strncmp(s+i,t,++l)|strncmp(s,t+l,i)?r:3;puts(r+"No\0Yes");}

Try it online!

\$\endgroup\$
1
\$\begingroup\$

PHP, 57 bytes

Input via space-delimited string on STDIN, output to STDOUT is "Yes" or "No" string.

<?=strpos(($a=explode(' ',$argn))[1].$a[1],$a[0])?Yes:No;

Try it online!

Or with Default I/O input via command line args and output truthy/falsey.

PHP, 37 bytes

<?=strpos(($a=$argv)[2].$a[2],$a[1]);

Try it online!

Or as a function:

PHP, 41 bytes

function($a,$b){return strpos($b.$b,$a);}

Try it online!

\$\endgroup\$
  • \$\begingroup\$ 36 bytes \$\endgroup\$ – Night2 Nov 24 at 12:29
  • \$\begingroup\$ 27 bytes using PHP 7.4 arrow functions \$\endgroup\$ – Night2 Nov 24 at 12:30
0
\$\begingroup\$

K3 / Kona, 28

{:[y _in![;x]'!#x;`Yes;`No]}
\$\endgroup\$
0
\$\begingroup\$

Pyth, 18 bytes

?}zm.<QdlQ"YES""NO

Try it online

Explanation

?}zm.<QdlQ"YES""NO
   m   dlQ            For each number in [1, ..., len(first input)]...
    .<Q               ... rotate the first input that many characters.
 }z                   Check if the second input is in that list.
?         "YES""NO    Return "YES" or "NO" appropriately.
\$\endgroup\$
0
\$\begingroup\$

Brachylog, 17 bytes

~c₂ᵐ↔ᵈ∧"Yes"|∧"No

Try it online!

(If the input strictly has to be whitespace-separated, add two bytes to prepend ṇ₁, but note that the input still has to be quoted. Brachylog does not have any sort of direct access to stdin.)

Takes input as a list of two strings, and outputs through the output variable. The actual logic is all in the first six bytes, which succeed if the elements of the input are rotations of each other, and fail if they are not:

   ᵐ      Both strings in the input
~c₂       can be split into two pieces each
    ↔ᵈ    such that one string's two chunks are the other's swapped.

(↔ᵈ could just as well be pᵈ, pᵛ, or oᵛ which is what it was originally before I decided that ↔ᵈ is more to the point.)

Although it would be possible to brute force rotating one of them until it matches, the number of rotations would need to be explicitly bounded, and on top of that just the effort required to separate out the two elements of the input list would be fairly costly. Since it's very easy to brute force partitions in Brachylog, the fact that a rotation is just as much taking one chunk off one end and moving it to the other as it is doing that to single characters however many times saves a lot of bytes.

With very flexible I/O, this could be as short as 5 bytes, taking one string through the input variable and the other through the output variable: ~c₂↔c

\$\endgroup\$
0
\$\begingroup\$

05AB1E, 13 bytes

ā._Êßi„Noë”…Ü

Try it online or verify all test cases.

Explanation:

ā         # Push a list in the range [0, length] for the (implicit) input-string,
          # without popping this input-string itself
          #  i.e. "CodeGolf" → [1,2,3,4,5,6,7,8]
 ._       # Rotate the string that many times towards the left (vectorized)
          #  "CodeGolf" and [1,2,3,4,5,6,7,8] → ["olfCodeG","lfCodeGo","fCodeGol","CodeGolf",
          #                                      "odeGolfC","deGolfCo","eGolfCod","GolfCode"]
   Ê      # Check for each whether it's NOT equal to the second (implicit) input-string
          #  "GolfCode" → [1,1,1,0,1,1,1,1]
    ß     # Pop and push the minimum (to check if any are falsey)
          #  [1,1,1,0,1,1,1,1] → 0 (falsey)
     i    # If this minimum is truthy (so all rotations were unequal to the second input):
      „No #  Push string "No"
     ë    # Else:
      ”…Ü #  Push dictionary string "Yes"
          # (after which the result is output implicitly)

See this 05AB1E tip of mine (section How to use the dictionary?) to understand why ”…Ü is "Yes".

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.