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


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%}
Денніс

@Dennis Чи потрібно рахувати фігурні дужки, оскільки це "функція"? Я новачок у гольф CJam.
Лінн

Так. Блок (із фігурними дужками) є найближчою альтернативою CJam анонімній функції / лямбда, тому цей показник нараховує 20 байт.
Денніс

3

Пітон 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=''потрібен останній ?
Крістіан Лупаску

Ах, він прокрався туди; Дякую!
Селео

0

Пітон, 332 325 байт

Тому що 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
Це [код-гольф] питання, що означає, що відповіді повинні намагатися бути максимально короткими. Спробуйте видалити пробіл і спростити алгоритм, щоб заощадити більше місця. Перегляньте цей чудовий ресурс для гольфу в пітоні, якщо вам потрібні ідеї.
DankMemes

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