끈을 제곱 해제하십시오!


12

문자열이 주어지면 먼저 다음과 같이 제곱하십시오.

먼저 문자열을 작성하십시오.

abcde

다음으로 왼쪽으로 회전 한 줄을 쓰십시오.

abcde
bcdea

len (string) 줄을 작성할 때까지이 작업을 계속하십시오 .

abcde
bcdea
cdeab
deabc
eabcd

이제 다음과 같이 문자열을 읽습니다.

----+
+--+|
|+>||
|+-+|
+---+

다음을 제공합니다.

abcdeabcdcbaedcbcdeabaede

이 문자열을 인쇄하십시오.

테스트 사례

abcdef -> abcdefabcdedcbafedcbcdefabcbafedefaf
cena! -> cena!cenanec!anena!cec!a!
ppcg -> ppcgppcppgcpcgpg
abc -> abcabacbc
ab -> abab
a -> a
 -> 

테스트 사례가 올바르지 않은 경우 의견을 말하십시오.

이것은 이므로 바이트 수가 가장 적은 코드가 이깁니다.


2
cena!잘못되었습니다. abcde두 글자 모두 5 글자이므로 예제와 일치해야합니다 .cena!cenanec!anena!cec!a!
Linus

@Linus 감사합니다. 고쳤습니다.
Oliver Ni

답변:


7

자바 스크립트 (ES7), 83 80 78 77 바이트

s=>s.repeat(l=s.length).replace(/./g,_=>s[(c-=--i**.5-l&1||-1)%l],c=-1,i=l*l)

보너스 ES3 호환 프로그램 :

for(s=prompt(r=""),c=-1,l=s.length,i=l*l;i;)r+=s[(c-=l-Math.sqrt(i--)&1||-1)%l];alert(r)

설명

이것은 예를 들어 길이 5 문자열에 대한 출력이 다음과 같이 표현 될 수 있다는 사실을 이용합니다.

abcdeabcd cbaedcb cdeab aed e
012345678 7654321 23456 543 4

여기서 각 숫자는 문자열의 인덱스 (0부터 시작)를 나타내며 문자열의 길이는 모듈로입니다. 즉, n 이 문자열의 길이 인 경우 인덱스를 2n-1 회 증가시킨 다음 2 (n-1)-1 회 감소시킨 다음 2 (n-2)-1 회 증가시킵니다 . 이것은 다음 알고리즘으로 단순화 될 수 있습니다.

  • -1 에서 색인 i 를 시작하십시오 .
  • [n 2 ..1] 범위의 각 정수 x 에 대해 :
    • 경우 층 (SQRT (X)의) 와 같은 패리티 (짝수 / 홀수)이며 N , 증가 I를 .
    • 그렇지 않으면 i를 줄 입니다.
    • 색인 i mod n 의 문자를 출력에 추가하십시오 .

이것은 floor (sqrt (x))가 2n-1 반복 후 패리티를 전환 한 다음 2 (n-1) -1 반복 등을 수행하기 때문에 작동합니다.


우스운. 잘 했어!
MayorMonty

1

Pyth , 15 바이트

