모든 방향으로 전개


14

입력:

산출:

우리는 사각형이고 길이가 남을 때까지 1) 먼저, 우리는 입력 문자열의 끝에서 제거 특성을 가지고 (즉, 1, 4, 9, 16, 25, 36 등)에
따라서 abcdefghijklmnopqrstuvwxyz(길이 26)이된다 abcdefghijklmnopqrstuvwxy( 길이 25).

2) 그런 다음 왼쪽에서 오른쪽으로 한 번에 한 줄씩 사각형에 넣습니다.

abcde
fghij
klmno
pqrst
uvwxy

3) 우리는 이것을 다음과 같이 네 방향으로 모두 접습니다 (우리는 바깥 접힌 '블록'에 더 이상 전개 할 내부 문자가 없을 때까지 펼쳐집니다).

      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

우리가 바깥으로 접을 때 기본적으로 다음과 같이 반영됩니다 (이 예에서 '인덱스'를 나타내는 설명으로 추가 된 숫자).

왼쪽을 접을 때 :

 123    to:   321 123
fghij         ihgf   j

우리가 오른쪽을 접을 때 :

 123    to:    123 321
fghij         f   jihg

우리가 위로 접을 때 :

            3q
            2l
            1g
  b   to:    b
 1g         1
 2l         2
 3q         3
  v          v

아래쪽으로 접을 때 :

 b          b
1g         1
2l         2
3q         3
 v   to:    v
           3q
           2l
           1g

도전 규칙 :

  • 입력에 항상 1 자 이상 (출력도 포함됨)이 있다고 가정 할 수 있습니다.
  • 출력 형식은 유연하므로 STDOUT 또는 STDERR로 인쇄 할 수 있습니다. 문자열 배열 / 목록 또는 문자 2D 배열로 반환합니다. 줄 바꾸기가있는 단일 문자열; 기타
  • 입력은 영숫자 ( a-zA-Z0-9) 만 포함합니다.
  • 영숫자가 아닌 문자를 사용하여 도트와 같이 ASCII 아트 출력의 주변 및 / 또는 주변의 공간을 채울 수 .있습니다.
  • 후행 공백과 단일 후행 줄 바꾸기는 선택 사항입니다.
  • 접힌 바깥 쪽 '블록'에 더 이상 중심이 펼쳐지지 않을 때까지 전개를 계속합니다.

일반 규칙:

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

테스트 사례 :

Input: abcdefghijklmnopqrstuvwxy
Output:
      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

Input: A
Ouput:
A

Input: ThisIsATest
Output:
  I
 Thi
Is sI
 ATe
  I

Input: HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars
Output:

               An
               ch
              xamp
              i  I
              o  E
              quar
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
            HowAbout
      oLyreVA      noLyreV
  xampl    Eg      el    Examp
hci  Is    hW      As    hi  Ihc
nAo  Ev    sl      ev    so  EnA
  quare    Sn      Ie    Squar
      Odaetsn      fOdaets
            OddOneAn
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
              xamp
              i  I
              o  E
              quar
               An
               ch

Input: Lenght7
Output:
Le
ng

Input: abc
Output:
a

"HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars"에 대한 테스트에서 실수가 발생했습니다 : 'h'-> 'i'출력 하단 근처
ngn

답변:


5

SOGL V0.12 , 75 바이트

l√u²m√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚

여기 사용해보십시오!

이것은 스택의 입력을 예상하므로 사용하기 쉽기 때문에 ,처음에 추가 했습니다. 입력에 숫자 만 포함되어 있으면 문제가 발생할 수 있으므로 여기 에 테스트에 적합합니다.

70 바이트도 √lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚작동하지만 문자열 에서만 구현되었으므로 문서에서 길이를 계산하지 않을 것이라고 언급하지 않았습니다.

설명:

creating a square from the input

l       get the length of the input
 √      get its square root
  u     floor that
   ²    square it
    m   mold the input to that length
     √  convert it to a square

creating the unfoldings of the square - the idea is to cut out the inner squares to a new array

lH»{                              } (length-1)//2 times do
    ā;                                push an empty array below ToS
      l⁾                              push ToS.length - 2 (ToS here is the square or the previous unfolding)
        :A                            save a copy of that in the variable A
          ∫B                    }     repeat that amount of times, saving iteration on B - cutting the inner square to the empty array
            a{                 }        variable A times do
              bIw                         get the b+1th row of the previous unfolding
                 FIW                      get the (current loops iteration + 1)th character of that
                    h                     swap the 2 items below ToS - so the stack now is [..., prevUnfolding, newArray, character]
                     Fbž                  at [current loops iteration; b] insert that character in the array
                        ;                 swap the top 2 items - the stack now is [..., newArray, prevUnfolding]
                         FIbI@ž           at [current loops iteration+1; b+1] insert a space
                                 ;    get the now not empty array ontop of the stack

add the horizontal unfoldings

¹                    wrap the stack in an array
 K                   push the 1st item of that, which will function as the canvas
  ⁴{              }  iterate over a copy of the remaining items
    ē2\⌡               repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        ±                reverse the array horizontally
         e{  }         repeat e times
           @Κ            add a space before ToS
              ;⁴┼┼     add that horizontally before and after the canvas

add the veertical unfoldings

;                get the copy of the foldings above the canvas
 0E              reset the variable E to 0
   {         }   iterate the copy of the foldings
    ē2\⌡           repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        №            reverse the array vertically
         :h++      add that vertically before and after the canvas
              ╚  center the canvas vertically


