문자열에서 문자 이동


12

이 과제에서는 입력 된 문자열에서 문자를 n 번 이동하고 이동 된 문자열을 출력해야합니다.

입력

입력에는 먼저 문자열이 포함됩니다. 다음 줄에는 정수가 표시 n됩니다.

산출

  • 경우 n긍정적, 오른쪽에있는 문자열의 문자를 이동 n시간.
  • 경우 n음수 왼쪽으로 문자열의 문자를 이동 n시간.
  • 경우 n제로, 문자열의 문자를 이동하지 않습니다.

이동 후 ( n0이 아닌 경우) 이동 된 문자열을 인쇄하십시오.

노트

  • 문자열은 비어 있지 않습니다 null.
  • 문자열은 100자를 초과하지 않으며 (공백) ~ ~(물결표) 범위의 ASCII 문자 만 포함합니다 (문자 코드 0x20 ~ 0x7E 포함). 보기 ASCII 테이블을 참조.
  • 변화는 주기적입니다.
  • 숫자 n는 양수, 음수 또는 0 일 수 있습니다.
  • n 항상 -1000 이상 1000 이하
  • stdin명령 줄 인수 를 통해 또는 명령 줄 인수 를 통해 입력을받을 수 있습니다
  • 쉬프트 된 문자열은 stdout(또는 가장 근접한)
  • 전체 프로그램이나 함수를 작성하여 문자열을 입력 stdout하거나 가장 가까운 문자열을 출력

테스트 사례

1)

Hello world!
5             -->orld!Hello w

2)

Testing...
-3            -->ting...Tes

삼)

~~~
1000          -->~~~

4)

12345
0             -->12345

5)

ABA
17            -->BAA

채점

이것은 이므로 가장 짧은 제출 (바이트)이 이깁니다.

답변:


5

Pyth, 4 바이트

.>zQ

이것은 자동 평가 입력 연산자 인 Pyth를 제외하고는 CJam 5 바이트 버전 과 거의 비슷합니다 Q.

.>              # Cyclic right shift of 
  z             # Input first line as string
   Q            # Rest of the input as evaluated integer

여기에서 온라인으로 사용해보십시오


정확히 같은 솔루션 :-)
Spikatrix

@CoolGuy 꽤 간단합니다. 그러나 샌드 박스에서는 이것을 보지 못했습니다.
Optimizer

어떤 이유로 더 이상 작동하지 않는 것 같습니다. 다음 은 작동 가능한 대안이며 4 바이트입니다.
hakr14

3

자바 스크립트 ( ES5 ), 55 52 바이트

p=prompt;with(p())p(slice(b=-p()%length)+slice(0,b))

댓글 :

p = prompt; // store a copy of prompt function for reuse
with(p()) // extend scope chain with first input
    p( // print result
        slice(b = -p() % length) // take second input negated and modulo length
        +                        // and slice string by result
        slice(0, b) // concatenate with opposite slice
    )

2

CJam, 5 바이트

llim>

이것은 매우 간단합니다.

l               e# Read the first line
 li             e# Read the second line and convert to integer
   m>           e# Shift rotate the first string by second integer places

여기에서 온라인으로 사용해보십시오


1
이것이 내장 함수에 해당합니까?
LegionMammal978

LegionMammal978 @ 그것은 이다 a가 기능 내장. 그러나 OP는 빌트인의 사용을 제한하지 않습니다
Optimizer

1
내장 함수는 표준 허점 입니다.
LegionMammal978

4
@ LegionMammal978 당신은 거의 50-50 위 / 아래 투표가있는 답변을 가리 킵니다. 그것은 공동체의 결정이 아닙니다.
Optimizer

2

C, 93 바이트

main(a,v,n)char**v;{a=v[2]-v[1]-1;n=atoi(v[2]);a=a*(n>0)-n%a;printf("%s%.*s",v[1]+a,a,v[1]);}

명령 행 인수 버전을 작성하도록 수정 된 함수 인수 버전이 더 명확합니다.

f(s,n,c)char*s;{c=strlen(s);c=c*(n>0)-n%c;printf("%s%.*s",s+c,c,s);}

이것은 68 바이트에 불과하며 명령 줄 인수를 처리 할 때 C가 얼마나 불리한지를 보여줍니다.

시프트`` n가 양수이면 strlen(s)-n%strlen(s)오프셋이되고 n음수이면 오프셋이 -n%strlen(s)입니다. printf오프셋에서 인쇄, c문자열의 끝, 다음 마지막에 c처음부터 문자.

