\$\begingroup\$If a string like heehee returns to the original order in fewer cycles than its length, do we stop there? I expect this would make a big difference for many answers.\$\endgroup\$
– xnorDec 8 '18 at 22:43

\$\begingroup\$May we cycle in the other direction?\$\endgroup\$
– xnorDec 8 '18 at 22:45

2

\$\begingroup\$I edited the question including your clarifications, feel free to change it if it's not what you intended.\$\endgroup\$
– xnorDec 8 '18 at 23:28

1

\$\begingroup\$@xnor that looks much clearer than my original post, thanks so much!\$\endgroup\$
– I_P_EdwardsDec 9 '18 at 13:38

1

\$\begingroup\$Are we allowed to input/output character arrays? (The distinction can be important in some languages.)\$\endgroup\$
– LegionMammal978Dec 9 '18 at 18:09

Explanation:

,[>,] # Get input
<[ # Start loop over input
>>[>] # Go to end of the string
+ # Set it to one to mark it
[<]<[<]> # Move to the beginning of input
-[[>]>[>]<+[<]<[<]>-] # Transfer the first character to the end
>[.>]>[.>] # Print the rotated string
<[<]. # Print a nul byte
<] # Repeat loop while input

Partition (but not its variant StringPartitionused below) has an optional fourth argument for treating its input as cyclic (and for specifying how exactly to do so), which makes this solution simpler than the string one - in addition to not having any 15-character built-in functions.

Turns "john" into "johnjohn", then takes all the length-StringLength["john"] substrings of this string with offset 1, producing {"john","ohnj","hnjo","njoh","john"}, then drops the first of these with Rest.

C (32-bit), 5851 50 bytes

Degolf

i; // "Global" i.
f(s){ // s is pointer to string, which conveniently fits in a 32 bit integer.
for(i=0; // Initialize i.
// Increment i and take its complement, and add it to the
// return value of printf(); which just happens to be strlen(s)+1.
// ~i + strlen(s) + 1 == strlen(s) + 1 - i - 1, so the last printed
// string is the original string.
~++i + printf("%s%.*s\n",s+i,i,s);
// The printf prints two strings: first until the terminating \0,
// the second until a \0 or until i chars have been printed. It also
// prints a linefeed.
}

m:ex/^(.*)(.+)$/exhaustively matches the given regex, splitting the input string at every possible place, except that the second substring must have at least one character--that prevents the input string from showing up twice in the output. Then each of the resulting Match objects' capture groups are reduced ([]) to a single string with R~, the reversed string concatenation operator.

\$\begingroup\$Welcome to the site! It doesn't look like your TIO link corresponds to your answer. It also seems your answer doesn't fit with our input/output requirements. You can use either a function or STDIN/STDOUT but we don't allow variable reassignment.\$\endgroup\$
– Sriotchilism O'ZaicDec 11 '18 at 5:10

\$\begingroup\$Thanks Garf. Not sure how I managed to mess both of those up. Should be all good now.\$\endgroup\$
– acornellierDec 13 '18 at 4:45

\$\begingroup\$@Shaggy Is that a valid byte count and entry? Does [..."john"] not count as manipulation of the input string to an array before the function call?\$\endgroup\$
– guest271314Jan 8 at 16:12

\$\begingroup\$@guest271314, input is a character and output is an array of character arrays which are permitted by the challenge spec and our I/O defaults.\$\endgroup\$
– ShaggyJan 8 at 16:18

\$\begingroup\$@Shaggy Updated. Can you kindly leave your above comment? Or should your comment be included at the answer to avoid confusion? Or is neither necessary?\$\endgroup\$
– guest271314Jan 8 at 16:23

Based on the idea of JoKing to use null-characters as space symbols. This code marks the current letters to print and loops until it reaches the left end.

,[>>,]<< input string with empty cells in between
<+> set first marker
[ main loop
[.>>] print remaining characters
<<[<<] return to start
>-[+>.>-] print until marker (remove marker)
. print null
<<+ set new marker
> restart loop with next character to the left
] stop if there's no character to the left

Your Answer

If this is an answer to a challenge…

…Be sure to follow the challenge specification. However, please refrain from exploiting obvious loopholes. Answers abusing any of the standard loopholes are considered invalid. If you think a specification is unclear or underspecified, comment on the question instead.

…Try to optimize your score. For instance, answers to code-golf challenges should attempt to be as short as possible. You can always include a readable version of the code in addition to the competitive one.
Explanations of your answer make it more interesting to read and are very much encouraged.

…Include a short header which indicates the language(s) of your code and its score, as defined by the challenge.

More generally…

…Please make sure to answer the question and provide sufficient detail.

…Avoid asking for help, clarification or responding to other answers (use comments instead).

Code Golf Stack Exchange is a site for recreational programming competitions, not general programming questions. Challenges must have an objective scoring criterion, and it is highly recommended to first post proposed challenges in the Sandbox.