転置と対角


21

この課題では、特定の正方行列の対角線を出力するプログラムまたは関数を作成する必要があります。ただし、ソリューションのソースコードの行と列を転置する場合は、代わりに、マトリックスの対角線を返すプログラムまたは関数になります。詳細をお読みください...

ルール

  • ソリューションのソースコードは、選択した標準の改行(ラインフィード、キャリッジリターン、または両方の組み合わせ)で区切られた文字の2Dグリッドと見なされます。
  • ソースコードの行は、前の行より長くなることはありません。有効なレイアウトの例を次に示します。

    ###
    ###
    ###
    

    ########
    #######
    ###
    ###
    #
    

    そして、無効なレイアウトの例を次に示します(3行目は2行目より長いため)。

    ######
    ####
    #####
    ###
    
  • 2つのソリューションは互いに転置する必要があります。つまり、行と列を交換することで一方から他方を取得する必要があります。有効なペアは次の2つです。

    abc
    def
    ghi
    

    adg
    beh
    cfi
    

    そして

    print 10
    (~^_^)~
    foo
    bar
    !
    

    p(fb!
    r~oa
    i^or
    n_
    t^
     )
    1~
    0
    

    スペースは他の文字と同様に扱われることに注意してください。特に、末尾のスペースは、転置の末尾のスペースではない可能性があるため重要です。

  • 各ソリューションは、入力として1桁の整数の空でない正方行列を取るプログラムまたは関数でなければなりません。1つのソリューションは、マトリックスのすべての対角線のリストを出力し、もう1つのソリューションは、すべての対角線のリストを出力する必要があります。合理的で明確な入力および出力形式を使用できますが、2つのソリューション間で同一である必要があります(これは、両方の機能または両方のプログラムでなければならないことも意味します)。

  • 各対角線は左上から右下に向かって走り、上から下に並べられます。
  • 各対角線は左下から右上に向かって走り、上から下に順番に並べる必要があります。

得点

可能な限り「正方形」のソリューションを推奨するために、プライマリスコアは、ソリューションの行数または列数のいずれか大きい方です。少ないほど良い。関係は、改行をカウントせずに、ソリューション内の文字数によって分割されます。繰り返しますが、少ないほど良いです。例:

abcd
efg
h

これとその転置のプライマリスコアは4(列が4つあるため)、タイブレークスコアは8(改行文字以外が8つあるため)です。回答のヘッダーにある両方の値を引用してください。

テストケース

2つのソリューションによって実行される実際のタスクは、ここでの主要な課題ではありませんが、ソリューションのテストに役立つ2つの例を次に示します。

Input:
1 2 3
4 5 6
7 8 9
Diagonals:
3
2 6
1 5 9
4 8
7
Antidiagonals:
1
4 2
7 5 3
8 6
9

Input:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
Diagonals:
0
1 1
0 0 0 
1 1 1 1
0 0 0
1 1
0
Antidiagonals:
1
0 0
1 1 1
0 0 0 0
1 1 1
0 0
1


P:私は今朝SEに乗って前に実現すでにこの投稿をしていた私は...この時点で私は精神的でなければならないと思うし始めているサンドボックスのポストが、途中でそれを介して取得する前に自分で気づいたとして
ETHproductions

回答:


19

Javascript、スコア20 14、(258 176非改行文字)

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

そして

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

コードスニペットの例:

f=

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))

そして

f=

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))


構文の強調表示を有効にできますか?<!-- language-all: lang-javascript -->最初のコードブロックの前に配置します。
電卓

8

MATL、スコア10(非改行文字100)

%P!       
  Q&%     
  TXd!    
  %d      
     P!   
      "@% 
       Xz 
      %z  
         q
         !

10文字の行が10行あります(末尾のスペースに注意してください)。

上記のコードは対角線を生成します。オンラインでお試しください!

転置バージョンは、対角線を生成します。 オンラインでお試しください!

説明

ご了承ください

  • % はコメント記号です。これにより、残りの行は無視されます。

  • のような2文字の関数は、連続する行でとにXd分割できません。Xd

元のコード

元のコードは、線形化され、コメント部分はありません。

Q&TXd!P!"@Xzq!

次のように機能します。

Q      % Implicit input. Add 1 to each entry to make them positive
&      % This modifes default inputs/ouputs of next function, which is Xd
       % Specifically, it specifies 2 inputs and 1 ouput
T      % Push true
Xd     % Diagonals of matrix. With second input true, it gives all diagonals,
       % starting from below. The columns are arranged as columns of a matrix,
       % padding with zeros
