대각선 스트립에서 텍스트 사각형 재구성


10

이 도전은 모든 대각선 스트립을 열거하여 행렬을 통과하는 것에 대한 SO 질문에서 영감을 얻었습니다 .

행렬 대신 텍스트 블록을 고려하십시오.

ABCD
EFGH
IJKL

왼쪽 상단에서 시작하여 오른쪽 하단에서 끝나는이 블록의 SW-NE 대각선을 왼쪽에서 오른쪽으로 이동하면 다음과 같은 결과가 나타납니다.

A
EB
IFC
JGD
KH
L

도전

위에서 설명한 과정의 역순을 수행하는 프로그램이나 함수를 작성하십시오. 즉, SW-NE 대각선 스트립이 설정되면이를 생성 한 텍스트 블록이 출력됩니다.

입력과 출력

입력과 출력 모두 줄 바꿈이있는 문자열 또는 문자열의 배열 / 목록으로 표시 될 수 있습니다.

후행 줄 바꿈은 선택 사항입니다.

입력은 하나 이상의 인쇄 가능한 문자로 구성되며 올바른 것으로 간주 될 수 있습니다 (행 길이가 일치하지 않음).

출력 블록에는 항상 행 수보다 크거나 같은 열 수가 있습니다.

테스트 사례

입력:

A

산출:

A

입력:

.
LI
PO.
PV.
CE
G

산출:

.I..
LOVE
PPCG

입력:

M
DA
AIT
LAR
SGI
/OX
/N
/

산출:

MATRIX
DIAGON
ALS///

입력 문자열에 공백이 포함됩니까?
kirbyfan64sos

또한 후행 공백이 허용됩니까?
kirbyfan64sos

@ kirbyfan64sos 예, 입력에 공백이 포함될 수 있습니다. 후행 공백이 허용됩니다.
Cristian Lupascu

답변:


5

CJam, 23 20 바이트

{_z,,Nf*W%\.+zW%sN%}

여기서 사용해보십시오 .


입력 형식 활용 (공백 제외) :{_z,,Nf*W%\.+zW%sN%}
Dennis

@Dennis "함수"이기 때문에 중괄호를 세나요? 나는 CJam 골프를 처음 사용합니다.
Lynn

예. 블록 (중괄호 포함)은 익명 함수 / 람다에 대한 CJam의 가장 가까운 대안이므로 20 바이트로 계산됩니다.
Dennis

3

파이썬 2, 84

L=[]
for w in input():
 i=0;L+=[''][:len(w)-len(L)]
 for c in w:i-=1;L[i]+=c
print L

입력 및 출력은 문자열 목록입니다.

input: ['A','EB','IFC','JGD','KH','L']
output: ['ABCD', 'EFGH', 'IJKL']

L입력을 읽을 때 출력 할 행 목록 이 작성됩니다. 각각의 새로운 캐릭터는 마지막 줄부터 시작 i=-1하여 앞으로 나아가는 줄에 추가됩니다 .

추가 할 새 줄이 목록에 비해 너무 길면 새 빈 줄이 추가됩니다 L+=[''][:len(w)-len(L)]. 이 부분을 단축 할 수있는 방법을 찾고 있습니다.


1

파이썬 2 165 162 169 163 바이트

import sys
j=map(list,[e.strip() for e in sys.stdin.readlines()])
r=max(1,len(j)-2)
while j:
 s=''
 for b in range(r):s+=j[b].pop()
 j=[e for e in j if e]
 print s

입력에서 모든 행을 읽은 다음 목록 목록으로 바꿉니다. 해당 목록에 요소가있는 동안 루프가 발생합니다. 각 반복에서 내부 목록 수의 마지막 요소를 출력의 열 수와 동일하게 팝니다. 그런 다음 목록이 정리되고 줄이 인쇄됩니다.

예 :

$ python rectangle.py << EOF
> A
> EB
> IFC
> JGD
> KH
> L
> EOF
ABCD
EFGH
IJKL
$ python rectangle.py << EOF
> .
> LI
> PO.
> PV.
> CE
> G
> EOF
.I..
LOVE
PPCG
$ python rectangle.py << EOF
> M
> DA
> AIT
> LAR
> SGI
> /OX
> /N
> /
> EOF
MATRIX
DIAGON
ALS///

6 바이트를 절약 한 w0lf 덕분 입니다.

PYG , 139 바이트

j=M(L,[e.strip() for e in sys.stdin.readlines()])
r=Mx(1,len(j)-2)
while j:
 s=''
 for b in R(r):s+=j[b].pop()
 j=[e for e in j if e]
 P(s)

마지막으로 s=''필요한가요?
Cristian Lupascu

아, 몰래 들어갔다. 감사!
Celeo

0

파이썬, 332 325 바이트

파이썬 때문입니다.

n=[]
v=[]
x=y=-1
l=0
s=""
while 1:
 k=raw_input()
 if len(k)<1:break
 n.append(k)
while 1:
 if l>len(n):break
 y+=1
 try:
    x+=1;k=n[y][x]
    if[x,y]not in v:s+=k;v.append([x,y])
    else:raise
 except:
    try:
     x-=1;k=n[y][x]
     if[x,y]not in v:s+=k;v.append([x,y])
    except:s+="\n";x=-1;y=l;l+=1
print s[:s.rstrip("\n").rfind("\n")]

1
이것은 [code-golf] 질문이며 답변은 가능한 한 짧아야합니다. 더 많은 공간을 절약하기 위해 공백을 제거하고 알고리즘을 단순화하십시오. 아이디어가 필요한 경우 파이썬에서 골프에 관한 훌륭한 자료를 확인하십시오 .
DankMemes

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