예 :

$ ./rotstr "Hello world!" 5
안녕하세요!
$ ./rotstr "테스트 중 ..."-3
팅 ... 티
$ ./rotstr "~~~"1000
~~~
$ ./rotstr "12345"0
12345
$ ./rotstr "ABA"17
매매
$ ./rotstr "Hello world!" -16
세상에!

그것은 나를 위해 예상대로 작동하지 않습니다. 경우 v[2]이고 "1", 코드가 단순 수정없이 문자열을 출력한다. 그리고 단지 "~~~""12345"작동합니다. 나머지는 잘못된 출력을 제공합니다. 모두 한 번 더 회전하면 상관이 없었을 것입니다.
Spikatrix

Linux에서 gcc 및 (약간 수정 main(a,v,n)-> n;main(a,v)) clang으로 테스트 했으며 예상대로 작동합니다. gcc의 경우 버전 5.1.0을 사용하고로 컴파일하고 gcc -o rotstr rotstr.c있습니다. 어떤 컴파일러를 사용하고 있습니까?
CL-

n글로벌 만들기 도 시도했습니다 . 같은 문제입니다. 을 사용하여 컴파일했습니다 gcc file.c -o file. Windows에서 GCC 4.8.1을 사용하고 있습니다. 코드에 정의되지 않은 동작이 있습니까?
Spikatrix

대체 하면 차이 v[2]-v[1]-1strlen(v[1])생길 수 있습니다. 미묘한 일을 생각할 수있는 유일한 곳입니다. 불행히도 테스트 할 Windows 시스템에 액세스 할 수 없습니다.
CL-

예. 코드를 변경했을 때 작동했습니다.
Spikatrix

2

파이썬 3, 45 바이트

s=input();n=int(input());print(s[-n:]+s[:-n])

프로그램의 핵심은

s[-n:]+s[:-n]

나머지는 모두 I / O에 대한 서투른 작업입니다.


2
이것은 마지막 ABA 17테스트 사례에서 실패하며 일반적으로 다음과 같은 경우에 발생합니다.|n| > length of string
Sp3000

을 사용 n=int(input())%len(s);하면 문자열 길이보다 큰 정수에 대해서는 작동하지만 7 자 이상이 필요합니다.
JPMC

2

K, 8 7 바이트

{|x!|y}

!목록에 대해이 작업의 일반화를 수행 하는 기본 "회전"( ) 이 이미 있습니다 . K 문자열은 문자 목록이므로 적용됩니다. K의 회전이 원하는 것과 반대 방향으로 진행되기 때문에 사양은 ​​CJam과 Pyth를 약간 선호합니다. 포장 !기능과 암시 적 인수가 부정 x우리가 원하는 것을 할 것입니다 :

  f:{(-x)!y}
{(-x)!y}
  f[5;"Hello world!"]
"orld!Hello w"
  f[-3;"Testing..."]
"ting...Tes"
  f[17;"ABA"]
"BAA"

kirbyfan64sos가 제안한 약간 짧은 접근 방식 |은 회전 전후에 문자열 ( ) 을 뒤집는 괄호와 부정을 제거하는 것입니다 .

이 임피던스 불일치가 아닌 경우 해결책은 간단합니다.

!

동일하게 호출

  f:!
!
  f[5;"Hello, World!"]
", World!Hello"
  f[-5;"Hello, World!"]
"orld!Hello, W"
  f[0;"Hello, World!"]
"Hello, World!"

1
을 사용하여 문자열을 반전시키고 |회전시킨 다음 다시 반전하면 동일한 결과가 발생합니까? 그렇다면 캐릭터를 잘라낼 수 있습니다.
kirbyfan64sos

좋은 지적! 작동합니다.
JohnE

1

핍, 10 바이트

이것은 아마도 더 향상 될 수 있습니다. 여전히 시프트 연산자가없는 언어의 경우 10 바이트가 나쁘지 않습니다.

a@_M-b+,#a

설명:

            a, b are command-line args (implicit)
       ,#a  range(len(a))
    -b+     range(-b, len(a)-b)
a@_M        map(lambda x: a[x], range(-b, len(a)-b))
            Concatenate the list and print (implicit)

Pip의 문자열 및 목록 색인이 주기적이기 때문에 작동합니다 "Hello"@9 == "Hello"@4 == "o".