.Wp.(H0_CZ.<LQU

를 입력 "quoted string"하고 결과를 인쇄 하는 프로그램입니다 .

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 (여러 입력에 맞게 수정).

작동 원리

.Wp.(H0_CZ.<LQU  Program. Input: Q
            L U  Map over [0, 1, 2, 3, ..., Q-1] (implicit input):
          .< Q     Q left-shifted by that many characters
                 Call this X
.W               While
   .(H0          popping the first element of X (mutates X in-place)
  p              and printing it with no trailing newline is truthy:
         Z           X = 
        C            X transposed
       _             reversed

1

Python 2.7 (CMD.EXE), 91 바이트

백 스페이스가 작동하는 터미널이 필요하며 repl.it 또는 ideone.com\b 에서는 작동하지 않습니다 . 쉼표로 끝나는 print 문은 줄 바꿈이나 리턴 대신 공백으로 추가 출력을 구분합니다. 백 스페이스를 사용하면 분리 공간을 덮어 쓸 수 있습니다.

s=input();r=s[::-1];n=len(s)-1;i=0
while i<=n:print'\b'+s[i:]+s[:n-i]+r[i+2:]+r[:n-i],;i+=2

파이썬 2.7, 96 바이트

ideone.com 또는 repl.it (올리버에게 감사) 에서 사용해보십시오 . 입력은 파이썬 문자열이어야합니다 (예 :) 'cena!'.

s=input();r=s[::-1];n=len(s)-1;i=0;S=''
while i<=n:S+=s[i:]+s[:n-i]+r[i+2:]+r[:n-i];i+=2
print S

루프에 의해 첨부 된 네 개의 슬라이스 ( s[i:], s[:n-i], r[i+2:], r[:n-i]) 나선형의 네 모서리에서 촬영된다. 예를 들어 01234사각형이있는 경우 :

01234
12340
23401
34012
40123

우리가 가지고 그래서 01234, 0123, 210, 4321. 변수 i는 프로세스의 각 단계에서 왼쪽 상단 값의 인덱스입니다. 마지막 나선에서는 여러 조각이 비어있을 수 있습니다.


그것은 아마 저장하지만, 파이썬 3로 변경함으로써 치우는 것 없습니다 만 S='', print SS+=, 및 포장 모든 것을하기 전에 i+=2A의 print()와 문 sep='', 당신은 2 바이트를 저장할 수 있습니다.
Kade

@ Shebang 나는 바로 다음을 따르지 않습니다. 파이썬 3 답변을 자유롭게 추가하십시오.
Linus

다음 i<=n으로 변경할 수 있습니다n>i
Oliver Ni

바이트를 저장합니다.
Oliver Ni

@Oliver, 고맙지 만 ... 그것은 작동하지 않습니다"a string of odd length."
Linus

1

젤리 , 11 10 바이트

ẋ2µṖȮṖUµÐL

TryItOnline! 또는 모든 테스트

어떻게?

나선형이 아닌 사각형은 일련의 "상단 플러스 오른쪽 가장자리"및 "하단 플러스 왼쪽 가장자리"런이며, 각각 첫 번째와 마지막 문자가없는 이전 런의 역순이며 첫 번째. 마지막 문자없이 입력과 입력을 더한 값입니다 (예 : 입력 "abcde"의 출력 "abcdeabcd" + "cbaedcb" + "cdeab" + "aed" + "e").

ẋ2µṖȮṖUµÐL - Main link: s                            e.g. abcde
ẋ2         - repeat s twice                          e.g. abcdeabcde
  µ    µ   - monadic chain separation
        ÐL - repeat until results are no longer unique:
   Ṗ       -     remove the last character                abcdeabcd / cbaedcb / cdeab / aed / e   / ""
    Ȯ      -     print z (with no linefeed) and return z
     Ṗ     -     remove the last character                abcdeabc  / cbaedc  / cdea  / ae  / ""  / ""
      U    -     reverse                                  cbaedcba  / cdeabc  / aedc  / ea  / ""  / "" <- no longer unique.

1

05AB1E, 12 바이트

2×[DõQ#¨D?¨R

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

설명:

 2×[DõQ#¨D?¨R
               # Implicit input
 2×            # Repeat twice
   [           # Begin infinite loop
┏>  DõQ#       # If empty string, break
┃       ¨      # Remove last character
┃        D     # Duplicate
┃         ?    # Print with no newline and pop
┃          ¨   # Remove last character
┃           R  # Reverse
┗━━━━━━━━━━━━┛ # Implicit end infinite loop


0

C, 95 94 바이트

i,j,k,l;f(char*s){for(k=-1,l=i=strlen(s);i--;)for(j=i*2;~j--;putchar(s[(k+=(l-i)%2*2-1)%l]));}

@ETHproductions 답변에서 영감을 얻었습니다.


0

펄, 99 바이트

$_=<>;
chop;
@a=split//;
print(@a[$%,(@f=1-($b=@a-$%)..$b-3),$b-1?$b-2:(),reverse@f]),$%+=2 until$%>@a

공백은 프로그램의 일부가 아니며 가독성을 위해 제공됩니다.

매우 효율적인 코드는 아닙니다. 어떻게 든 처음 세 줄을 단축 할 수 있어야하지만 시도한 모든 것이 실패했습니다. 이 삼항 연산자도 어떻게 든 수정해야하지만이 방법을 사용하면 너무 많이 잘라낼 수 있기 때문에 10 바이트처럼 코드를 줄일 수 있습니다.

이 코드는 뽑을 문자열의 위치 값을 나타내는 짝수로 구분 된 회문 목록을 컴파일하여 작동합니다.


당신이 사용할 수있는 -F 라인 1을 대체하고 함께 입력 부여 3. 어떤 echo -n을 제거하는을 chop. (약 81 바이트가 필요합니다)
Dada

0

실제로 , 21 13 바이트

이 알고리즘은 주로 Jonathan Allan의 Jelly 답변을 기반으로 합니다. 결과를 하나의 문자열로 인쇄하는 방법에는 두 가지가 있습니다. 여기서 사용 된 접근 방식은 중간 단계를 복제 한 다음 레지스터 1의 누적 합계 (기본적으로 빈 문자열)에 추가합니다. ;╕함수에서, 그리고 마지막에. 다른 방법은 중간 단계를 복제하고, 해당 중복 단계를 스택에 남겨두고 마지막에 하나의 문자열로 합산하는 것입니다. ;함수에서, 그리고 마지막에.

골프 제안을 환영합니다. 온라인으로 사용해보십시오!

2*`dX;╕dXR`Y╛

언 골핑

         Implicit input s.
2*       Push a string that repeats s two times.
`...`Y   Call the following function until there is no change from the last call
  dX       Discard the last element. Call this new string m.
  ;╕       Duplicate m and add it to the running total in register 1.
  dXR      Discard the last element again and reverse the string.
╛        Push the unspiralled string from register 1 to the stack.
         Implicit return.

0

파이썬 3, 59 바이트

x=input()*2
while x:x=x[:-1];print(x,end='');x=x[:-1][::-1]

반복

내 젤리 답변 의 직접 포트 ; 함수가 아닌 입력을받는 전체 프로그램 만.
print(x,end='')기본 줄 바꿈 인쇄되지 않습니다 인쇄 문입니다.


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