字符串旋转-输出字符串重复将第一个字符移到末尾


22

这里的挑战是要取一个字符串并输出其所有旋转值,方法是将第一个字符重复移动到末尾,每个字符串中的每个字符一次,以原始字符串结尾:

john -> ohnj, hnjo, njoh, john

您也可以从另一个方向循环移动字符:

john -> njoh, hnjo, ohnj, john

即使在此之前到达原始单词,您仍然应该每个字母旋转一圈:

heehee -> eeheeh, eheehe, heehee, eeheeh, eheehe, heehee

字符数组是允许的,只要结果如上所示即可。

最短答案胜出!


5
如果像这样的字符串heehee在比其长度短的周期内返回到原始顺序,我们是否就此停止?我希望这对于许多答案将有很大的不同。
xnor

我们可以朝另一个方向骑行吗?
xnor

2
我编辑了包括您的说明在内的问题,如果不是您想要的内容,请随时进行更改。
xnor

1
@xnor看起来比我的原始帖子清晰得多,非常感谢!
I_P_Edwards

1
是否允许输入/输出字符数组?(在某些语言中,区别可能很重要。)
LegionMammal978 '18

Answers:







4

Japt,5个 3字节

将输入作为字符数组,输出字符数组

£=é

在这里尝试

£=é     :Implicit input of character array U
£       :Map
  é     :  Rotate U one element to the right
 =      :  Reassign to U for next iteration


3

brainfuck,59个字节

,[>,]<[>>[>]+[<]<[<]>-[[>]>[>]<+[<]<[<]>-]>[.>]>[.>]<[<].<]

在线尝试!

输出以空字节分隔的每个字符串。

说明:

,[>,]    # 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

3

MATL6 5字节

tf&+)

@luis节省了1个字节!

MATL Online上尝试!

说明

    # Implicitly grab input string
t   # Duplicate the input
f   # Create an array [1, ..., N] where N is the number of characters in the input
&+  # Add the transpose of this array to itself to create a 2D array of indices
    #
    #   +   1  2  3  4
    #       ----------
    #   1 | 2  3  4  5
    #   2 | 3  4  5  6
    #   3 | 4  5  6  7
    #   4 | 5  6  7  8
    #
)   # Use this 2D array to index into the original string using periodic indexing
    # Implicitly display the resulting character array

@LuisMendo聪明!谢谢!
Suever

3

Wolfram语言(Mathematica)35 26字节

