줄을 풍차로 바꾸다


14

이 사이트의 코드가 빠르게 고갈되고 있습니다. 재생 가능한 줄에 투자해야합니다. 따라서 문자열을 가져와 풍차로 변환하는 프로그램을 작성해야합니다.

도전

간단한 풍차 문자열을 예로 들어 봅시다. 문자열을 가져 가라 abc. 피벗 이 경우, 중앙의 문자이다 b. 문자열의 길이는 3 자이므로 모든 출력의 높이는 정확히 3 줄, 3 자입니다. 1 단계의 출력 결과는 다음과 같습니다 (공백에 유의하십시오).

알파벳

다음 단계를 수행하려면 피벗 주위의 각 문자를 시계 방향으로 회전하십시오. 2 단계는 다음과 같습니다.

ㅏ
 비
  씨

3-8 단계는 다음과 같습니다.

 ㅏ
 비
 씨
  ㅏ
 비
씨
CBA

씨
 비
  ㅏ
 씨
 비
 ㅏ
  씨
 비
ㅏ

그리고 아홉 번째 단계에서는 원래 문자열에 완전한 원이 나타납니다.

알파벳

합니다 b같은 자리에 모든 시간을 머물렀다. b피벗 문자 이기 때문 입니다. 문자열을 입력으로 사용하고 프로그램이 닫힐 때까지이 순서를 반복적으로 인쇄하는 프로그램이나 함수를 작성해야합니다.

설명

  • 모든 입력 문자열은 홀수의 문자를 갖습니다. (따라서 모든 풍차에는 피벗이 있습니다)

  • 챌린지를 간단하게 유지하기 위해 모든 문자열은 대문자와 소문자 만 포함합니다.

  • 출력은 len(input_string)문자가 넓고 커야합니다.

  • 영원히 회전하고 반복하는 한 시작하는 순서는 중요하지 않습니다.

추가 테스트 IO :

게시물이 이미 길기 때문에 여기 링크가 있습니다 "windmill"출력에 대한 .

사이드 노트 :

이것은 풍차이기 때문에 약간의 시간 지연이나 각 단계 사이의 사용자 입력으로 보일러 플레이트 코드를 애니메이션으로 만드는 것이 좋습니다. 그러나 일부 언어에는 시간이 내장되어 있지 않으므로 필수 언어는 아닙니다. 제출물의 경쟁 부분은 시퀀스를 가능한 한 빨리 인쇄 할 수 있습니다.


답변:


7

MATL , 35 33 21 바이트

jtn2/kYaG1$Xd`wtD3X!T

다음은 풍차에 애니메이션을 적용합니다 ( 26 바이트 ).

jtn2/kYaG1$Xd`wtXxDlY.3X!T

온라인 데모

이 버전에서는 Xx디스플레이를 지우 도록 지정 1Y.하고 1 초 동안 일시 중지합니다.

설명

기본 아이디어는 두 가지 버전의 입력을 만들고 싶다는 것입니다. "직교"버전

+-----+
|     |       
|     |
|abcde|
|     |
|     |
+-----+

"대각선"버전

+-----+
|a    |
| b   |
|  c  |
|   d |
|    e|
+-----+

이 두 버전을 스택에 푸시합니다. 루프를 통과 할 때마다 스택 순서를 전환하고 상단을 시계 방향으로 1 회전합니다.

j       % Grab the input as a string
t       % Duplicate the input

%--- Create the "orthogonal" version ---%

n2/     % Determine numel(input) / 2
k       % Round down to nearest integer
Ya      % Pad the input string with floor(numel(input)/2) rows above and below 

%--- Create the "diagonal" version ---%

G       % Grab the input again
1$Xd    % Place the input along the diagonal of a matrix    

