우리는 우리가 시작한 곳을 끝내었다!…


29

도전:

입력:

두 개의 입력을받습니다
.-인쇄 가능한 ASCII 만 포함하는 문자열 (공백, 탭 또는 줄 바꿈 제외)
-인쇄 가능한 ASCII 문자

산출:

첫 번째 줄에는 문자열 입력이 포함됩니다. i이 문자의 -modulo-3이 처음 나타날 때마다 동남쪽으로 이동합니다. 모든 i-modulo-3 초 마다 남쪽 방향으로 움직입니다. 모든 i-modulo-3 세 번째 발생은 남서 방향으로 이동합니다. 문자가 처음 시작 위치에 다시 올 때까지 계속 진행 한 다음 (필요한 경우 한쪽에서 다른쪽으로 줄 바꿈 함) 문자열 입력과 함께 마지막 줄을 다시 인쇄합니다. 끝내세요. (모든 테스트 케이스는 length(input)후행 입력을 포함하는 행을 포함하여 대부분의 행 이후에 초기 입력으로 끝납니다 . 아래 첫 번째 테스트 케이스에서 볼 수 있듯이 길이는 14 일이지만 더 빨리 끝날 수 있습니다. 9.)

이것은 모두 모호 할 수 있으므로 여기에 예제가 있습니다.

테스트 사례 1 :

문자열 입력 : "This_is_a_test"
문자 입력 :'s'

산출:

This_is_a_test
    s s    s  
     ss   s   
      s  s    
      sss     
      sss     
      s  s    
     ss   s   
    s s    s  
This_is_a_test

다음은 세 가지의 색상이 지정된 동일한 테스트 사례입니다 s.

여기에 이미지 설명을 입력하십시오

여기서 첫 번째 's'는 남동 방향으로 녹색 경로를 따라갑니다. 두 번째 's'는 남쪽 방향으로 노란색 경로를 따릅니다. 세 번째 's'는 남서 방향으로 하늘색 경로를 따릅니다. (4 분의 1이 's'있다면 남동쪽 방향으로 다시갑니다. 아래의 다른 테스트 사례에서 볼 수 있습니다.)

도전 규칙 :

  • 입력은 인쇄 가능한 ASCII 만 포함합니다 (공백, 탭 및 줄 바꾸기 제외).
  • I / O 형식은 유연합니다. 줄 바꿈 문자열, 문자 매트릭스 등이 될 수 있습니다.
  • 주어진 문자가 문자열에 없을 수 있습니다.이 경우 입력 문자열을 한두 번 출력 "test", 'a'할 수 있습니다 (예 : 가능한 출력 : "test\ntest"/ "test").
  • 선행 공간은 필수입니다. 후행 공백은 선택 사항입니다. 하나 또는 여러 개의 선행 / 후행 개행이 허용됩니다.

일반적인 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙이 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 리턴 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 링크를 추가하십시오.
  • 또한 필요한 경우 설명을 추가하십시오.

테스트 사례 / 추가 예 :

테스트 사례 2 :

문자열 입력 : "abcabcabcabcabc"
문자 입력 :'b'

산출:

abcabcabcabcabc
  b b b    b b 
   bbb      bb 
    b        b 
   bbb       bb
b b b b      b 
 b  b  b     b 
b b b   b    b
   bb    b   bb
    b     b  b 
    bb     bbb
    b b    bbb 
    b  b  b  b 
    b   bb   bb
b   b   bb   b 
abcabcabcabcabc

다음은 다섯 가지 경로의 색상이 동일한 테스트 사례입니다 a.

여기에 이미지 설명을 입력하십시오

테스트 사례 3 :

문자열 입력 : "only_two_paths?"
문자 입력 :'o'

산출:

only_two_paths?
 o     o       
  o    o       
   o   o       
    o  o       
     o o       
      oo       
       o       
       oo      
       o o     
       o  o    
       o   o   
       o    o  
       o     o 
       o      o
only_two_paths?

다음은 두 가지 색상의 경로가있는 동일한 테스트 사례입니다 o.

여기에 이미지 설명을 입력하십시오

테스트 사례 4 :

문자열 입력 : "lollollollollol"
문자 입력 :'l'

산출:

lollollollollol
lll   ll  ll   
 ll   ll  ll   
l ll ll ll ll  
  lll l ll l ll
  llllll  ll ll
l l  ll    ll  
 ll  lll   ll  
l l l lll ll l 
  ll  l ll l  l
l l l l llll l 
 ll  lll  lll  
l l   l    ll  
  ll lll  lllll
  l l l ll l ll
lollollollollol

다음은 열 가지의 색상이 지정된 동일한 테스트 사례입니다 l.

