끈을 펼치십시오


27

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

줄은 시계 방향으로 한 번에 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 {|} ~
  • 선행 / 후행 공백이 허용됩니다.
  • 문자열이 항상 정사각형이라고 가정 할 수 있습니다.
  • 모든 표준 허점 은 금지되어 있습니다.

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


내 프로그램 대신 () 대신 (을 )를 출력 ["A","A"]할 수 있습니까? 그들이 시작과 끝 위치이기 때문에 나에게 합리적이며, 한 번만 펼치려고합니다. "A"["A"]
Mr. Xcoder

@ Mr.Xcoder 나는 특정 테스트 사례에 맞는 코드를 추가하는 것이 바이트 낭비처럼 보입니다. 단일 바이트 입력에 대해 수락하고 그에 따라 질문을 업데이트합니다!
Dom Hastings

3
나에게서 +1, 매우 흥미로운 도전. 이 사이트는 난이도를 높이고 대부분의 솔루션의 사소함을 없애기 때문에 더 많은 것을 필요로합니다. 이것은 내가 가장 좋아하는 도전 과제 목록으로 바로갑니다. 나는 이것이 대답이 거의 없다는 것에 실망했다. 나는 다른 영리한 접근법을 정말로보고 싶다.
씨 Xcoder에게

@ Mr.Xcoder 나는 당신이 그것을 좋아해서 기쁘다! 아이디어만으로도 좋은 결과를 얻을 수 있기를 바라지 만, @ HelkaHomba 의 도전 덕분입니다 !
Dom Hastings

답변:


9

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]]]

7

파이썬 (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 아트로 출력됩니다.


Lynn의 답변과 같이 [::-1][1:]될 수 있다고 생각 [-2::-1]합니다.
Quelklef 2016 년

@Quelklef 감사합니다!
Mr. Xcoder

4

, 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⁺⟦⪫υω⟧⮌θ⮌κ현재 배열을 반전시키고, 펼쳐지지 않은 행을 앞에 붙인 다음 각 행의 문자를 반전시킨 다음 모든 것을 거꾸로 인쇄하여 원하는 결과를 생성합니다.


나는 그것을 더 숯불 방법으로 시도했지만 커서 RotateTrim명령이 커서를 떠나는 곳을 해결할 수 없었습니다 ...
Neil

3

하스켈 , 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 바이트를 절약 했습니다.


2

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

2

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.


1

파이썬 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.


1

펄 5 , 155 바이트

$"=$,;@a=map[/./g],<>;while(@a){say' 'x(length$s)."@$_"for@a[0..@a-2];say$s.="@{pop@a}";say@b=();for$i(0..$#a){$q=0;$b[$q++][$#a-$i]=$_ for@{$a[$i]}}@a=@b}

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

실제로 로직을 수정하지 않고 몇 바이트를 절약했습니다. 아래의 흐름은 여전히 ​​기본적으로 정확합니다.

# 펄 5 , 163 바이트

$"=$,;@a=map[/./g],<>;while(@a){say' 'x(length$s)."@{$a[$_]}"for 0..@a-2;say$s.="@{pop@a}";say@b=();for$i(0..$#a){$b[$_][$#a-$i]=$a[$i][$_]for 0..$#{$a[$i]}}@a=@b}

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

방법?

$"=$,; #set the array output separator to null
@a=map[/./g],<>;   # take the input as a 2-D array @a
while(@a){         # repeat while there are still things to unfurl
  say' 'x(length$s)."@{$a[$_]}"for 0..@a-2; # output all but last
                                            # line of the remaining
                                            # square
  say$s.="@{pop@a}";  # remove bottom row, add it to the unfurled string $s
                      # and output it
  say@b=();           # clear temporary array; output empty array, causing
                      # a newline to output

                      # rotate remaining shape 90 degrees:
  for$i(0..$#a){$b[$_][$#a-$i]=$a[$i][$_]for 0..$#{$a[$i]}}
  @a=@b               # replace input with rotated array
}

좋은 방법이지만, 풀기의 각 단계에서 출력이 끝난 후 모든 단계를 인쇄하도록 업데이트 할 수 있습니까? 죄송합니다!
Dom Hastings

1
좋아, 나는 그것을 다시 썼다.
Xcali

고마워요! 여분의 바이트를 발생 시켜서 죄송합니다 ...
Dom Hastings
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.