斜めのストリップからテキスト長方形を再構成します


10

この課題は、マトリックスのすべての対角線を列挙することによるマトリックスのトラバースに関するSOの質問に触発されました。

マトリックスの代わりに、テキストのブロックを考えてみましょう:

ABCD
EFGH
IJKL

このブロックのSW-NEの対角線を左上から右に、左上隅から右下までトラバースすると、次の出力が得られます。

A
EB
IFC
JGD
KH
L

チャレンジ

上記の逆のプロセスを実行するプログラムまたは関数を記述します。つまり、セットのSW-NE対角ストリップを指定して、それを生成したテキストのブロックを出力します。

入出力

入力と出力の両方を、改行付きの文字列、または文字列の配列/リストとして表すことができます。

末尾の改行はオプションです。

入力は少なくとも1つの印刷可能な文字で構成され、正しいと見なすことができます(行の長さに一貫性がないことはありません)。

出力ブロックには常に、行数以上の列数があります。

テストケース

入力:

A

出力:

A

入力:

.
LI
PO.
PV.
CE
G

出力:

.I..
LOVE
PPCG

入力:

M
DA
AIT
LAR
SGI
/OX
/N
/

出力:

MATRIX
DIAGON
ALS///

入力文字列にスペースが含まれますか?
— kirbyfan64sos

また、末尾の空白は許可されますか?
— kirbyfan64sos

@ kirbyfan64sosはい、入力にスペースが含まれる場合があります。末尾の空白は許可されます。
— クリスティアンルパスク2015

回答:


5

CJam、23 20バイト

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

こちらでお試しください。


入力フォーマットを利用する(スペース{_z,,Nf*W%\.+zW%sN%}
— Dennis

@Dennis「関数」なので、中かっこを数えますか?CJamゴルフは初めてです。
— Lynn

はい。ブロック(中かっこ付き)は、CJamの無名関数/ラムダに最も近い代替物であるため、20バイトとしてカウントされます。
— 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

入力と出力は文字列のリストです。

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

L入力を読み取ると、出力する行のリストが作成されます。新しい各文字は、最後の行から始まりi=-1、先頭に向かって行に追加されます。

追加する新しい行がリストに対して長すぎる場合は、新しい空の行が追加されますL+=[''][:len(w)-len(L)]。この部分を短くする方法を期待しています。


1

Python 2、165 162 169163バイト

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

6バイトを節約してくれたw0lfに感謝します。

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バイト

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
これは[code-golf]の質問です。つまり、回答はできるだけ短くする必要があります。空白をいくつか削除し、アルゴリズムを簡略化してより多くのスペースを節約してください。チェックアウトpythonでゴルフのこの偉大なリソースを使用すると、アイデアが必要な場合。
— DankMemes 2015

チェックしてみます、ありがとう!
— RK。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.