문자열 회전-첫 번째 문자를 끝까지 반복적으로 이동하는 출력 문자열


22

여기서의 과제는 문자열을 가져와 원래 문자열로 끝나는 문자열의 문자 당 첫 번째 문자를 끝까지 반복해서 이동하여 모든 회전을 출력하는 것입니다.

john -> ohnj, hnjo, njoh, john

끝에서 문자를 이동하면서 다른 방향으로 순환 할 수도 있습니다.

john -> njoh, hnjo, ohnj, john

그 전에 원래 단어에 도달하더라도 문자 당 한 번의 회전을 출력해야합니다.

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

결과가 위에 표시된대로 작동하는 한 문자 배열이 허용됩니다.

최단 답변이 승리합니다!


5
같은 문자열 heehee이 길이보다 적은 주기로 원래 순서로 돌아 가면 거기서 멈추는가? 나는 이것이 많은 답변에 큰 차이를 만들 것으로 기대합니다.
xnor December

우리는 다른 방향으로 순환 할 수 있습니까?
xnor December

2
나는 당신의 설명을 포함하여 질문을 편집했습니다. 원하는 것이 아닌 경우 언제든지 변경하십시오.
xnor

1
@xnor 원래 게시물보다 훨씬 명확하게 보입니다. 대단히 감사합니다!
I_P_Edwards

1
문자 배열을 입력 / 출력 할 수 있습니까? (구분은 일부 언어에서 중요 할 수있다.)
LegionMammal978

답변:







4

apt, 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

MATL , 6 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 Clever! 감사!
Suever

3

Wolfram Language (Mathematica) , 35 26 바이트

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

온라인으로 사용해보십시오!

문자 목록을 입력으로 사용합니다.

Partition( StringPartition아래에 사용 된 변형 은 아님) 입력을 주기적으로 처리하고 정확하게 수행하는 방법에 대한 선택적 네 번째 인수가 있어이 솔루션을 문자열보다 간단하게 만들 수 있습니다. 기능.

Wolfram Language (Mathematica) , 44 바이트

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

온라인으로 사용해보십시오!

동일하지만 문자열을 입력으로 사용합니다.

"john"으로는 "johnjohn"다음의 모든 길이 - 얻어 StringLength["john"]제조 오프셋 1이 문자열의 문자열을 {"john","ohnj","hnjo","njoh","john"}다음으로 이들 제 드랍 Rest.


문자 배열이 허용 Rest@Partition[#~Join~#,Length@#,1]&되므로 36 바이트입니다.
LegionMammal978

감사합니다! 문자 배열에는 더 짧은 접근 방식이있을 수도 있지만 아직 아무것도 생각하지 못했습니다.
Misha Lavrov

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

J , 7 바이트

#\|."{]

온라인으로 사용해보십시오!

설명:

  |."{    - rotate ( "{ is short for "0 1 - rank 0 1 ) 
      ]   - the input
#\        - lenght of the successive prefixes of the input 

2
"그렇게 사용 하는 것은 매우 영리하며 언어에 대한 사전 지식이 필요합니다. 순위가있는 동사도 1 0있습니까?
Adám December

@ Adám 나는 그것이 생각합니다 "#:. 나는 Frownyfrog에서 여기를 배웠다
갈렌 이바노프



2

C (32 비트), 58 51 50 바이트

ceilingcat 덕분에 좋은 둥근 숫자를 위해 -1 바이트

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 정말 전화해야합니다 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

펄 6 , 32 바이트

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

온라인으로 사용해보십시오!

m:ex/^(.*)(.+)$/ exm주어진 정규 표현식을 철저히 처리 하여 두 번째 하위 문자열에 적어도 하나의 문자가 있어야 입력 문자열이 출력에 두 번 표시되는 것을 제외하고 가능한 모든 위치에서 입력 문자열을 분할합니다. 그런 다음 각 결과 Match개체의 캡처 그룹이 반전 된 문자열 연결 연산자 []를 사용하여 단일 문자열로 줄어 듭니다 ( ) R~.




1

파워 쉘, 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

@david 덕분에 80 바이트로 줄였습니다
sergiol



1

루비 , 39 바이트

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

온라인으로 사용해보십시오!


1
사이트에 오신 것을 환영합니다! TIO 링크가 귀하의 답변과 일치하지 않는 것 같습니다. 또한 귀하의 답변이 입력 / 출력 요구 사항에 맞지 않는 것 같습니다. 함수 또는 STDIN / STDOUT을 사용할 수 있지만 변수 재 할당은 허용되지 않습니다.
밀 마법사

고마워요. 내가 어떻게 둘 다 엉망으로 만들 었는지 잘 모르겠습니다. 지금은 모두 좋을 것입니다.
acornellier

1

자바 스크립트, 48 43 36 바이트

@Bubbler에서 -5 바이트 제공 @Shaggy에서 -7 바이트 제공

입력은 문자형 배열이고 출력은 문자형 배열입니다.

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

온라인으로 사용해보십시오!




@Shaggy 유효한 바이트 수와 항목입니까? 않음 [..."john"]함수 호출 전에 배열 입력 문자열의 조작으로 간주되지?
손님 271314

@ guest271314에서 input은 문자이고 output은 챌린지 사양 및 I / O 기본값에서 허용되는 문자 배열의 배열입니다.
얽히고 설킨

@Shaggy 업데이트. 당신은 친절하게 위의 의견을 남길 수 있습니까? 아니면 혼란을 피하기 위해 귀하의 의견을 답변에 포함시켜야합니까? 아니면 필요하지 않습니까?
손님 271314


1

MBASIC , 69 66 바이트

Ørjan Johansen 덕분에 -3 바이트

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.
Ørjan Johansen

@ Ørjan Johansen 감사합니다.
wooshinyobject

1

brainfuck , 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.