合計にインデックスを付けて行列を取り除く


9

合計にインデックスを付けて行列を取り除く

あなたの好みの言語でmatrix / 2d配列を与える

入力:

  • マトリックスは常に奇数の長さになります
  • 行列は常に完全に正方形になります
  • 行列の値は、言語の任意の整数(正または負)にすることができます

例:

1  2  3  4  5  6  7
2  3  4  5  6  7  8
3  4  50 6  7  8  9
4  5  6 100 8  9  10
5  6  7  8 -9  10 11
6  7  8  9  10 11 12
7  8 900 10 11 12 0

定義:

  • 「中央番号」とは、左、右、上、下に同じ数の数字を持つ数として定義されます

この場合、真ん中の100

  • 「外殻」は、xとyのインデックスが0または行列サイズである数値のコレクションです。

1  2  3  4  5  6  7
2                 8
3                 9
4                 10
5                 11
6                 12
7  8 900 10 11 12 0

あなたのタスク:

それぞれの値に1ベースのインデックスを乗算した後、各行と列の合計を中央の数値に追加します

たとえば単一行

4  5  6  7  8

各番号について

number * index + number * index.....

4*1 + 5*2 + 6*3 + 7*4 + 8*5 => 100

例:

 2 -3 -9  4  7  1  5  => 61
-2  0 -2 -7 -7 -7 -4  => -141
 6 -3 -2 -2 -3  2  1  => -10
 8 -8  4  1 -8  2  0  => -20
-5  6  7 -1  8  4  8  => 144
 1  5  7  8  7 -9 -5  => 10
 7  7 -2  2 -7 -8  0  => -60
                         |
78 65 60 45 -15 -89 10   => 154
                     |
                     => -16
  • すべての行と列について、これらの値を組み合わせます。
  • これらも合計します=> 154-16 = 138
  • その数を「中心数」に追加し、マトリックスの「外殻」を削除します

 0 -2 -7 -7 -7     => -88
-3 -2 -2 -3  2     => -15
-8  4 1+138 -8  2  => 395
 6  7 -1  8  4     => 69
 5  7  8  7 -9     => 26

19 69 442 30 -26

あなたが単一の番号で終わるまで、これをしてください

-2 -2 -3     => -15
 4  1060 -8  => 2100
 7 -1  8     => 29

27 2115 5
  • 1060に2114 + 2147を追加
  • 「外殻」を外して5321をゲット
  • これで、数字が1つ残った

これが出力です!

テストケース:

-6

-6

-7 -1  8
-4 -6  7
-3 -6  6

2

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

-365

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

17611

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

-28473770

これはコードゴルフの挑戦なので、バイト数が最も少ないプログラムが勝ちます


あなたは正しい、タイプミスthatsの
downrep_nation

3
負の数が問題になるのはなぜですか?課題はesolangに合わせて調整すべきだとは思いませんが、おそらく逆の方法がより適切です
downrep_nation

@LuisMendoそれは問題ではないと私は思います、「行列の値はあなたの言語ではどんな整数でもかまいません」というルールは、あなたの言語が負の数を持っていなければそれをサポートすべきではないということを私に意味します。
16年

実際それは正しいです。しかし、テストケースは適切に機能し
ません

2
「課題はesolangに合わせて調整すべきだとは思わないが、おそらく逆の方法がより適切である」と石に刻む必要がある
edc65

回答:


4

MATL36 34バイト

tnq?`t&+stn:*sytn2/)+ 7M(6Lt3$)tnq

入力は、;行セパレータとしての2D配列です

オンラインでお試しください!または、すべてのテストケースを確認します

説明

tnq       % Take input. Duplicate, get number of elements, subtract 1
?         % If greater than 0
  `       %   Do...while
    t     %     Duplicate
    &+    %     Sum matrix with its transpose
    s     %     Sum each column. Gives a row vector
    tn:   %     Vector [1 2 ...] with the same size
    *     %     Multiply element-wise
    s     %     Sum of vector. This will be added to center entry of the matrix
    y     %     Duplicate matrix
    tn2/  %     Duplicate, get half its number of elements. Gives non-integer value
    )     %     Get center entry of the matrix, using linear index with implicit rounding
    +     %     Add center entry to sum of previous vector
    7M    %     Push index of center entry again
    (     %     Assgined new value to center of the matrix
    6Lt   %     Array [2 j1-1], twice. This will be used to remove shell
    3$)   %     Apply row and col indices to remove outer shell of the matrix
    tnq   %     Duplicate, number of elements, subtract 1. Falsy if matrix has 1 entry
          %   End do...while implicitly. The loop is exited when matrix has 1 entry
          % End if implicitly
          % Display stack implicitly