1

rs , 180 자

^(-\d+) (.*)/\1 \2\t
+^(-\d+) (.)(.*?)\t(.*)$/\1 \3\t\2\4
^(-\d+) \t/\1 
^(-?)(\d+)/\1 (_)^^(\2)
+_(_*) (.*)(.)$/\1 \3\2
^- /- \t
+^- (.*?)\t(.*?)(.)$/- \1\3\t\2
^-? +/
\t/

라이브 데모 .

입력 번호가 음수이면 대부분 문자열을 반전시킵니다. 나는 일부 ASCII 문자 만 유효한 입력이라는 사실을 이용하고 탭을 유리하게 사용했습니다.

rs는 한 줄짜리 텍스트 수정 자이므로 <number> <text>입력 형식으로 사용해야 했습니다.


1

자바, 167

enum S{;public static void main(String[]r){int n=-Integer.parseInt(r[1]),l=r[0].length();while(n<0)n+=l;n%=l;System.out.print(r[0].substring(n)+r[0].substring(0,n));}}

명령 행을 통해 입력을받습니다.

재미있었습니다. 원래는 줄이 어떻게 바뀌어야하는지 실수로 바 꾸었습니다. 그러나 그 실수를 고치는 것은 n에 -1을 곱한 다음 논리를 올바르게 쓰는 것이 더 짧았습니다.

넓히는:

enum Shift{
    ;
    public static void main(String[]args){
        int n=-Integer.parseInt(args[1]),length=args[0].length();
        while(n<0)n+=length;
        n%=length;
        System.out.print(args[0].substring(n)+args[0].substring(0,n));
    }
}

enum S{; ... }있니?
Spikatrix

1
9 바이트가 실제로 큰 차이를 만들지 않기 때문에 전체 프로그램을 작성하기로 선택했습니다. 또한 인스턴스가 필요한 경우 (이 예제에서 동일한 바이트 수를 차지하더라도) 클래스 S {...}보다 enum S {; ...}를 선호하는 것을 다시 생각할 때 상기시켜줍니다. 클래스의 enum 버전은 enum S {X; ...}보다 1 바이트 더 걸립니다. 정적 키워드를 사용하거나 클래스의 새 객체를 명시 적으로 인스턴스화하지 않고 클래스에서 메소드 또는 변수를 선언하려는 경우 도움이됩니다.
잭 Ammo

와! 좋은. enums를 이런 식으로 사용할 수 있다는 것을 몰랐습니다 !
Spikatrix

게시한지 2 년이 지났지 만 몇 가지 골프를하실 수 있습니다. (-5 바이트) 일 Integer.parseInt수 있습니다 new Integer. 및 n%=l;변경할 경우 제거 할 수 있습니다 r[0].substring(n)+r[0].substring(n%=l)+(-2 바이트)입니다. 또한 Java 7 이상에서는 main-method가 있는 열거 형을 더 이상 사용할 수 없으므로 이를 Java 6으로 지정할 수 있습니다 .
케빈 크루이 센

편집을 귀찮게하기에는 너무 게으르지 만 절약에 대해서는 주목할 만합니다.
Jack Ammo



1

카시오 베이직, 27 바이트

StrRotate s,s,-n:Print s

결과적으로 Casio ClassPad에 내장되어 있습니다! 그러나 반대로 작동합니다 -n.

코드의 경우 24 바이트, s,n인수 로 지정 하는 3 바이트


1

05AB1E , 6 바이트

DgI+FÁ

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

D         # Duplicate the text input
 g        # Take it's length
          #  i.e. "Testing..." → 10
  I       # Take the integer input
   +      # Add them together
          #  i.e. 10 and -3 → 7
    F     # Loop that many times
     Á    #  And rotate once towards the right during every iteration

05AB1E만을위한 내장 명령을 가지고 있기 때문에 오른쪽 / 왼쪽으로 한 번 회전 , 그리고 회전 N왼쪽 / 오른쪽을 향한 양 , I 루프 length + input와 시간의 양을 오른쪽으로 많은 시간을 돌립니다.

예를 들면 다음과 같습니다.

  • "Testing ..."및 -3이 10 + -3 = 7오른쪽으로 시간을 회전 하여 결과가됩니다 ting...Tes.
  • "Hello world"와 5가 11 + 5 = 16오른쪽으로 시간을 회전 하여 결과가됩니다 worldHello.



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