Çapraz Şeritlerden Metin Dikdörtgeni Yeniden Oluşturma


10

Bu zorluk, tüm çapraz şeritlerini numaralandırarak bir matrisin çaprazlanması hakkında bir SO sorusundan esinlenmiştir .

Bir matris yerine, bir metin bloğu düşünün:

ABCD
EFGH
IJKL

Sol üst köşeden başlayıp sağ altta biten bu bloğun SW-NE köşegenlerini soldan sağa doğru çevirmek aşağıdaki çıktıyı verir:

A
EB
IFC
JGD
KH
L

Meydan okuma

Yukarıda açıklanan işlemin tersini yürüten bir program veya işlev yazın. Yani, bir set SW-NE diyagonal şerit verildiğinde, onu üreten metin bloğunu çıktılar.

Giriş ve çıkış

Hem giriş hem de çıkış, yeni satırlı dizeler veya dizeler / dizeler listesi olarak temsil edilebilir.

Sondaki yeni satırlar isteğe bağlıdır.

Giriş en az bir yazdırılabilir karakterden oluşur ve doğru olduğu varsayılabilir (tutarsız satır uzunlukları olmayacaktır).

Çıktı bloğunda her zaman satır sayısından büyük veya ona eşit sayıda sütun bulunur.

Test Durumları

Giriş:

A

Çıktı:

A

Giriş:

.
LI
PO.
PV.
CE
G

Çıktı:

.I..
LOVE
PPCG

Giriş:

M
DA
AIT
LAR
SGI
/OX
/N
/

Çıktı:

MATRIX
DIAGON
ALS///

Giriş dizeleri boşluk içerecek mi?
kirbyfan64sos

Ayrıca, sondaki boşluklara izin verilir mi?
kirbyfan64sos

@ kirbyfan64sos Evet, giriş boşluk içerebilir. Sondaki boşluklara izin verilir.
Cristian Lupascu

Yanıtlar:


5

CJam, 23 20 bayt

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

Burada deneyin .


Giriş formatından yararlanma (ve boşlukları {_z,,Nf*W%\.+zW%sN%}
Dennis

@Dennis Kıvırcık parantezleri sayıyorum, çünkü bu bir "fonksiyon" mu? CJam golf için yeniyim.
Lynn

Evet. Blok (süslü parantez ile) CJam'ın anonim bir işleve / lambda'ya en yakın alternatifidir, bu nedenle bu 20 bayt olarak sayılır.
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

Girdi ve çıktı dizelerin listeleridir.

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

LÇıktıyı okudukça çıktılanacak satırların listesi oluşturulur . Her yeni karakter, son satırdan başlayıp i=-1öne doğru ilerleyen bir satıra eklenir .

Eklenti yeni hat listesi için çok uzun zaman, yeni bir boş satır eklenir: L+=[''][:len(w)-len(L)]. Bu kısmı kısaltmanın bir yolunu umuyorum.


1

Piton 2, 165 162 169 163 bayt

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

Girişteki tüm satırları okur, sonra bunları bir liste listesine dönüştürür. Bu listede öğeler varken döngüler. Her yinelemede, çıktıdaki sütun sayısına eşit iç liste sayısından son öğeyi açar. Liste daha sonra temizlenir ve çizgi yazdırılır.

Örnekler:

$ 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 bayt tasarruf için w0lf teşekkürler .

PYG , 139 bayt

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)

Son s=''gerekli mi?
Cristian Lupascu

Ah, orada gizlice sızdı; Teşekkürler!
Celeo

0

Python, 332 325 bayt

Çünkü 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
Bu [kod-golf] sorusudur, yani cevaplar mümkün olduğunca kısa olmalıdır. Daha fazla yer kazanmak için bazı boşlukları kaldırmayı ve algoritmanızı basitleştirmeyi deneyin. Eğer fikir gerekiyorsa python golf bu büyük kaynak göz atın .
DankMemes

Ben kontrol edeceğim, teşekkürler!
RK.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.