@Shaggy 75 바이트 버전은이 문제 가 숫자에 대해서만 수행 되었기 때문에 유효 합니다. 내가 75 바이트 버전을 계산하지 않는 이유는 그것이 도전을 위해 내장 기능을 추가하는 허점에
빠진

4

, 120 109 바이트

AI§⪪IXLθ⁰·⁵.⁰ηFη⊞υ✂θ×ιηF⁴«AυεJ⁰¦⁰F÷⁺¹η²«F⁴«F⁻η⁺κꧧεκ⁺μκ↷A⮌EεEε§ξν嶻A⎇﹪ι²Eε⮌λ⮌εεA⎇‹ι²⁻⁺²⁺κκη⁻η⁺κκκ¿﹪ι²Mκ¹M¹κ

온라인으로 사용해보십시오! 참고 로 변경된 이후이 와 연결이 반영됩니다. 설명:

       θ          Input string
      L           Length
     X  ⁰·⁵       Raise to the power 0.5
    I             Cast to string
   ⪪       .      Split on the decimal point
  §         ⁰     Take the first element (integer part)
 I                Cast to integer
A            η    Assign to h

계산 h = int(sqrt(len(q)))합니다. ( Floor아직 구현되지 않았습니다 ...)

Fη⊞υ✂θ×ιη

입력에서 h길이 의 슬라이스를 추출합니다 h. (실제로 슬라이스를 길이로 자르는 것을 귀찮게하지 않습니다 h.) 어딘가 의 결과가 필요하기 때문에 for루프가 아닌 루프를 사용하며 이는 .MapAssignMapSlice

F⁴«

전개는 각 방향마다 한 번씩 4 번 (아래, 오른쪽, 위, 코딩 된대로 왼쪽) 발생합니다. 이 루프의 루프 변수는 i입니다.

   Aυε

얇게 썬 끈을 복사하십시오.

   J⁰¦⁰

그래서 캔버스의 기원으로 다시 이동하려면 각 펼쳐 시작 h-by- h같은 장소에서 광장.

   F÷⁺¹η²«

반복 (h+1)/2시간; 각 전개에 대해 한 번, 원래 사각형에 대해 한 번 더하십시오. 이 루프의 루프 변수는 k입니다.

          F⁴«

펼쳐진 사각형의 각면에 대해 한 번씩 4 번 반복합니다. (루프 변수를 사용하지 않습니다 l.)

             F⁻η⁺κκ         Loop h-2k times, loop variable `m`
                    §εκ     Take the `k`th row
                   §   ⁺μκ  Take the `k+m`th column
                            Implicitly print the character

펼쳐진 사각형의 한면을 인쇄하십시오. 이것이 k전개 되는 것이므로 , 정사각형은입니다 h-2k. 그리고 문자를 k원래 정사각형의 가장자리에서 빼 냅니다.

사각형의 다음면을 인쇄 할 수 있도록 피벗합니다.

               Eε       Map over the array (element `m`, index `n`)
                 Eε     Map over the array (element `x`, index `p`)
                   §ξν  Take the `n`th element of `x`
              ⮌         Reverse
             A        ε Replace the array with the result

얇게 썬 끈을 회전시킵니다. (예, 그것은 ξ. 나는 그것을 자주 사용하지 않습니다!) Eη는 외부에도 효과가 있습니다 Map. 회전은 배열의 너비를로 절단하는 편리한 부작용이 h있습니다.

             ¶»

면을 인쇄 한 후 커서가 사각형의 가장자리에서 벗어납니다. 1면의 정사각형에 대해 한 문자를 더 적게 인쇄하면 실패하고 골프는 줄어 듭니다. 이전에 피벗 한 경우 개행을 인쇄하면 커서가 모서리로 다시 이동합니다.

            ﹪ι²         Take `i` modulo 2
           ⎇            Choose either
                   ⮌ε   Reverse the array
               Eε       Map over the array (element `l`, index `m`)
                 ⮌λ     Reverse each element
          A          ε  Replace the array with the result

정사각형을 세로 또는 가로로 적절히 뒤집습니다.

           ⎇‹ι²                 If `i` < 2
                  ⁺κκ           Double `k`
                ⁺²              Add 2
               ⁻     η          Subtract `h`
                        ⁺κκ     Else double `k`
                      ⁻η        Subtract from `h`
          ≔                κ    Assign back to `k`.

다음 전개로 변위를 계산합니다.

           ﹪ι²          Take `i` modulo 2
          ¿             If not zero
              Mκ¹       `k` across and 1 down
                 M¹κ    Else 1 across and `k` down

다음 전개로 수평 또는 수직으로 적절히 움직입니다.

다음은 다음과 같은 모든 최신 숯 기능을 사용하여 얻은 97 바이트 버전에 대한 링크입니다 Floor. 온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다.


이것이 효과가 있습니까? TIO는 오류를 일으키는 것 같습니다.
LyricLy

@LyricLy Bah, 나는 영리하다고 생각했지만 실제로 작동하는지 확인하지 못했습니다. 변경 사항을 되 돌리겠습니다.
Neil

1
크랩은 슬라이스
ASCII 전용

@ ASCII-only 나에게 도움이되지 않으므로 어쨌든 곱하기 전에 정수로 잘라야합니다.
Neil

권리. 글쎄, 나는 곧 바닥을 추가하여 문제가되지 않을 것입니다 : P
ASCII 전용
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.