Rekonstruksi Rectangle Teks dari Strip Diagonal

10

Tantangan ini terinspirasi oleh pertanyaan SO tentang melintasi matriks dengan menghitung semua strip diagonal.

Alih-alih sebuah matriks, pertimbangkan blok teks:

ABCD
EFGH
IJKL

Melintasi diagonal SW-NE blok ini dari kiri ke kanan, mulai dari sudut kiri atas dan berakhir di kanan bawah, menghasilkan output sebagai berikut:

A
EB
IFC
JGD
KH
L

Tantangan

Tulis program atau fungsi yang menjalankan kebalikan dari proses yang dijelaskan di atas. Artinya, diberi set strip diagonal SW-NE, output blok teks yang memproduksinya.

Masukan dan keluaran

Baik input dan output dapat direpresentasikan sebagai string dengan baris baru, atau array / daftar string.

Mengejar baris baru adalah opsional.

Input akan terdiri dari setidaknya satu karakter yang dapat dicetak dan dapat dianggap benar (tidak akan ada panjang baris yang tidak konsisten).

Blok output akan selalu memiliki jumlah kolom lebih besar dari atau sama dengan jumlah baris.

Uji Kasus

Memasukkan:

A

Keluaran:

A

Memasukkan:

.
LI
PO.
PV.
CE
G

Keluaran:

.I..
LOVE
PPCG

Memasukkan:

M
DA
AIT
LAR
SGI
/OX
/N
/

Keluaran:

MATRIX
DIAGON
ALS///
Cristian Lupascu
sumber
Apakah string input berisi spasi?
kirbyfan64sos
Juga, apakah trailing whitespace diizinkan?
kirbyfan64sos
@ kirbyfan64sos Ya, input mungkin berisi spasi. Trailing whitespace diizinkan.
Cristian Lupascu

Jawaban:

5

CJam, 23 20 byte

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

Coba di sini .

Lynn
sumber
Mengambil keuntungan dari format input (dan tidak melanggar spasi):{_z,,Nf*W%\.+zW%sN%}
Dennis
@ Dennis Apakah saya menghitung kurung kurawal, karena itu "fungsi"? Saya baru mengenal golf CJam.
Lynn
Iya. Blok (dengan kurung keriting) adalah alternatif terdekat CJam dengan fungsi anonim / lambda, jadi ini dihitung sebagai 20 byte.
Dennis
3

Python 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 dan output adalah daftar string.

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

Daftar baris Lke keluaran dibangun saat kita membaca input. Setiap karakter baru ditambahkan ke baris, mulai dari baris terakhir i=-1dan maju ke depan.

Setiap kali baris baru untuk add terlalu panjang untuk daftar, baris kosong baru ditambahkan: L+=[''][:len(w)-len(L)]. Saya berharap cara untuk mempersingkat bagian ini.

Tidak
sumber
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

Membaca semua baris dari input, lalu mengubahnya menjadi daftar daftar. Loop sementara daftar itu memiliki elemen. Dalam setiap iterasi, ia mengeluarkan elemen terakhir dari jumlah daftar dalam yang sama dengan jumlah kolom dalam output. Daftar ini kemudian dibersihkan dan garis dicetak.

Contoh:

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

Terima kasih kepada w0lf untuk menghemat 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)
Celeo
sumber
Apakah yang terakhir s=''dibutuhkan?
Cristian Lupascu
Ah, itu menyelinap di sana; Terima kasih!
Celeo
0

Python, 332 325 byte

Karena 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")]
RK.
sumber
1
Ini adalah pertanyaan [kode-golf], yang artinya jawaban harus berusaha sesingkat mungkin. Coba hapus beberapa spasi putih dan sederhanakan algoritma Anda untuk menghemat lebih banyak ruang. Lihat sumber daya hebat ini tentang bermain golf di python jika Anda membutuhkan ide.
DankMemes
Saya akan memeriksanya, terima kasih!
RK.