Partition[#,Tr[1^#],1,-1]&

在线尝试!

将字符列表作为输入。

Partition(但StringPartition下面没有使用它的变体)有一个可选的第四个参数,用于将其输入视为循环(并指定具体执行方式),这使此解决方案比字符串一个更简单-除了没有构建任何15个字符之外功能。

Wolfram语言(Mathematica),44字节

Rest@StringPartition[#<>#,StringLength@#,1]&

在线尝试!

相同,但是将字符串作为输入。

"john""johnjohn",然后采取所有的长度- StringLength["john"]该字符串的子串与偏移1,生产{"john","ohnj","hnjo","njoh","john"},然后断开与所述第一的这些Rest


由于允许使用字符数组,因此Rest@Partition[#~Join~#,Length@#,1]&将为36个字节。
LegionMammal978

@ LegionMammal978谢谢!字符数组可能也有一个较短的方法,尽管我还没有想到。
米莎·拉夫罗夫

2

附件,13字节

Rotate#{1:#_}

在线尝试!

说明

Rotate#{1:#_}
      #          fork(f, g) = ${ f[x, g[x]] }; this forks:
Rotate               rotate's the input by
       {1:#_}        each number from 1 to the length of the input

备择方案

15个字节{_&Rotate!1:#_}

16个字节{Rotate[_,1:#_]}

16个字节Rotate@Rotations

16个字节Rotate#(1&`:@`#)

17个字节Rotate#{1+Iota@_}

18个字节Rotate#(1&`+@Iota)

19个字节Rotate#(Succ=>Iota)





2

C(32位),58 51 50字节

-1字节,用于整数,多亏了ceilingcat

i;f(s){for(i=0;i++<printf("%s%.*s\n",s+i,i,s)-2;);}

在线尝试!

德戈尔夫

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.
}

建议~++i+printf("%s%.*s\n",s+i,i,s)而不是i++<printf("%s%.*s\n",s+i,i,s)-2
ceilingcat

@ceilingcat谢谢,一如既往!

@ceilingcat您真的应该被叫到flooringcat

1

木炭,10字节

⮌Eθ⭆θ§θ⁻μκ

在线尝试!链接是详细版本的代码。说明:

  θ         Input string
 E         Map over characters
    θ       Input string
   ⭆        Map over characters and join
      θ     Input string
     §      Circularly indexed by
       ⁻    Difference between
        μ   Inner index
         κ  Outer index
⮌           Reversed
            Implicitly print each string on its own line

要反方向旋转,请替换MinusPlus




1

Perl 6,32个字节

{m:ex/^(.*)(.+)$/».&{[R~] @$_}}

在线尝试!

m:ex/^(.*)(.+)$/ ex尽力m配合给定的正则表达式,在每个可能的位置分割输入字符串,但第二个子字符串必须至少包含一个字符-防止输入字符串在输出中出现两次。然后,使用反向字符串连接运算符将每个结果Match对象的捕获组减少([])为单个字符串R~




1

Powershell,44个字节

($s=$args|% t*y)|%{$h,$t=$s;-join($s=$t+$h)}

测试脚本:

$f = {

($s=$args|% t*y)|%{$h,$t=$s;-join($s=$t+$h)}

}

@(
    ,('john', 'ohnj', 'hnjo', 'njoh', 'john')
    ,('heehee', 'eeheeh', 'eheehe', 'heehee', 'eeheeh', 'eheehe', 'heehee')
) | % {
    $s,$expected = $_
    $result = &$f $s
    "$result"-eq"$expected"
    $result
}

输出:

True
ohnj
hnjo
njoh
john
True
eeheeh
eheehe
heehee
eeheeh
eheehe
heehee

1

Tcl,80 91字节

proc P s {time {puts [set s [string ra $s 1 e][string in $s 0]]} [string le $s]}

在线尝试!


每次重新分配文本都会节省一些字节proc R t {time {puts [set t [string ra $t 1 end][string in $t 0]]} [string len $t]}
大卫

感谢@david,将其压缩为80个字节
sergiol


1

Lua,61字节

function(s)for i=1,#s do print(s:sub(i+1)..s:sub(1,i))end end

在线尝试!

将连续的索引从一个索引处拆分为一个字符串长度(基于一个索引),以相反的顺序连接各个部分,然后打印。


1

Ruby,39个字节

->s{a=s.chars.to_a;a.map{a.rotate!*''}}

在线尝试!


1
欢迎光临本站!看起来您的TIO链接与您的答案不符。您的回答似乎也与我们的输入/输出要求不符。您可以使用函数或STDIN / STDOUT,但是我们不允许变量重新分配。
小麦巫师

谢谢加尔夫。不知道我如何设法将两者都弄乱了。现在应该一切都好。
acornellier

1

JavaScript,48 43 36字节

-5字节由@Bubbler提供 * -7字节由@Shaggy提供

输入是字符数组,输出是字符数组的数组。

s=>s.map(_=>([a,...b]=s,s=[...b,a]))

在线尝试!




@Shaggy这是有效的字节计数和输入吗?难道[..."john"]不能算作输入字符串的函数调用前数组的操作?
guest271314

@ guest271314,输入是一个字符,输出是一个由挑战规范和我们的I / O默认值允许的字符数组的数组。
毛茸茸的

@Shaggy更新。您能否发表上述评论?还是应该在答案中加入您的评论以避免混淆?还是没有必要?
guest271314

1

通用Lisp,88个字节

(lambda(x)(loop for s from 1 to(length x)do(format t"~a~a "(subseq x s)(subseq x 0 s))))

在线尝试!


1

MBASIC69 66字节

-3个字节,感谢ØrjanJohansen

1 INPUT S$:L=LEN(S$):FOR I=1 TO L:S$=MID$(S$+S$,2,L):PRINT S$:NEXT

我怀疑您可以将其缩短为1 INPUT S$:L=LEN(S$):FOR I=1 TO L:S$=MID$(S$+S$,2,L):PRINT S$:NEXT
与Orjan约翰森

@ØrjanJohansen很好,谢谢。
wooshinyobject

1

疯子,38个字节

,[>>,]<<<+>[[.>>]<<[<<]>-[+>.>-].<<+>]

在线尝试!

基于JoKing使用空字符作为空间符号的想法。该代码标记当前要打印的字母并循环直到到达左端。

,[>>,]<<    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
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.