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

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 .


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.


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)

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

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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.