Zrekonstruuj prostokąt tekstowy z ukośnych pasków

10

Wyzwanie to jest inspirowane pytaniem SO o przemierzanie matrycy poprzez wyliczenie wszystkich jej ukośnych pasków.

Zamiast matrycy rozważ blok tekstu:

ABCD
EFGH
IJKL

Przechodzenie po przekątnych SW-NE tego bloku od lewej do prawej, zaczynając od lewego górnego rogu i kończąc w prawym dolnym rogu, daje następującą informację wyjściową:

A
EB
IFC
JGD
KH
L

Wyzwanie

Napisz program lub funkcję, która wykonuje odwrotność wyżej opisanego procesu. To znaczy, biorąc pod uwagę zestaw pasków ukośnych SW-NE, wypisz blok tekstu, który go wytworzył.

Wejście i wyjście

Zarówno dane wejściowe, jak i wyjściowe mogą być reprezentowane jako ciągi znaków z nowymi liniami lub tablice / listy ciągów.

Końcowe znaki nowej linii są opcjonalne.

Dane wejściowe będą składały się z co najmniej jednego znaku do wydrukowania i można założyć, że są poprawne (nie będzie niespójnych długości wierszy).

Blok wyjściowy zawsze będzie miał liczbę kolumn większą lub równą liczbie wierszy.

Przypadki testowe

Wejście:

A

Wynik:

A

Wejście:

.
LI
PO.
PV.
CE
G

Wynik:

.I..
LOVE
PPCG

Wejście:

M
DA
AIT
LAR
SGI
/OX
/N
/

Wynik:

MATRIX
DIAGON
ALS///
Cristian Lupascu
źródło
Czy łańcuchy wejściowe będą zawierać spacje?
kirbyfan64sos
Czy dozwolone są również końcowe białe znaki?
kirbyfan64sos
@ kirbyfan64sos Tak, dane wejściowe mogą zawierać spacje. Końcowe białe znaki są dozwolone.
Cristian Lupascu,

Odpowiedzi:

5

CJam, 23 20 bajtów

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

Wypróbuj tutaj .

Lynn
źródło
Korzystając z formatu wejściowego (i nie rozbijając spacji):{_z,,Nf*W%\.+zW%sN%}
Dennis
@Dennis Czy liczę nawiasy klamrowe, ponieważ jest to „funkcja”? Jestem nowy w CJam golfie.
Lynn
Tak. Blok (z nawiasami klamrowymi) jest najbliższą alternatywą CJam dla anonimowej funkcji / lambda, więc liczy się to jako 20 bajtów.
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

Dane wejściowe i wyjściowe są listami ciągów.

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

Lista linii Ldo wyjścia jest budowana, gdy czytamy dane wejściowe. Każda nowa postać jest dołączana do linii, zaczynając od ostatniej linii i=-1i przechodząc do przodu.

Ilekroć nowa linia, aby dodać zbyt długo na liście, nowy pusty wiersz jest: L+=[''][:len(w)-len(L)]. Mam nadzieję na sposób skrócenia tej części.

xnor
źródło
1

Python 2, 165 162 169 163 bajtów

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

Odczytuje wszystkie wiersze z wejścia, a następnie zamienia je w listę list. Pętle, podczas gdy ta lista zawiera elementy. W każdej iteracji wyskakuje ostatni element z liczby list wewnętrznych równych liczbie kolumn na wyjściu. Lista jest następnie czyszczona, a linia drukowana.

Przykłady:

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

Dzięki w0lf za oszczędność 6 bajtów.

PYG , 139 bajtów

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
źródło
Czy ostatni jest s=''potrzebny?
Cristian Lupascu,
Ach, wkradło się tam; dzięki!
Celeo
0

Pyton, 332 325 bajtów

Ponieważ 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.
źródło
1
To jest pytanie [code-golf], co oznacza, że ​​odpowiedzi muszą być możliwie krótkie. Spróbuj usunąć trochę białych znaków i uprościć algorytm, aby zaoszczędzić więcej miejsca. Sprawdź ten świetny zasób na temat gry w golfa w pythonie, jeśli potrzebujesz pomysłów.
DankMemes,
Sprawdzę to, dzięki!
RK.