テキストのグリッドの対角線を並べる


15

テキストの長方形のグリッドが与えられた場合、左上から右下に向かう対角線を列に並べ、すべての対角線の最右端の文字が水平になるようにします。インデントにはスペースを使用します。

たとえば、テキストの入力グリッドが

abcd
1234
WXYZ

あなたは対角線をラインアップしたいW1Xa2Yb3zc4、およびdこの出力を与える列に:

  ab
 123c
WXYZ4d

すべての対角線の最も右下の文字がWXYZ4d同じレベルにあることに注意してください。

詳細

  • テキストの入力グリッドのサイズは少なくとも1×1で、すべての行は同じ長さになります。

  • 入力グリッドは、複数行の文字列または単一行の文字列のリストとして取得できます。

  • 入力グリッドには、印刷可能なASCII文字(スペースを含む)のみが含まれます。

  • 出力には、オプションで末尾の改行が1つ含まれる場合がありますが、他の空行はありません。

  • 出力の行には、オプションで末尾スペースを含めることができますが、不要な先頭スペースを含めることはできません。

その他の例

空行は例を示します。各入力の直後に出力が続きます。

123
456
789

  1
 452
78963

123.?!
456??!
789!!!

  123.
 456???
789!!!!!

**@
@  

 **
@  @


/\/\
\/ /
/ /\
\/\/

   /
  \/\
 / / /
\/\/\/\

12
34
56
78
90

 7531
908642

Code

Code

G
O
L
F

FLOG

~

~

得点

バイト単位の最短コードが優先されます。



入力は2D char配列(charsの行列)にできますか?
ルイスメンドー

入力の最初の列にスペースを含めることはできますか?
Kritixi Lithos

@LuisMendoそれは大丈夫ですね。
カルビンの趣味

@KritixiLithosはい、そうかもしれません。
カルビンの趣味

回答:


4

J、12バイト

|./.&.|:&.|.

匿名動詞を定義します。 オンラインでお試しください!

説明

|./.&.|:&.|.
|.            Reversed
  /.          anti-diagonals
    &.        under
      |:      transpose
        &.    under
          |.  reversal

Jでは、 u &. v(読み取り:のuv)は「v、次にu、次にvの逆数」を意味します。反転と転置は自己逆なので、プログラムは実際には「逆、転置、逆対角線の抽出、転置、逆」を意味します。

入力例:

abcd
1234
WXYZ

逆:

WXYZ
1234
abcd

転置:

W1a
X2b
Y3c
Z4d

逆対角線を抽出します(およびスペースで埋めます):

W  
X1 
Y2a
Z3b
4c 
d  

転置:

WXYZ4d
 123c 
  ab  

逆:

  ab  
 123c 
WXYZ4d

2
副詞の力の優れたデモ
マイル

2
私は目が覚め、それらが実際に接続詞だったことを思い出した。
マイル

2

ゼリー、11または10バイト

ZŒDṙLUz⁶ṚUY

オンラインでお試しください!

私の他のソリューションとはかなり異なるアルゴリズム。これは、手動で処理するのではなく、組み込み関数を使用して対角線に到達します。

説明:

ZŒDṙLUz⁶ṚUY
Z           transpose
 ŒD         diagonals, main diagonal first
    L       number of lines in the original array
   ṙ        rotate list (i.e. placing the short diagonal first)
     U      reverse inside lines
      z⁶    transpose, padding with spaces
        ṚU  rotate matrix 180 degrees
          Y (possibly unnecessary) join on newlines

対角線はおそらく最悪の方向(転置、反転、回転を繰り返す必要があります)で、間違った順序で出ます(Jellyは最初に主対角線を出力するため、それらを取得するには対角線を最後から最初に移動する必要があります順番に)。ただし、これは他のJellyソリューションよりも短くなります。


2

CJam、29バイト

qN/{)\z}h]2/{~W%+}%eeSf.*W%N*

オンラインでお試しください!

説明

対角線を抽出する代わりに、左右に交互に層を端から剥がします。次の入力を考慮してください。

GFDB
EEDB
CCCB
AAAA

チャレンジに必要な対角線を書き出すと、次のようになります。

   G
  EEF
 CCCDD
AAAABBB

