일부 텍스트를 다이아몬드 화


20

2알파벳 문자로만 구성된 길이 또는 더 긴 입력 문자열 [A-Z]또는 [a-z](모두 대문자 또는 모두 소문자 인 경우 선택) 이중 다이아몬드 패턴을 형성하는 연속 문자열을 출력하십시오.

입력 문자열은 중심선에서 시작하여 입력 문자열의 끝에 도달 할 때까지 대각선으로 상하로 연장됩니다. 그런 다음 입력 문자열의 길이에서 1을 뺀 값까지 중심선 위까지 멀어 질 때까지 패턴이 대각선에서 위, 오른쪽으로 계속 진행합니다. 왼쪽, 위쪽 및 왼쪽 (중심 문자 뒤에서), 마지막으로 왼쪽 및 왼쪽으로 시작 문자로 돌아갑니다.

그것은 조금 말이 많으며 몇 가지 예에서 더 잘 설명됩니다.

"YOU"
  U   Y
 Y O U O
Y   O   U
 O Y U Y
  U   O

  ^   ^
 ↙ ↖ ↗ ↘
↘   ↗   >
 ↘ ↗ ↖ ↙
  V   V

어떻게 '보기 YOU는 처음부터 다시 루프까지 등 중심선에서 시작하여 다음과 아래쪽과 오른쪽, 다음 -와 - 권리를. 특히 Y왼쪽 위 부분이 어떻게 "뒤에" O있고 따라서 표시되지 않았 는지 유의하십시오 .

몇 가지 추가 예 :

"HI"
 I I
H H H
 I I

"TEST"
   E     E
  S T   T S
 T   T T   T
T     S     T
 E   E E   E
  S T   T S
   T     T

"HELLO"
    L       L
   O L     E L
  H   E   H   O
 E     H O     H
H       L       E
 E     L L     L
  L   E   L   L
   L H     E O
    O       H

  • 입력 및 출력은 편리한 방법 으로 제공 할 수 있습니다 .
  • 입력은 2 자 이상이어야합니다 (즉, ""입력으로 수신되지 않습니다 ).
  • STDOUT에 인쇄하거나 함수 결과로 리턴 할 수 있습니다.
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 문자가 적절하게 정렬되는 한 (예를 들어, 사각형으로 자유롭게 채울 수있는 경우) 임의의 양의 불필요한 공백이 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

실제로 중요하지는 않지만 왜 두 번째 (왼쪽 위) 패스가 첫 번째 (오른쪽 위) 패스 뒤에 있는가? 직관적이지 않으며 편지를 건너 뛰거나 다시 그리는 것이 약간 성가시다.
BradC

2
@BradC 나는 도전을 할 때 내 책상에서 Möbius 스트립을 가지고 놀고 있었고, 스트립은 "뒤에"있기 때문에 그 이유입니다. 다른 이유는 없습니다.
AdmBorkBork

화살표 문자를 사용하여 경로의 "도면"을 포함 시켜서 시각화하는 데 도움이 될 수 있습니다.
얽히고 설킨

@Shaggy 그림을 추가했습니다.
AdmBorkBork

좋은 것, 이것은 처음보다 더 도전적입니다 ..
booshlinux

답변:


10

, 17 바이트

GH<↗↘>↖↙LθθGH<Lθθ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

GH

경로를 따라 그리십시오.

<↗↘>↖↙

↘↗↗↘↙↖↖↙ 방향으로 그리십시오 ( <>두 쌍의 약자이지만 다른 쌍에는 약기가 없습니다).

Lθ

각 경로 세그먼트는 끝을 포함하여 입력 길이와 길이가 같습니다.

θ

경로를 따라 쓸 텍스트로 입력을 사용하십시오.

GH<Lθθ

중간 문자가 정확하도록 경로의 처음 두 부분을 다시 인쇄하십시오.


3
이 도전은 숯을위한 맞춤으로 보인다
Jonah

@Jonah 슬프게도 패스가 닫혀 있으면 텍스트 경로 명령이 마지막 문자를 그리지 않으므로 여기에서 역 그리기 트릭을 사용할 수 없습니다. (그렇더라도 문자열 회전에 6 바이트가 소요되므로 동일한 바이트 수입니다.)
Neil