여기에 이미지 설명을 입력하십시오

테스트 사례 5 :

문자열 입력 : "AbCdEeDcBaAbCdEeDcBa_CCCCC"
문자 입력 :'C'

산출:

AbCdEeDcBaAbCdEeDcBa_CCCCC
C  C        C       C  C  
 C  C       C      C  CCC 
  C  C      C     C  C C C
C  C  C     C    C  C  C  
 C  C  C    C   C  C   C  
  C  C  C   C  C  C    C  
   C  C  C  C C  C     C  
    C  C  C CC  C      C  
     C  C  CC  C       C  
      C  C CC C        C  
       C  C CC         C  
        CC CC C        C  
        CC CC  C       C  
       C  C CC  C      C  
      C  C CC C  C     C  
     C  C   C  C  C    C  
    C  C    CC  C  C   C  
   C  C     C C  C  C  C  
  C  C      C  C  C  C C  
 C  C       C   C  C  CC  
C  C        C    C  C  C  
  C         C     C  C CCC
 C          C      C  CCCC
C           C       C  C  
 C          C        CCCCC
AbCdEeDcBaAbCdEeDcBa_CCCCC

다음은 일곱 가지의 색이 지정된 경로와 동일한 테스트 사례입니다 C.

여기에 이미지 설명을 입력하십시오

테스트 사례 6 :

문자열 입력 : "XyX"
문자 입력 :'X'

산출:

XyX
 XX
  X
XyX

다음은 두 가지 색상의 경로가있는 동일한 테스트 사례입니다 X.

여기에 이미지 설명을 입력하십시오

테스트 사례 7 :

문자열 입력 : "aaaa"
문자 입력 :'a'

산출:

aaaa
aa  
aaa 
 aaa
aaaa

다음은 네 가지의 색상이 지정된 동일한 테스트 사례입니다 a.

여기에 이미지 설명을 입력하십시오


따라서 문자열에 3의 배수가 포함되어 있으면 출력이 문자열 길이보다 적은 행을 가질 수 있습니까?
Neil

@ Neil 3의 배수인지 확실하지 않으므로 많이 조사하지 않았습니다. 내가 아는 것은 대부분 length(input)모든 것이 다시 일치하지만 첫 번째 테스트 사례가 입증되면 더 빠를 수 있다는 것입니다. 그러나 실제로 3 부분의 배수에 대해서는 당신이 옳은 것 같습니다 (100 % 확실하지는 않지만).
케빈 크루이 센

@Neil 문자가 한 번에 3 번만 나타나는 문자열은 3 줄을 인쇄하지만 길이는
Asone Tuhid

인쇄 된 두 줄 사이에 새 줄이 허용됩니까?
Asone Tuhid

@AsoneTuhid 죄송하지만 없습니다. 예상되는 전체 출력 전후에 어떤 양의 후행 또는 선행 개행에 신경 쓰지 않지만 줄 사이에는 허용하지 않습니다. 대각선도 더 이상 정확하지 않습니다 ..
Kevin Cruijssen

답변:


1

Stax , 24 바이트

»v↕*δó‼Γ█|q┬YM╨|·£↕fßßZo

온라인으로 실행 및 디버깅

이것은 동일한 프로그램의 ASCII 표현입니다.