4

Python 2.7、229バイト

これがこのような試みの最初の試みなので、うまくいけば、私はこの提出ですべての規則を守った。これは、リストのリストをパラメーターとして受け取る関数です。合計とリストの理解は少し短くなるかもしれないと思うが、それは私には難しすぎた。:D

def r(M):
  t=len(M)
  if t==1:return M[0][0]
  M[t/2][t/2]+=sum(a*b for k in [[l[x] for l in M]for x in range(0,t)]for a,b in enumerate(k,1))+sum([i*j for l in M for i,j in enumerate(l,1)])
  return r([p[+1:-1]for p in M[1:-1]])

数バイトを削ってくれてありがとうございました。


1
演算子間のスペースをいくつか削除できます(...) + sum([i*j...-> ...)+sum([i*j...)が、全体として、素晴らしい最初の投稿!!!!
Rɪᴋᴇʀ

ooohはそれを逃した。ありがとう!
ジェレミー

1
また、...]for ...動作します。そのように少なくとも2つのスペースを削除できます。(リストの末尾forループヒット)
Rɪᴋᴇʀ

3

C#、257バイト

これが esolangの答えです

void f(int[][]p){while(p.Length>1){int a=p.Length;int r=0;for(int i=0;i<a;i++)for(int j=0;j<a;j++)r+=(i+j+2)*p[i][j];p[a/2][a/2]+=r;p=p.Where((i,n)=>n>0&&n<p.Length-1).Select(k=>k.Where((i,n)=>n>0&&n<p.Length-1).ToArray()).ToArray();}Console.Write(p[0][0]);

ゴルフなし:

void f(int[][]p)
    {
        while (p.Length>1)
        {
            int a=p.Length;
            int r=0; //integer for number to add to middle
            for (int i = 0; i < a; i++)
                for (int j = 0; j < a; j++)
                    r +=(i+j+2)*p[i][j]; //add each element to counter according to their 1 based index
            p[a / 2][a / 2] += r; //add counter to middle
            p = p.Where((i, n) => n > 0 && n < p.Length - 1).Select(k => k.Where((i, n) => n > 0 && n < p.Length - 1).ToArray()).ToArray(); //strip outer shell from array
        }
        Console.Write(p[0][0]); //print last and only value in array
    }

2
ねえ、Jはesolangではありません。
マイル

using System.Linqandを含めない場合、これはコンパイルされませんusing System。ルールでそれが必要かどうかはわかりませんが。
Yytsi 2016年

それは完全なプログラムではなく、その唯一の機能なので、私の知る限りでは問題ありません。つまり、App.configとすべてのバイトをプロパティとメイクファイルに含める必要がありますか?いいえ
downrep_nation 2016年

@downrep_nation関数だっただけでスコアにバイトが含まれている場合に、ソースにそれらを含める人がいるのを見てきたので、それは奇妙なことです。
Yytsi 2016年

今考えてみると、少なくともインポートする必要があるということですSystem.Linq。特定の機能を使用するためにインポートを必要とする他の言語は同じプロセスを通過するため、すべてのモジュールがC#でメモリにロードされると想定するのは不公平だと思います。
Yytsi 2016年

2

J、66バイト

([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)

課題で説明されているプロセスに基づく簡単なアプローチ。

[:+/^:2#\*]+|:合計を取得します。]+(i.@,~=](]+*)<.@-:)@#*中心を合計で増分する特に醜い方法です。[:}:@}."1@}:@}.外殻を取り除きます。これを行うにはもっと良い方法があるでしょう。

使用法

   f =: ([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)
   f _6
_6
   f _7 _1 8 , _4 _6 7 ,: _3 _6 6
2
   f 6 7 _2 5 1 , _2 6 _4 _2 3 , _1 _4 0 _2 _7 , 0 1 4 _4 8 ,: _8 _6 _5 0 2 
_365
   f 8 3 5 6 6 _7 5 , 6 2 4 _2 _1 8 3 , 2 1 _5 3 8 2 _3 , 3 _1 0 7 _6 7 _5 , 0 _8 _4 _9 _4 2 _8 ,8 _9 _3 5 7 8 5 ,: 8 _1 4 5 1 _4 8
17611
   f (13 13 $ _9 _7 2 1 1 _2 3 _7 _3 6 7 1 0 _7 _8 _9 _2 7 _2 5 4 7 _7 8 _9 8 _4 4 _1 0 1 5 _3 7 1 _2 _9 4 8 4 8 1 _1 0 7 4 6 _9 3 _9 3 _9 _6 _8 _4 _8 _9 2 1 1 _8 8 2 6 _4 _8 _5 1 1 2 _9 3 7 2 5 _6 _1 2 _8 _5 _7 _4 _9 _2 5 0 2 _4 2 0 _2 _3 _6 _3 2 _9 8 1 _5 5 0 _4 _1 _9 _9 _9 _8 0 _5 _7 1 _2 1 _4 _1 5 7 _6 _9 4 _2 8 7 _9 _5 3 _1 1 8 4 _6 6 _3 _4 3 5 6 8 _2 5 _1 _7 _9 _1 7 _9 4 6 7 6 _8 5 1 0 _3 0 _3 _2 5 _4 0 0 0 _1 7 4 _9 _4 2)
_28473770

2

Brachylog、114バイト

{l1,?hh.|:{:Im:I:?:{[L:I:M]h:JmN,Ll:2/D(IJ,M{$\:?c:{:{:ImN,I:1+:N*.}f+.}a+.}:N+.;'(DIJ),N.)}f.}f:7a$\:7a&.}.
brbr.

これも正直に機能していることに驚きます。少なくとも私は、組み込み型としてBrachylogには「その要素の値の変更」が本当に必要であることに気づきましたが…

使用例:

?- run_from_file('code.brachylog', '[[0:_2:_7:_7:_7]:[_3:_2:_2:_3:2]:[_8:4:139:_8:2]:[6:7:_1:8:4]:[5:7:8:7:_9]]', Z).
Z = 5321 .

説明

より読みやすい(より長い)バージョン:

{l1,?hh.|:2f:7a$\:7a&.}.
:Im:I:?:3f.
[L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.)
$\:?c:5a+.
:6f+.
:ImN,I:1+:N*.
brbr.

各述語(つまり、メイン述語+述語1である最初の述語を除く各行)が行うことを大まかに説明します。

  • メイン述語+述語1 {l1,?hh.|:2f:7a$\:7a&.}.:入力に行が1つしかない場合、アルゴリズムを終了し、唯一の値を返します。それ以外の場合は、述語2を満たすすべての行を検索し、結果の行列に述語7を適用し、転置に述語7を適用してから、再帰的に呼び出します。

  • 述語2 :Im:I:?:3f.I行列の3行目を取り、述語3とIを追加するその行のすべての値と行列を追加入力として見つけます。

  • 述語3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.)Lは行、は行Iのインデックス、Mは行列です。NJth番目の要素ですL。長場合L2で割っ両方に等しくなるIJ、出力はとの和であるNマトリックスに述語4の結果。それ以外の場合、出力はただNです。この述語は、中心要素が合計に追加されることを除いて、本質的に行列を再作成します。

  • 述語4 $\:?c:5a+.:行列の各行と列に述語5を適用し、結果の合計で出力を統一します。

  • 述語5 :6f+.:行で述語6のすべての有効な出力を検索し、結果のリストの合計で出力を統合します。

  • 述語6は:ImN,I:1+:N*.:  NあるI行の番目の値と出力を統一しますN * (I+1)

  • 述語7 brbr.:行列の最初と最後の行を削除します。


2

APL、56文字

{{1 1↓¯1 ¯1↓⍵+(-⍴⍵)↑(⌈.5×⍴⍵)↑+/(⍵⍪⍉⍵)+.×⍳≢⍵}⍣(⌊.5×≢⍵)⊣⍵}

英語で:

  • ⍣(⌊.5×≢⍵) 「次元の半分のサイズを丸めた」回数を繰り返す
  • (⍵⍪⍉⍵)+.×⍳≢⍵ 行列の内積とインデックスベクトルとの転置
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ 0が埋め込まれた行列の変換結果
  • 1 1↓¯1 ¯1↓ 外殻を取り除きます
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.