끈을 펼치십시오

정사각형 스트링이 주어지면 펼쳐지는 모든 단계에서 스트링에 대한 모든 출력을 생성하십시오.

줄은 시계 방향으로 한 번에 1/4 회전해야합니다.

입력 :

A

출력 :

A

참고 : 바이트 수를 줄이는 데 도움이되는 경우 에만 이 특정 테스트 사례에 대해 중복 된 입력을 허용합니다 .

입력 :

DC
AB

출력 :

DC
AB

  D
ABC

ABCD

입력 :

GFE
HID
ABC

출력 :

GFE
HID
ABC

   HG
   IF
ABCDE

     IH
ABCDEFG

       I
ABCDEFGH

ABCDEFGHI

입력 :

JIHG
KPOF
LMNE
ABCD

출력 :

JIHG
KPOF
LMNE
ABCD

    LKJ
    MPI
    NOH
ABCDEFG

       NML
       OPK
ABCDEFGHIJ

          ON
          PM
ABCDEFGHIJKL

            PO
ABCDEFGHIJKLMN

              P
ABCDEFGHIJKLMNO

ABCDEFGHIJKLMNOP

규칙

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

  • I / O에 일관성이 있다고 가정하면 모든 합리적인 형식을 I / O에 사용할 수 있습니다.
  • 출력의 맨 위 줄을 채우려면 공백을 사용해야합니다.
  • (공백을 포함하여 모든 인쇄 가능한 문자의 입력을 처리 할 수 있어야합니다 \x20\x7e) :
 ! "# $ % & '() * +,-. / 0123456789 :;? @ ABCDEFGHIJKLMNOPQRSTUVWXYZ [\] ^ _`abcdefghijklmnopqrstuvwxyz {|} ~
  • 선행 / 후행 공백이 허용됩니다.
  • 문자열이 항상 정사각형이라고 가정 할 수 있습니다.
  • 모든 표준 허점 은 금지되어 있습니다.

영감 : “풀린”횟수를 출력하는 사각형 프로그램을 작성하십시오 .



답변

SOGL V0.12 , 21 20 19 18 17 바이트