`       % do...while loop   
  w     % Flip the order of the first two elements on the stack
  t     % Duplicate the top of the stack

  %--- OCTAVE ONLY (converts NULL to space chars) ---%

  O       % Create a scalar zero
  32      % Number literal (ASCII code for ' ')
  XE      % Replaces 0 elements in our 3D array with 32 (' ')

  %--- END OCTAVE ONLY ---%

  D     % Display the element     
  3X!   % Rotate this element 90 degrees counter-clockwise 3 times (clockwise)
  T     % Explicit TRUE to create an infinite loop
        % Implicit end of while loop

8

자바 스크립트 (ES6), 291 바이트

r=a=>{w.textContent=a.map(a=>a.join``).join`
`;for(i=j=h=a.length>>1;j++,i--;){t=a[i][i];a[i][i]=a[h][i];a[h][i]=a[j][i];a[j][i]=a[j][h];a[j][h]=a[j][j];a[j][j]=a[h][j];a[h][j]=a[i][j];a[i][j]=a[i][h];a[i][h]=t}}
s=w=>{a=[...w=[...w]].map(_=>w.map(_=>' '));a[w.length>>1]=w;setInterval(r,1000,a)}
s("windmills")
<pre id=w>


무게 시간을 줄여서 몇 바이트를 골라 낼 수 없습니까?
시장 시장


5

루비, (122) 119 바이트

->n{c=0
loop{i=[l=n.size,m=l+1,m+1,1][3-c=c+1&7]*(3.5<=>c)
s=(' '*l+$/)*l
l.times{|j|s[m*l/2-1+(j-l/2)*i]=n[j]}
$><<s}}

테스트 프로그램에서 절전 모드가있는 언 골프 버전

회전은 콘솔 높이 전체에서 그리 설득력이 없습니다. 그러나 높이를 입력 문자열의 길이로 줄이면 회전이 훨씬 더 설득력이 있습니다.

f=->n{
  c=0                                     #loop counter
  m=1+l=n.size                            #l=string length. m=l+1
  loop{                                   #start infinite loop
    s=(' '*l+$/)*l                        #make a string of l newline-terminated lines of l spaces. Total m characters per line.              
    i=[m-1,m,m+1,1][3-c=c+1&7]*(3.5<=>c)  #array contains positive distance between characters in string 1=horizontal, m=vertical, etc.
                                          #c=c+1&7 cycles through 0..7. Array index 3..-4 (negative indices count from end of array, so 3=-1, 0=-4 etc)
                                          #(3.5<=>c) = 1 or -1. We use to flip the sign. This is shorter than simply using 8 element array [m-1,m,m+1,1,1-m,-m,-m+1,-1]  
    l.times{|j|s[m*l/2-1+i*(j-l/2)]=n[j]} #for each character in n, write the appropriate space character in s to the character in n
    puts s                                #print s
    sleep 1                               #sleep for 1 second
  }
}

f[gets.chomp]                             #get input, remove newline, call function


3

파이썬 3 , 193 바이트

데프 c (a) : e = ''; s = len (a); l = int (s / 2); b = 범위 (s); m = '\ n'* l; print (m, a, m ); x : b : print (e * x, a [x]); x : b : print (e * l, a [x]); x : b : print (e * (s-1- x), a [x]); a = 입력 (); 참 : c (a); c (a [::-1]);

언 골프

데프 c (a) :
    e = ''; s = len (a); l = int (s / 2); b = 범위 (m) 'm ='\ n '* l;
    인쇄 (m, a, m);
    b : print (e * x, a [x])에서 x의 경우;
    b : print (e * 1, a [x])에서 x의 경우;
    b : print (e * (s-1-x), a [x])에서 x에 대해; 
a = 입력 ();
진실한 동안 :
    c (a);
    c (a [::-1]);

재귀, 177 바이트

(몇 초 후 충돌)

데프 c (a) : e = ''; s = len (a); l = int (s / 2); b = 범위 (s); m = '\ n'* l; print (m, a, m ); x : b : print (e * x, a [x]); x : b : print (e * l, a [x]); x : b : print (e * (s-1- x), a [x]); c (a [::-1]); c (입력 ());

언 골프

데프 c (a) :
    e = ''; s = len (a); l = int (s / 2); b = 범위 (m) 'm ='\ n '* l;
    인쇄 (m, a, m);
    b : print (e * x, a [x])에서 x의 경우;
    b : print (e * 1, a [x])에서 x의 경우;
    b : print (e * (s-1-x), a [x])에서 x에 대해;
    c (a [::-1])
c (입력 ());

다른 솔루션, 268 바이트

itertools를 i로 가져 오기; def w (a) : e = ''; s = len (a); l = int (s / 2); t = '\ n'; m = (l-1) * t; h = list (i.chain.from_iterable ((e * x + a [x], e * l + a [x], e * (s-1-x) + a [x]) 범위의 x) )); print (m, a, m, t.join (h [:: 3]), t.join (h [1 :: 3]), t.join (h [2 :: 3]), sep = t, end = ''); a = 입력 (); 참 : w (a); w (a [::-1]);

언 골프

itertools를 i로 가져옵니다.
데프 w (a) :
    e = ''; s = len (a); l = int (s / 2); t = '\ n'; m = (l-1) * t;
    h = list (i.chain.from_iterable ((e * x + a [x], e * l + a [x], e * (s-1-x) + a [x]) 범위의 x) )))
    print (m, a, m, t.join (h [:: 3]), t.join (h [1 :: 3]), t.join (h [2 :: 3]), sep = t, 끝 = '');
a = 입력 ();
진실한 동안 :
    w (a);
    w (a [::-1]);

이것을 빌릴 수 있습니까?
Leaky Nun

그건 그렇고, PPCG에 오신 것을 환영합니다 !
Leaky Nun

또한 끝에서 문자열을 뒤집는 것을 잊었습니다 (첫 번째 수준 들여 쓰기).
Leaky Nun

이 출력은 유효하지 않습니다. 1 단계와 5 단계에는 선행 공백이 없습니다.
James

바뀌었다! @MyHamDJ
p1714825

2

Pyth, 48 바이트

JlzK/J2#*btKz*btKM+*dG@zHVJgNN)VJgKN)VJg-JNN)=_z

온라인으로 사용해보십시오! (참고 :이 버전은 인터프리터와 충돌하기 때문에 영원히 반복되지 않는 버전입니다.)

@ByHH 가 Python 3 솔루션에서 뻔뻔 스럽게 번역 했습니다 .

작동 방식 :

JlzK/J2#*btKz*btKM+*dG@zHVJgNN)VJgKN)VJg-JNN)=_z
                                                 assign('z',input())
Jlz                                              assign("J",Plen(z))
   K/J2                                          assign("K",div(J,2))
       #                                         loop-until-error:
        *btK                                      imp_print(times(b,tail(K)))
            z                                     imp_print(z)
             *btK                                 imp_print(times(b,tail(K)))
                                                  @memoized
                 M                                def gte(G,H):
                  +*dG@zH                          return plus(times(d,G),lookup(z,H))
                         VJ   )                   for N in num_to_range(J):
                           gNN                     imp_print(gte(N,N))
                               VJ   )             for N in num_to_range(J):
                                 gKN               imp_print(gte(K,N))
                                     VJ     )     for N in num_to_range(J):
                                       g-JNN       imp_print(gte(minus(J,N),N))
                                             =_z  assign('z',neg(z))

이 출력은 유효하지 않습니다. 1 단계와 5 단계에는 선행 공백이 없습니다.
James

지금 괜찮아 ???
Leaky Nun

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