정사각형 스트링이 주어지면 펼쳐지는 모든 단계에서 스트링에 대한 모든 출력을 생성하십시오.
줄은 시계 방향으로 한 번에 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
). 이것은 우리에게 펼쳐지는 한 단계를 거꾸로 할 것입니다.
(}:@],{:@],[)
그냥 그렇습니다.
그것은 추가 CBA
에 ED
다음 배열의 나머지 부분과 그것을 결합한다. 따라서 우리의 결과는
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"]
.
문자열을 한 번 펼치려면의 마지막 줄 b
을 a[-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
.