Восстановить текстовый прямоугольник из диагональных полос


10

Эта задача вдохновлена SO вопросом о обходе матрицы путем перечисления всех ее диагональных полос.

Вместо матрицы рассмотрим блок текста:

ABCD
EFGH
IJKL

Обход диагоналей SW-NE этого блока слева направо, начиная с левого верхнего угла и заканчивая правым нижним, приводит к следующему выводу:

A
EB
IFC
JGD
KH
L

Вызов

Напишите программу или функцию, которые выполняют обратную процедуру, описанную выше. То есть, с учетом набора диагональных полос SW-NE, выведите блок текста, который его создал.

Вход и выход

И вход, и выход могут быть представлены как строки с символами новой строки или массивами / списками строк.

Конечные переводы строки не обязательны.

Ввод будет состоять как минимум из одного печатаемого символа и может считаться правильным (не будет несовместимой длины строки).

Выходной блок всегда будет иметь количество столбцов, большее или равное количеству строк.

Тестовые случаи

Входные данные:

A

Вывод:

A

Входные данные:

.
LI
PO.
PV.
CE
G

Вывод:

.I..
LOVE
PPCG

Входные данные:

M
DA
AIT
LAR
SGI
/OX
/N
/

Вывод:

MATRIX
DIAGON
ALS///

Будут ли входные строки содержать пробелы?
kirbyfan64sos

Кроме того, разрешены ли пробелы в конце?
kirbyfan64sos

@ kirbyfan64sos Да, входные данные могут содержать пробелы. Конечный пробел разрешен.
Кристиан Лупаску

Ответы:


5

CJam, 23 20 байт

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

Попробуй это здесь .


Воспользовавшись форматом ввода (и не разбивая на пробелы):{_z,,Nf*W%\.+zW%sN%}
Деннис

@ Денис Считаю ли я фигурные скобки, потому что это «функция»? Я новичок в гольф CJam.
Линн

Да. Блок (с фигурными скобками) является ближайшей альтернативой CJam анонимной функции / лямбда, поэтому он считается 20 байтами.
Деннис

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: ['A','EB','IFC','JGD','KH','L']
output: ['ABCD', 'EFGH', 'IJKL']

Список строк Lдля вывода строится, когда мы читаем ввод. Каждый новый символ добавляется в строку, начиная с последней строки i=-1и продвигаясь вперед.

Всякий раз , когда новая линия , чтобы добавить слишком много времени для списка, новая пустая строка добавляется: L+=[''][:len(w)-len(L)]. Я надеюсь на способ сократить эту часть.


1

Python 2, 165 162 169 163 байта

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

Читает все строки из ввода, затем превращает их в список списков. Циклы, пока в этом списке есть элементы. В каждой итерации он выталкивает последний элемент из числа внутренних списков, равного количеству столбцов в выходных данных. Затем список очищается и печатается строка.

Примеры:

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

Спасибо w0lf за сохранение 6 байтов.

PYG , 139 байт

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)

Последний s=''нужен?
Кристиан Лупаску

Ах, он пробрался туда; Спасибо!
Celeo

0

Python, 332 325 байт

Потому что питон.

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
Это вопрос [code-golf], что означает, что ответы должны быть максимально короткими. Попробуйте удалить пробелы и упростить алгоритм, чтобы сэкономить больше места. Проверьте этот замечательный ресурс по игре в гольф на питоне, если вам нужны идеи.
DankMemes

Я проверю это, спасибо!
РК.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.