YxP|Ic{{i3%v-x%%mb-!Czny&PWxP

모든 문자의 색인을 가져온 다음 원래 색인과 동일하게 설정 될 때까지 변경합니다. 모든 변경에 대해 해당 색인에 문자가 포함 된 문자열을 출력하십시오.

Y                               Store character in y.  Now the inputs are x and y.
 xP                             Print x.
   |Ic                          Get all indices of y in x. Make a copy.
      {                   W     Loop until cancelled.
       {        m               Map index array using block.
        i3%v-                   Subtract i%3-1 from each element. i is the loop index.
             x%%                Modulo len(x)
                 b-!            Is the mutated array set-equal to the original?
                    C           If so, cancel W loop
                     zny&P      Print a string with y at all specified indices
                           xP   Finally, print x again

8

펄 (5) , -plF 101 (100) 99 98 97 96 바이트

\0리터럴 0 바이트로 바꾸면 96이됩니다. 온라인으로 시도 링크에는 리터럴 0 문자를 입력 할 수 없기 때문에 97 바이트가 있습니다.

#!/usr/bin/perl -plF
say;say$$l=~y/\0/ /runtil--$l,(s:\Q${\<>}:$$l|=v0 x((++$#$l%3*$l-$l+"@-")%@F).$&;v0:oreg^$$l)eq$_

코드 골프 펄 형광펜은 #의견을 시작 한다고 생각 합니다. 순진한 😈

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

작동 원리

$l첫 번째 행 이후의 행에 대한 카운터입니다 (카운트 다운합니다 (예 : 맨 위 문자열 아래의 3 행에 대해 -3)). 첫 번째 문자열을 한 번 인쇄 한 후 반복적으로 다음을 수행합니다.

첫 번째 문자열에서 대상 문자의 발생을 검색하고 표시 할 오프셋을 계산 (++$#$l%3*$l-$l+"@-")%@F합니다. 현재 위치와 줄 번호 (음수) 시간 -1, 0, 1(순환)을 더한 값 입니다. 많은 시간이 문자열 구축 \0대상 문자와 다음 or어큐뮬레이터에 있음을 $$l(각각 다른 누적입니다 $l및 이유 $l카운트 다운 대신 때문에 최대 $1, $2등 읽기 전용이). $#$l루프를 통해 매번 다른 배열을 시뮬레이션 합니다. 결과는 공백 $l\0아닌 th 행 입니다.

첫 번째 문자열의 대상 문자는로 바뀌 \0므로 \0대상 캐릭터의 원래 위치에서 "구멍"이있는 원래 문자열로 끝납니다 . 당신이 만약 xor누적으로 구멍이 채워지는 것을 경우 그 결과는 원래의 문자열이 될 수 있도록 누적는, 원래의 위치에서 대상 문자가있는 경우에만. 루프를 종료하는 데 사용됩니다. 루프가 완료되지 않은 경우 어큐뮬레이터를 \0공백 으로 교체하여 인쇄하십시오 .

루프가 종료되면 -p옵션이 다시 한 번 첫 번째 문자열을 인쇄하고 프로그램이 완료됩니다.

대상 캐릭터는 다소 까다로운 방식으로 선택됩니다. 이 ${\<>}변환은 STDIN에서 읽은 행을 참조로 변환 한 다음 정규식에서 즉시 역 참조되고 대체됩니다. \Q접두사는 정규 표현식 (같은 특수 모든 문자를 탈출 .하고 *). 는 \E암시이다. o수정은 검색 부분을 다시 평가 없지만 단지 (STDIN 아무것도 더 이상 존재하지 않기 때문에 어떤 좋은) 이후의 모든 경기에서 반복 않을됩니다.


널 바이트를 직접 넣을 수는 없지만 bash 또는 다른 것으로 실행할 수 있다고 생각합니다 .
FryAmTheEggman

@FryAmTheEggman 고마워, 좋은 피하다. 그러나 나는 귀찮게 생각하지 않습니다. 사람들은 저 스스로 그것을 시험해보고 싶지 않다면 저를 믿어야 할 것입니다 :-)
Ton Hospel

완전히 공정하지만 사람들이 볼 수 있도록 의견을 남길 것입니다. 멋진 골프, 그런데 :)
FryAmTheEggman

4

파이썬 (2) , 199 (193) 191 바이트

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;break
 print''.join((' '+c)[i in j]for i in r(l))

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


루프가 예외를 통해 종료 될 수있는 경우 :

파이썬 2 , 187 바이트

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;q
 print''.join((' '+c)[i in j]for i in r(l))

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


  • Jonathan Frech 덕분에 -4 바이트
  • Lynn 덕분에 -2 바이트

가능한 189 바이트 (예외를 통해 루프를 종료)
Jonathan Frech

(j[i]-i%3+1)%l2 바이트 동안 한 쌍의 parens를 넣을 수 있습니다 .
Lynn

2

C (gcc) , 261 바이트

i,j,l,k;g(L,t,r,c)char**L;{L[r++][c]=k;c-=t?t-1?:0:-1;l<r||g(L,t,r,c<0?l-1:c%l);}f(S,K){char*s=S,*L[i=1+(l=strlen(s))];for(k=K;i--;)for(L[i]=calloc(j=l,1);j--;)L[i][j]=32;for(puts(s);s[++i];)s[i]-k||g(L,++j%3,0,i);for(i=1;strcmp(*L,L[i]);)puts(L[i++]);puts(s);}

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


2

자바 스크립트 (Node.js) , 197 194 바이트

s=>c=>{(C=console.log)(s);w=0;g=[];while(~(w=s.indexOf(c,w)))g.push(w++);h=(H=_=>g.map(x=>A[x]=c,A=Array(l=s.length).fill` `)&&A.join``)();while(h!=(y=H(g=g.map((x,i)=>(l-~x-i%3)%l))))C(y);C(s)}

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

카레 구문으로 입력을 f(s)(c)받습니다 ( 예 :) .

전혀 완벽한 것은 아니지만 JS가 필요합니다. 기능에 많은 기능이 있습니다.



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