!P!    % Flip horizontally. This is to produce the correct display order
"      % For each column
  @    %   Push current column
  Xz   %   Remove zeros
  q    %   Subtract 1
  !    %   Transpose into a row
       % Implicit end. Implicit display of stack contents

転置コード

線形化された転置コードは

P!QT&Xd!P!"@Xzq!

元のコードと比較して、次の2つの違いがあります。

  • Tそして、&スワップされます。これはT、関数ではなくリテラルであるため、効果がありません&。したがって、仕様をインターセプトしません。
  • P! 最初に追加されます。

追加されたコードは、変更されたマトリックスの対角が入力の反対角になるように入力マトリックスを変更します。

P      % Implicit input. Flip vertically
!      % Transpose

7

Jelly、スコア7、49改行以外のバイト

斜め印刷プログラム

......U
......Œ
......D
......ṙ
......L
......Ṛ
ŒDṙLṚUU

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

対角線印刷防止プログラム

......Œ
......D
......ṙ
......L
......Ṛ
......U  
UŒDṙLṚU

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

古い回答(順不同の出力)、スコア3、改行以外の6バイト

斜め印刷プログラム

UU
UŒ
ŒD

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

斜め印刷プログラム

UUŒ
UŒD

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


6

ゼリー、スコア4(12文字)

前のスコア:5(16文字)、4(16文字)

元の

ŒDṙṚ
D  ñ
ṙLñL

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

転置

ŒDṙ
D L
ṙ ñ
ṚñL

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

バックグラウンド

対角線

正方行列の対角線(最上部から最下部)を取得する簡単な方法は次のとおりです。

ŒDṙLṚ

入力行列Mの場合、Mの対角線をŒDリストします。メインの対角線から始まり、上に向かって移動します。

入力用

1 2 3
4 5 6
7 8 9

これにより

1 5 9
2 6
3
7
4 8

ṙL次に、Mの長さを計算しL、結果のlength(M)単位を左に回転します。

この例では、長さは3であり、

7
4 8
1 5 9
2 6
3

最後に、対角線の順序を逆にして返します

3
2 6
1 5 9
4 8
7

入力例の場合。

対角線

同じビルディングブロックを使用して、正方行列の対角線(再び、最上部から最下部)を取得できます。

ṚŒDṙL

入力行列Mの場合、最初に行の順序を逆にします。

入力用

1 2 3
4 5 6
7 8 9

これにより

7 8 9
4 5 6
1 2 3

前と同様に、ŒDṙL結果の対角線(最下部から最上部)を生成します。

この例では、これは

1
4 2
7 5 3
8 6
9

望んだ通りに。

使い方

Jellyでは、各行がリンク(関数)を定義します。特に、最後の行は、プログラムの起動時に実行されるメインリンクを定義します。

他のリンクを呼び出す必要があります。この回答ではñ、以下のリンクを動的に実行するを使用しています。ñラップアラウンドするため、メインリンクから呼び出されると、最初の行でリンクを実行します。

元の

メインリンク

ṙLñL

入力行列Mを受け取り、その長さをで計算しL、入力length(M)単位を左に回転させ(これによりMが変更されないことに注意してください)、最後に結果(M)とlength( M)引数として。

最初のリンク

ŒDṙṚ

対角線計算Mを用いてŒD(前のセクションで見られるように)、結果の回転長(M)と左に単位次いで結果の順序を逆に、

2番目のリンクは呼び出されません。

転置

メインリンク

 ṚñL

は入力行列Mを取り、その逆をで計算します。その後の長さ計算Mを有するLと引数を持つ第一のリンク呼び出し逆(M)長さ(M)を

最初のリンク

ŒDṙ

次に、(前のセクションで見たように)reverse(M)の対角線を計算し、ŒD最終的に結果length(M)単位をで左に回転させます。

残りのリンクは呼び出されません。


5

R、スコア14 13 11(非改行文字99 95)

スコアを1向上させてくれた@Giuseppeに感謝します。現在、ゴルフ以外の言語で最高のスコアです!

######`,scr
`::`(#:fpoo
pryr,#:)llw
f)(###`(i((
split (#tmm
p,col(p#())
)+row#r#m-)
(p)))#y#,#)
######r

そして転置:

#`pfsp)(#
#:r)p,+p#
#:y(lcr)#
#`r#ioo)#
#(,#tlw)#
#### (###
`::`(pryr
,f)(####
split(m,
col(m)-#
row(m)))

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


1
row(m)+col(m)対角線では短くなります。
ジュゼッペ

@Giuseppeもちろん、ありがとう!今すぐ編集。
rturnbull

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