マトリックスを折りたたむ!

与えられた行列では、その値を上下左右に合計してXを形成し、それを折りたたんでリストを返します。ここでアルゴリズムを説明します:

アルゴリズム

あなたの入力は、あなたの言語の合理的な数値能力の範囲内で、奇数の正方形の整数の行列になります。

例として次の行列を考えてみましょう:

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

まず、すべての番号を、メイン対角線または対角線上にある最も近い番号に追加します。つまり、行列を主対角線と反対角に沿って4つのセクションに分割し、各セクションの数字をすべて中央に向かって合計します。

1   2   3   2   1
    ↓   ↓   ↓    
0 → 3   2   3 ← 0
        ↓        
4 → 2 → 5 ← 6 ← 3
        ↑        
7 → 4   7   9 ← 4
    ↑   ↑   ↑    
0   6   7   2   5

この手順では、次の結果が得られます。

1        1
  5    5
    39
  17  15
0        5

次に、Xをフラットにして要素を左上の最初と最後の最後の要素と織り交ぜて折ります。これにより、次の結果が得られます。

1, 0, 5, 17, 39, 5, 15, 1, 5

これをメイン対角線を伸ばして反時計回りに回転させると想像できます。

これが最終結果です。

チャレンジ

Implement this アルゴリズム. Standard loopholes apply. All reasonable
I/O formats acceptable.

テストケース

Input
Output

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

1, 0, 5, 17, 39, 5, 15, 1, 5

1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0

1, 6, 11, 16, 47, 7, 22, 5, 0

1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9

1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9
ベストアンサー

JavaScript、113バイト

s=>(l=s.length-1,a=[],s.map((v,y)=>v.map((n,x)=>a[q=2*[x,y,l-y].sort((u,v)=>u-v)[1]+(y>l/2),q-=q>l]=~~a[q]+n)),a)

<div class=”snippet” data-lang=”js” data-hide=”true”
data-console=”true” data-babel=”false”> <div
class=”snippet-code snippet-currently-hidden”>

f=

s=>(l=s.length-1,a=[],s.map((v,y)=>v.map((n,x)=>a[q=2*[x,y,l-y].sort((u,v)=>u-v)[1]+(y>l/2),q-=q>l]=~~a[q]+n)),a)




<button onclick="o.value=f(i.value.trim().split`n`.map(l=>l.trim().split(/s+/).map(v => parseInt(v,10)))).join` `">Run</button>




</div> </div>

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です