ø;[;ο⁴№č▓┼№TJι;jI

여기 사용해보십시오! ( 이것은 스택에 입력을 기대하기 때문에 추가됨)

설명:

ø;[;ο⁴№č▓┼№TJι;jI
ø;               push an empty string below the input           stack with the input GFE,HID,ABC
  [              while [ToS (the array) isn't empty] do       ["", [["G","F","E"],["H","I","D"],["A","B","C"]]]
                                                                stack at the second time looping
   ;               duplicate 2nd from top                     [[[H,G], [I,F], [D,E]], "ABC"]
    ο              wrap it in an array                        [[[H,G], [I,F], [D,E]], ["ABC"]]
     ⁴             duplicate 2nd from top                     [[[H,G], [I,F], [D,E]], ["ABC"], [[H,G], [I,F], [D,E]]]
      №            reverse vertically                         [[[H,G], [I,F], [D,E]], ["ABC"], [[D,E], [I,F], [H,G]]]
       č▓          join the inner arrays (┼ fails otherwise)  [[[H,G], [I,F], [D,E]], ["ABC"], ["DE", "IF", "HG"]]
         ┼         add the 2 parts together                   [[[H,G], [I,F], [D,E]], ["ABCDE", "   IF", "   HG"]]
          №        reverse vertically again                   [[[H,G], [I,F], [D,E]], ["   HG", "   IF", "ABCDE"]]
           T       print that without popping                 [[[H,G], [I,F], [D,E]], ["   HG", "   IF", "ABCDE"]]
            J      take the last line off                     [[[H,G], [I,F], [D,E]], ["   HG", "   IF"], "ABCDE"]
             ι     remove the rest of the array               [[[H,G], [I,F], [D,E]], "ABCDE"]
              ;j   remove the last line of the original array ["ABCDE", [[H,G], [I,F]]]
                I  rotate it clockwise                        ["ABCDE", [[I,H], [F,G]]]

답변

파이썬 (2) , 209 (207) 205 203 202 201 200 196 바이트

@Quelklef 덕분에 -4 바이트 !

s=input();l=len;k=''.join;exec"print s;s=[x for x in[' '*l(s[0])+k(x[:-1]for x in s[-2::-1])[t::l(s[0])-1]for t in range(l(s[0]))][:-1]+[s[-1]+k(x[-1]for x in s)[-2::-1]]if x.strip()];"*(2*l(s)-1)

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

파이썬 2 , 219217215213212211207 바이트

s=input();l=len;k=''.join;exec"print'\\n'.join(s);s=[x for x in[' '*l(s[0])+k(x[:-1]for x in s[-2::-1])[t::l(s[0])-1]for t in range(l(s[0]))][:-1]+[s[-1]+k(x[-1]for x in s)[-2::-1]]if x.strip()];"*(2*l(s)-1)

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

첫 번째는 문자열 목록으로 출력되고 두 번째는 ASCII 아트로 출력됩니다.


답변

, 42 35 바이트

AEθSθW⊟θ«⪫θ¶AEι⮌⪫Eθ§μλωθ⊞υι↙←⮌⪫υωD⎚

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : 주로 문자 배열에서 문자열로 전환하여 7 바이트를 절약했습니다. 설명:

AEθSθ

입력 제곱을 변수의 문자열 배열로 읽습니다 q.

W⊟θ«

배열의 마지막 문자열이 비어 있지 않으면 제거하십시오.

⪫θ¶

나머지 배열을 인쇄하십시오.

AEι⮌⪫Eθ§μλωθ

마지막 문자열의 각 문자를 반복하고 나머지 배열의 나머지 l모든 문자열 의 th 문자를 결합하여 나머지 배열을 회전시킵니다 .

⊞υι↙←⮌⪫υω

이전에 제거 된 마지막 문자열을에 추가합니다 u.이 값은 확장되지 않은 값을 보유하고 인쇄합니다.

D⎚

결과를 출력 한 후 다음 반복을 위해 캔버스를 지 웁니다.

이 버전은 바람직하지 않은 경우 38 바이트에 대해 별도의 행에 최종 unfurl을 출력합니다.

AEθSθW⊟θ«⊞υι←E⁺⟦⪫υω⟧⮌θ⮌κAEι⮌⪫Eθ§μλωθD⎚

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명 : ←E⁺⟦⪫υω⟧⮌θ⮌κ현재 배열을 반전시키고, 펼쳐지지 않은 행을 앞에 붙인 다음 각 행의 문자를 반전시킨 다음 모든 것을 거꾸로 인쇄하여 원하는 결과를 생성합니다.


답변

하스켈 , 127120 바이트

e=[]:e
i#[x]=[]
i#s|t<-foldl(flip$zipWith(:))e$init s,j<-i++last s=(map((j>>" ")++)(init t)++[j++last t]):j#t
f s=s:""#s

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

입력은 행 목록입니다 (예 : ["DC","AB"]두 번째 테스트 사례의 경우 출력은 행 목록 목록 임) [["DC","AB"],[" D","ABC"],["ABCD"]]. mapM (putStrLn . unlines)결과를 예쁘게 인쇄하는 데 사용 합니다.

편집 : 이동 중에 찾은 것이 짧을수록 각transpose 바이트를 직접 바꾸도록 수정할 수 있기 때문에 7 바이트를 절약 했습니다.


답변

05AB1E , 18 바이트

[Dí.Bí»,¤UR¦ζŽ`Xì)

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

설명

[            Ž       # while stack is not empty, do:
 D                   # duplicate current list
  í                  # reverse each element
   .B                # pad with spaces to equal length
     í               # reverse each element again
      »,             # join with newlines and print
        ¤U           # store the last element in X
          R¦         # reverse the list and remove the first element
            ζ        # zip with spaces as filler
              `      # split elements separately to stack
               Xì    # prepend X to the last element
                 )   # join the stack to a list

답변

J, 62 바이트

|."1@([:(#~[:-.[:*/"1' '=])|.@{:(}:@],{:@],[)|:@}:)^:(1<#)^:a:

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

나는 이것이 많이 골프를 칠 수 있다고 확신합니다. 이것은 여분의 공백을 인쇄하지만 J가 출력 배열에 포함 된 배열을 동일한 모양으로 포맷하는 방식 때문입니다.

일단 들어가서 내가하고있는 일을 정확하게 언급하면 ​​골프를하는 방법에 대한 더 나은 아이디어를 얻을 수 있다고 생각합니다 (지금은 그렇게하지 않습니다 …). 골프를 목적으로하는 것은

  • 특별한 경우 1 행 입력 (루프의 while 부분)이 필요합니다
  • 공백으로 만 구성된 모든 줄을 제거해야합니다 (확실히 내장되어 있거나 더 나은 방법이 있어야합니다). 끝 근처의 필터입니다.
  • 많은 상한, 신원 기능 및 atops가 있습니다

설명

이것을 풀고, 나는 주요 기능을 세 가지로 나눌 것입니다.

unfurl_reversed   =. |.@{: (}:@] , {:@] , [) |:@}:
whitespace_filter =. #~ [: -. [: */"1 ' ' = ]
unfurl            =. |."1@(whitespace_filter @: unfurl_reversed) ^: (1 < #) ^: a:

