从对角线条重建文本矩形


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 2015年

另外,是否允许尾随空格?
kirbyfan64sos

@ kirbyfan64sos是,输入内容可能包含空格。允许尾随空格。
Cristian Lupascu 2015年

Answers:


5

CJam,23个 20字节

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

在这里尝试


利用输入格式(并且不要在空格上打断): {_z,,Nf*W%\.+zW%sN%}
丹尼斯

@Dennis因为它是“功能”,我是否可以计算花括号?我是CJam高尔夫的新手。
林恩

是。该块(带有大括号)是CJam替代匿名函数/ lambda的最接近的替代方法,因此,该块计为20个字节。
丹尼斯2015年

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=''需要吗?
Cristian Lupascu 2015年

啊,它溜进了那儿。谢谢!
Celeo 2015年

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
这是一个[代码高尔夫]问题,这意味着答案必须尽量简短。尝试删除一些空格并简化算法以节省更多空间。如果您需要想法,请查看有关使用python打高尔夫球的丰富资源
DankMemes

我会检查一下,谢谢!
RK。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.