Reconstruir um retângulo de texto a partir de faixas diagonais


10

Esse desafio é inspirado em uma pergunta do SO sobre o deslocamento de uma matriz, enumerando todas as suas faixas diagonais.

Em vez de uma matriz, considere um bloco de texto:

ABCD
EFGH
IJKL

Atravessar as diagonais SW-NE deste bloco da esquerda para a direita, iniciando no canto superior esquerdo e terminando no canto inferior direito, resulta na seguinte saída:

A
EB
IFC
JGD
KH
L

Desafio

Escreva um programa ou uma função que execute o inverso do processo descrito acima. Ou seja, dado um conjunto de faixas diagonais SW-NE, imprima o bloco de texto que o produziu.

Entrada e saída

Tanto a entrada quanto a saída podem ser representadas como cadeias de caracteres com novas linhas ou matrizes / listas de cadeias.

Novas linhas à direita são opcionais.

A entrada consistirá em pelo menos um caractere imprimível e pode ser assumida como correta (não haverá comprimentos de linha inconsistentes).

O bloco de saída sempre terá um número de colunas maior ou igual ao número de linhas.

Casos de teste

Entrada:

A

Resultado:

A

Entrada:

.
LI
PO.
PV.
CE
G

Resultado:

.I..
LOVE
PPCG

Entrada:

M
DA
AIT
LAR
SGI
/OX
/N
/

Resultado:

MATRIX
DIAGON
ALS///

As seqüências de entrada conterão espaços?
Kirbyfan64sos

Além disso, o espaço em branco à direita é permitido?
Kirbyfan64sos

@ kirbyfan64sos Sim, a entrada pode conter espaços. Espaço em branco à direita é permitido.
Cristian Lupascu

Respostas:


5

CJam, 23 20 bytes

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

Experimente aqui .


Aproveitando o formato de entrada (e não quebrando em espaços):{_z,,Nf*W%\.+zW%sN%}
Dennis

@ Dennis Eu conto o aparelho, porque é uma "função"? Eu sou novo no golfe CJam.
Lynn

Sim. O bloco (com colchetes) é a alternativa mais próxima do CJam a uma função anônima / lambda, portanto conta como 20 bytes.
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

Entrada e saída são listas de strings.

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

A lista de linhas La serem impressas é criada à medida que lemos a entrada. Cada novo personagem é anexado a uma linha, começando na última linha i=-1e progredindo em direção à frente.

Sempre que a nova linha para adicionar é muito longo para a lista, uma nova linha em branco é acrescentado: L+=[''][:len(w)-len(L)]. Estou esperando uma maneira de encurtar esta parte.


1

Python 2, 165 162 169 163 bytes

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

Lê todas as linhas da entrada e as transforma em uma lista de listas. Loops enquanto essa lista possui elementos. Em cada iteração, ele exibe o último elemento do número de listas internas igual ao número de colunas na saída. A lista é então limpa e a linha impressa.

Exemplos:

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

Obrigado a w0lf por salvar 6 bytes.

PYG , 139 bytes

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)

O último é s=''necessário?
Cristian Lupascu

Ah, ele esgueirou-se lá; obrigado!
Celeo

0

Pitão, 332 325 bytes

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

11
Esta é uma pergunta [code-golf], o que significa que as respostas devem tentar ser o mais curtas possível. Tente remover alguns espaços em branco e simplificar seu algoritmo para economizar mais espaço. Confira este ótimo recurso sobre golfe em python, se você precisar de idéias.
DankMemes

Vou conferir, obrigado!
RK.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.