test_case         =. 3 3 $ 'GFEHIDABC'

우리는 두 번째 테스트 사례와 함께 작업 할 것입니다.

unfurl_reversed

|.@{: (}:@] , {:@] , [) |:@}:

이렇게하면 문자열이 한 번 펼쳐지지만 반대로됩니다. 이 모든 것이 역순으로 특정 순서로 이루어 지므로 J가 문자열을 공백으로 채워서 배열의 모양과 일치하도록 올바른 간격을 제공합니다.

|:@}: 입력 축소의 전치입니다

   |:@}: test_case
GH
FI
ED

|.@{: 입력 꼬리의 반대입니다

   |.@{: test_case
CBA

우리가하고 싶은 일을 볼 수 있다고 생각합니다. 우리는 꼬리의 반전을 축소의 조옮김의 마지막 부분에 추가하고 싶습니다 (입술이지만 기본적으로 CBA끝에 붙어 있습니다 ED). 이것은 우리에게 펼쳐지는 한 단계를 거꾸로 할 것입니다.

(}:@],{:@],[) 그냥 그렇습니다.

그것은 추가 CBAED다음 배열의 나머지 부분과 그것을 결합한다. 따라서 우리의 결과는

   unfurl_reversed test_case
GH
FI
EDCBA

whitespace_filter

#~ [: -. [: */"1 ' ' = ]
                 ' ' = ]  Equate each element to space
            */"1          Product of each row (all true?)
      -.                  Negate
#~                        Filter rows that are true

기본적으로 이것은 행이 완전히 공백인지 확인하고 행이 있으면 제거합니다. 테스트 사례의 첫 번째 반복에는 아무런 작업도 수행하지 않습니다.

그렇지 않으면 결국 출력 문자열에 공백이 생길 것이므로 (적어도 대안을 찾을 때까지) 필요합니다.

펴다

|."1@(whitespace_filter @: unfurl_reversed) ^: (1 < #) ^: a:

Unfurl은 기본적으로 다른 기능과 특수한 경우 단일 문자 입력을 결합합니다.

동사의 힘 ( ^:)에 빈 상자 ( )가 주어지면, a:함수가 수렴하고 결과를 배열로 수집 할 때까지 입력에 함수를 적용합니다.

(1 < #) 행이 항상 1보다 큰지 확인합니다 (특별한 경우 1 행 입력).

|."1각 행을 반대로하여의 결과를 반전시킵니다 whitespace_filter @: unfurl.


답변

파이썬 2 , 143132 바이트

a=input()
while 1:print'\n'.join(a);b=map(''.join,zip(*map(str.strip,a[-2::-1])));a[-1]+=b.pop();a[:-1]=[len(a[0])*' '+x for x in b]

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

각 반복에서, b문자열 (제 N-1 행)의 “헤드”이고, 90도 회전 된 경우 a이다 [" NML", " OPK", "ABCDEFGHIJ"]b이다 ["ON", "PM", "KL"].

문자열을 한 번 펼치려면의 마지막 줄 ba[-1]( "ABCDEFGHIJKL"주음) a[:-1]에 추가 한 다음 의 나머지 문자열에 공백을 추가하여 다시 계산 하십시오 b.

b비어있을 때 팝업을 시도하여 종료합니다 .

파이썬 2 , 132 바이트

a=input()
while 1:s=str.strip;print'\n'.join(a);a[:-1]=[len(a[0])*' '+''.join(x)for x in zip(*map(s,a[-2::-1]))];a[-1]+=s(a.pop(-2))

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

다르게 작성된 동일한 아이디어. 요소가 하나만 a.pop(-2)있을 때 시도하여 종료합니다 a.