Tái tạo một hình chữ nhật văn bản từ các đường chéo


10

Thử thách này được lấy cảm hứng từ một câu hỏi SO về việc vượt qua ma trận bằng cách liệt kê tất cả các đường chéo của nó.

Thay vì ma trận, hãy xem xét một khối văn bản:

ABCD
EFGH
IJKL

Di chuyển các đường chéo SW-NE của khối này từ trái sang phải, bắt đầu từ góc trên cùng bên trái và kết thúc ở dưới cùng bên phải, dẫn đến kết quả đầu ra sau:

A
EB
IFC
JGD
KH
L

Thử thách

Viết chương trình hoặc hàm thực thi ngược lại quá trình được mô tả ở trên. Đó là, được đưa ra một dải đường chéo SW-NE, xuất ra khối văn bản đã tạo ra nó.

Đầu vào và đầu ra

Cả đầu vào và đầu ra có thể được biểu diễn dưới dạng chuỗi với dòng mới hoặc mảng / danh sách chuỗi.

Trailing newlines là tùy chọn.

Đầu vào sẽ bao gồm ít nhất một ký tự có thể in và có thể được coi là chính xác (sẽ không có độ dài hàng không nhất quán).

Khối đầu ra sẽ luôn có số lượng cột lớn hơn hoặc bằng số lượng hàng.

Các trường hợp thử nghiệm

Đầu vào:

A

Đầu ra:

A

Đầu vào:

.
LI
PO.
PV.
CE
G

Đầu ra:

.I..
LOVE
PPCG

Đầu vào:

M
DA
AIT
LAR
SGI
/OX
/N
/

Đầu ra:

MATRIX
DIAGON
ALS///

Các chuỗi đầu vào sẽ chứa bất kỳ khoảng trắng?
kirbyfan64sos

Ngoài ra, là khoảng trắng dấu vết được phép?
kirbyfan64sos

@ kirbyfan64sos Có, đầu vào có thể chứa dấu cách. Khoảng trắng Trailing được cho phép.
Cristian Lupascu

Câu trả lời:


5

CJam, 23 20 byte

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

Hãy thử nó ở đây .


Tận dụng định dạng đầu vào (và không phá vỡ khoảng trắng):{_z,,Nf*W%\.+zW%sN%}
Dennis

@Dennis Tôi có đếm các dấu ngoặc nhọn không, vì đó là "hàm"? Tôi mới chơi golf CJam.
Lynn

Đúng. Khối (có dấu ngoặc nhọn) là thay thế gần nhất của CJam cho hàm ẩn danh / lambda, do đó, số này được tính là 20 byte.
Dennis

3

Con trăn 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

Đầu vào và đầu ra là danh sách các chuỗi.

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

Danh sách các dòng Lđể đầu ra được xây dựng khi chúng ta đọc đầu vào. Mỗi nhân vật mới được thêm vào một dòng, bắt đầu từ dòng cuối cùng i=-1và tiến về phía trước.

Bất cứ khi nào dòng mới để thêm quá dài cho danh sách, một dòng trống mới sẽ được thêm vào : L+=[''][:len(w)-len(L)]. Tôi hy vọng có một cách để rút ngắn phần này.


1

Python 2, 165 162 169 163 byte

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

Đọc tất cả các dòng từ đầu vào, sau đó biến chúng thành một danh sách các danh sách. Vòng lặp trong khi danh sách đó có các yếu tố. Trong mỗi lần lặp, nó bật phần tử cuối cùng từ số lượng danh sách bên trong bằng với số cột trong đầu ra. Danh sách sau đó được làm sạch và dòng in.

Ví dụ:

$ 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///

Cảm ơn w0lf đã lưu 6 byte.

PYG , 139 byte

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)

Là cuối cùng s=''cần thiết?
Cristian Lupascu

Ah, nó lẻn vào đó; cảm ơn!
Celeo

0

Con trăn 332 325 byte

Vì Python.

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
Đây là một câu hỏi [code-golf], có nghĩa là các câu trả lời phải cố gắng ngắn nhất có thể. Hãy thử xóa một số khoảng trắng và đơn giản hóa thuật toán của bạn để tiết kiệm nhiều không gian hơn. Kiểm tra tài nguyên tuyệt vời này về việc chơi golf trong python nếu bạn cần ý tưởng.
DankMeme

Tôi sẽ kiểm tra xem, cảm ơn!
RK.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.