これは単純に(下から上へ)、一番下の行で、一番右の列と連結されていることに注意してください。この定義は、入力が長方形の場合にも機能します。

{      e# Run this loop while there are still lines left in the input.
  )    e#   Pull off the bottom-most row.
  \    e#   Swap with the remaining rows.
  z    e#   Transpose the grid so that the next iteration pulls off the last
       e#   column instead. However, it should be noted that transposing
       e#   effectively reverses the column, so the second half of each output
       e#   line will be the wrong way around. We'll fix that later.
}h     e# When the loop is done, we'll have all the individual layers on the
       e# stack from bottom to top, alternating between horizontal and vertical
       e# layers. There will be an empty string on top.
]      e# Wrap all those strings in a list.
2/     e# Split into pairs. There may or may not be a trailing single-element
       e# list with the empty string.
{      e# Map this block over each pair...
  ~    e#   Dump the pair on the stack.
  W%   e#   Reverse the second element.
  +    e#   Append to first element.
       e#   If there was a trailing single-element list, this will simply
       e#   add the empty string to the previous pair, which just removes
       e#   the empty string.
}%
ee     e# Enumerate the list, which pairs each string (now containing both halves)
       e# of an output line from bottom to top) with its index.
Sf.*   e# Turn those indices X into strings of X spaces, to get the correct
       e# indentation.
W%     e# Reverse the list of strings so the longest line ends up on the bottom.

慎重に、それ]はスタック全体をラップします!私は、機能に関係なく、入力の下にスタックの内容の動作するはずだと思う、とあなたは同意しているようです ^^
リン・

@Lynnおっと、]関数に変更したときに使用していたことを忘れていました。
マーティンエンダー

私はあなたが[{)\z}h]それを27バイトのために機能させて維持できると思います。
リン

2

JavaScript、116 101バイト

f=(s,r='$&',l='',z=s.replace(/.$|\n?(?!.*\n)..+/gm,x=>(l=x+l,'')))=>l?f(z,r+' ')+l.replace(/\n?/,r):l


G.onclick=()=>O.textContent=f(I.value);
<textarea id=I style=height:100px>/\/\
\/ /
/ /\
\/\/</textarea><button id=G>Go</button><pre id=O></pre>

この正規表現パターンの/.$|\n?(?!.*\n)..+/gmアイデアを使用したかっただけです。https://regex101.com/r/mjMz9i/2

JavaScriptの正規表現フレーバーは期待はずれです。実装され(?!.*\n)ていないため使用しなければならず\Z、どういうわけか使用できませんでした\0です。。

  • @Neilに感謝します。

私はこのアプローチが大好きですが、改行を見つけるために改行以外の文字をスキップするだけで2バイトを節約できるため、.代わりに使用でき[^]ます。
ニール

いずれにしても文字列の先頭に既にあるため、別のバイトを節約する^ため、最終正規表現ではが必要だとは思わない\n
ニール

私はゴルフをする方法を思いついた'$&'+' '.repeat(n)。基本的にその表現はただ$&、呼び出しごとにスペースが追加されているが、再帰的に実装するのは簡単です-と置き換えn=0r='$&'からf(z,n+1)f(z,r+' ')そしてそれrが望ましい置換文字列です。正しくカウントした場合、12バイト節約されます。
ニール

@ニール。すごい!!、ありがとう
ワシントン・ゲデス

1

ゼリー、15または14バイト

L’⁶x;\Ṛ;"µZUZṚY

オンラインでお試しください!

これは、対角線にJellyの組み込みを使用しないアルゴリズムです。それを行うと、短くなります。私は次にそれを試すかもしれません。

アルゴリズムの仕組みは次のとおりです。この入力から始めましょう:

["abc",
 "def",
 "ghi"]

から始めますL’⁶x;\L’入力の長さから1を引いた値(この場合は2)が得られます。次に⁶x、その長さのスペースの文字列を提供します(" "この場合)。そして、;\(スペースの三角形)、それを連結したときに私たちの累積結果が得られます。次に、三角形を反転して元の左側に;"連結します(リストの対応する要素を連結し、µ強制的に解析を中断させ、デフォルトで元の入力を2番目のリストとして使用します)。