9

05AB1E , 12 바이트

gIR7._•Íη•Λ

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

           Λ    use the canvas function
g               with the length of input for each segment
 IR7._          the input reversed and rotated left by 7 characters (we will draw this backwards to have the right center character)
      •Íη•     and the directions 1, 3, 3, 1, 7, 5, 5, 7 as a compressed number. 

당신은 의미 했습니까 1, 3, 3, 1, 7, 5, 5, 7?

아, 맞아
도리안

6

자바 스크립트 (ES6)  157 155  154 바이트

문자 행렬을 반환합니다.

s=>(y=n=s.length,y+=i=X=Y=-1,m=[...Array(y+n)].map(_=>r=Array(4*n-3).fill` `),g=x=>x?g(x-=r[m[y][++i==6*n-6||+x]=s[i%n],y-=m[y-Y]?Y:Y=-Y,x-X]?X:X=-X):m)``

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

어떻게?

nw×h

  • w=4n3
  • h=2n1

(0,n1)

다이아몬드 모양으로 건너 뛰어야하는 중심 문자의 0 기반 인덱스는 다음과 같습니다.

p=6n6

n=4

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

댓글

s => (                           // s = input string
  y = n = s.length,              // n = length of s
  y += i = X = Y = -1,           // y = n - 1; i = X = Y = -1
  m =                            // create a matrix m[]:
    [...Array(y + n)].map(_ =>   //   - of height 2n-1
      r = Array(4 * n - 3)       //   - of width 4n-3 (save one of these rows in r[])
          .fill` `               //   - initially filled with spaces
    ),                           //
    g = x =>                     // g is a recursive function taking x
      x ?                        //   if x is truthy:
        g(                       //     do a recursive call:
          x -= r[                //       update x:
            m[y][                //         update m[y][x]:
              ++i == 6 * n - 6   //           unless this is the 2nd pass through the
              || +x              //           center cell, set it to the next character
            ] = s[i % n],        //           in s (otherwise we write to m[y][true]
                                 //           instead, which has no effect)
            y -=                 //         update y:
              m[y - Y] ? Y       //           bounce vertically if m[y - Y] is undefined
                       : Y = -Y, //
            x - X                //         bounce horizontally
          ] ? X                  //         if r[x - X] is undefined
            : X = -X             //
        )                        //     end of recursive call
      :                          //   else:
        m                        //     stop recursion and return m[]
)``                              // initial call to g with x = [''] (zero-ish but truthy)

귀하의 솔루션에서 영감을 얻은 136 바이트 솔루션이 있지만 지금까지는 별도의 답변으로 자격을 갖추기에 충분할 수 있다고 생각합니다.

@Neil 아마 새로운 답변으로 게시해야합니다.
Arnauld

3

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

f=
(s,l=s.length-1,z=l*4,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `),g=x=>x--?g(x,a[a[y=(x+l)%z]?y:z-y][x>z?z+z-x:x]=s[x%-~l]):a)=>g(z+z)
<input oninput=o.textContent=f(this.value).map(c=&gt;c.join``).join`\n`><pre id=o>

2 차원 배열을 반환합니다. 중앙 셀을 자동으로 덮어 쓰도록 문자열을 배열에 그려서 끝에서부터 뒤로 향하는 대상 좌표를 직접 계산하여 작동합니다. 설명:

(s

입력 문자열.

,l=s.length-1

"바운스"사이의 거리. 마지막 행 인덱스의 절반이며 길이보다 1이 적습니다.

,z=l*4

마지막 열 색인이며 그릴 텍스트 길이의 절반입니다.

,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `)

공백 배열.

,g=x=>x--

마지막 셀에서 첫 번째 셀까지 카운트 다운합니다.

  ?g(x

나머지 셀을 처리하기위한 재귀 호출

    ,a[a[y=(x+l)%z]?y:z-y]

이 셀의 행을 계산하십시오.

      [x>z?z+z-x:x]=s[x%-~l])

이 셀의 열과 해당 셀의 문자를 계산하십시오.

  :a

배열을 반환하여 완료하십시오.

)=>g(z+z)

텍스트의 끝에서 시작하십시오.





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