["  abc",
 " def",
 "ghi"]

これはほとんど私たちが望む解決策ですが、最後の文字列と同じになるように要素を下に移動する必要があります。それは、(移調の問題ですZ(各ラインの内側に反転、) U(再び転置、) Z()、およびラインを反転します):

["  abc",
 " def",
 "ghi"]

転置

["  g",
 " dh",
 "aei",
 "bf",
 "c"]

行内で反転

["g  ",
 "hd ",
 "iea",
 "fb",
 "c"]

転置

["ghifc",
 " deb",
 "  a"]

行を逆にします

["  a",
 " deb",
 "ghifc"]

最後に、Y改行に参加します。仕様に準拠するためにこれが必要かどうかはわかりません(文字列のリストとして入力できますが、出力については同じではありません)。したがって、正確なバイトカウントは、含まれるか省略されるかによって異なります。


1

Pyth、16バイト

j_.t_M.Tm+*;l=tQ

ビッグピュス

join-on-newline
reverse transpose-and-fill-with-spaces reverse func-map transpose-justified
map
  plus
    times innermost-var
      length assign tail input
    implicit-innermost-var
  implicit-input

ゴルフの言語は読みにくいと言われているので、私はBig Pythを設計しました。これは、読みやすく、Pythに簡単に翻訳できるものです。リンクされたファイルは、Big Pythの入力ストリームをPythに変換します。空白で区切られた各Big Pythトークンは、Pythトークン(文字または.。例外はimplicitトークンであり、これはPythコードで暗黙的です。

Big Pythの説明フォーマットがどれほど優れているかを知りたいので、他の説明はしません。ただし、何か説明したい場合は私に尋ねてください。


0

JavaScript(ES6)、140バイト

a=>[...Array(m=(h=a.length)<(w=a[0].length)?h:w)].map((_,i)=>[...Array(h+w-1)].map((_,j)=>(a[x=i+h-m-(++j>w&&j-w)]||``)[x+j-h]||` `).join``)

入力と出力を文字列の配列として受け取ります。また、2次元文字配列の入力を受け入れ、2次元文字配列の出力が受け入れられる場合は7バイトを節約します。説明:結果mの高さは、高さhと幅の最小値ですwは元の配列のは元の配列の高さと幅の合計よりも1だけ小さいです。結果の主要部分の文字のソース行は、元の配列の適切な行から直接取得され、下から順にカウントされますが、結果の余分な部分では、ソース行が追加の列ごとに1行上に移動します。結果の両方の半分のソース列は、下のソース行ごとに1列左に移動した宛先列と等しくなります。


0

オクターブ、57バイト

@(A){B=spdiags(A),C=B>0,D='  '(C+1),D(sort(C))=B(C),D}{5}

0

Python 3、247バイト

def a(s):
 s=s.split('\n')
 for i,l in enumerate(s):r=len(s)-i-1;s[i]=' '*r+l+' '*(len(s)-r-1)
 print(*[''.join(i) for i in list(zip(*[''.join(a).rstrip([::-1].ljust(min(len(s),len(s[0])))for a in zip(*[list(i)for i in s])]))[::-1]],sep='\n')`

の無駄な空白join(i) for
Yytsi 16

0

Python 2、150バイト

def f(l):w=len(l[0]);h=len(l);J=''.join;R=range;print'\n'.join(map(J,zip(*['%%-%ds'%h%J(l[h+~i][j-i]for i in R(h)if-w<i-j<1)for j in R(h-~w)]))[::-1])

入力を文字列のリストとして受け取ります。


0

Clojure、194バイト

文字をグループ化してからG行を生成するという難しい方法を実装しました。

#(let[n(count %)m(count(% 0))G(group-by first(for[i(range n)j(range m)][(min(- n i)(- m j))((% i)j)]))](apply str(flatten(for[k(reverse(sort(keys G)))][(repeat(dec k)" ")(map last(G k))"\n"]))))

入力を受け取りvecvecようなの[[\a \b \c \d] [\1 \2 \3 \4] [\W \X \Y \Z]]。例:

(def f #( ... ))
(print (str "\n" (f (mapv vec(re-seq #".+" "abcd\n1234\nWXYZ")))))

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