平均が最小の部分行列2.0を見つける


15

整数のnm列の行列が与えられます。ここで、n、m> 3です。あなたの仕事は、平均値が最も低い3行3列の部分行列を見つけ、この値を出力することです。

規則と説明:

  • 整数は負ではありません
  • オプションの入出力形式
  • 出力は、少なくとも2桁の小数点以下まで正確でなければなりません(整数でない場合)。
  • 部分行列は、任意の列と行で構成できます

テストケース:

1   0   4   0   1   0
1   0   4   0   1   0
4   3   4   3   4   3
1   0   4   0   1   0

Minimum mean: 0   (We have chosen columns 2,4,6 and rows 1,2,4 (1-indexed)
-----------------------------
4    8    9    7
5   10    1    5
8    5    2    4
8    3    5   10
6    6    3    4

Minimum mean: 4.2222
-----------------------------
1   0   0   0   0
0   2   0   0   0
0   0   3   0   0
0   0   0   4   0
0   0   0   0   5

Minimum mean: 0.11111
-----------------------------
371   565   361   625   879   504   113   104
943   544   157   799   726   832   228   405
743   114   171   506   943   181   823   454
503   410   333   735   554   227   423   662
629   439   191   707    52   751   506   924

Minimum mean: 309.56

これがこのチャレンジの最初のバージョンと何が違うのですか?
KritixiのLithos

2
@KritixiLithosこれは、「submatrix」のより一般的な定義を使用します。ここで、サブマトリックスは、元の行と列をいくつでも削除することで取得できるマトリックスです(残りの行/列は隣接する必要はありません)。
マーティンエンダー

回答:


9

Mathematica、77 50バイト

±x_:=x~Subsets~{3}
Min[Mean/@Mean/@±#&/@±#]&

はMathematicaの転置演算子です(Mathematicaでは上付き文字Tとしてレンダリングされます)。

この答え±は、リストのすべての3要素サブセットを返すヘルパー演算子を最初に定義し、次にこの演算子を使用して問題を解決する名前のない関数に評価します。

これは、最初にマトリックスの行のすべての3要素サブセットを計算することによって行われます。次に、このようなサブセットごとに転置し、行の3要素サブセットを計算ます。これにより、可能性のあるすべての3x3部分行列が得られます(ただし、それらは転置されます)。次に、それらすべての平均を計算し、全体の最小値を見つけます。


7

ゼリー15 12バイト

œc3S€Zµ⁺FṂ÷9

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

使い方

œc3S€Zµ⁺FṂ÷9  Main link. Argument: M (matrix)

œc3           Yield all combinations of 3 rows.
   S€         Map column-wise sum over the combinations.
     Z        Zip, transposing rows and columns.
      µ       Combine all links to the left into a chain.
       ⁺      Duplicate the chain, executing it twice.
        F     Flatten.
         Ṃ    Take the minimum.
          ÷9  Divide it by 9.

œc3S€µ⁺€FṂ÷9D:ほら、あなたは同じことをやるだけのことのように- EDITは...私が得たものである
ジョナサン・アラン

17秒で忍者。:Pとにかくありがとう。:)
デニス

私は仕方がありませんが、取り除く方法があると思います 93、繰り返されるチェーン内で分割3、11で可能なように正しい引数として取得することは可能ですか?
ジョナサンアラン

1バイトではなく、1バイトを保存するにはそれが必要です。チェーンの外側に3を配置することはできません(モナドであり、使用するためにグループ化する必要があるため)。また、チェーン内に3明示的に指定するか、グループ化する必要があります÷
デニス

4

05AB1E21 16バイト

2Fvyæ3ùO})ø}˜9/W

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

説明

  • 各行について、サイズ3の各順序付きサブセットの合計を取得します
  • 結果の行列を転置する
  • 各行について、サイズ3の各順序付きサブセットの合計を取得します
  • 結果の行列を平坦化します
  • 9で割る
  • 最小値を取得


0

、198バイト

Hexdump:

00000000 bc 81 bd a0 65 40 a0 5d dd a0 68 50 80 a0 77 20  ¼.½ e@ ]Ý hP. w 
00000010 80 01 dd a0 66 25 3b 52 cc cb c0 50 84 a0 5d 20  ..Ý f%;RÌËÀP. ] 
00000020 66 87 4c cc a0 68 8b 20 66 8c 25 3b cd d0 84 a0  f.LÌ h. f.%;ÍÐ. 
00000030 5d 20 66 80 4e a0 66 81 4c d3 a0 65 a0 5d a0 68  ] f.N f.LÓ e ] h
00000040 4c a0 66 8c 25 3a 8b 25 3a 50 84 a0 5d 20 66 bd  L f.%:.%:P. ] f½
00000050 a0 6e 43 a5 39 a5 3a a5 3b 00 bd a0 5f 43 cf 20   nC¥9¥:¥;.½ _CÏ 
00000060 6e 00 3d a0 69 20 12 b6 a7 36 a7 26 4d a0 69 80  n.= i .¶§6§&M i.
00000070 53 d0 80 a0 1f 20 80 45 a0 69 53 d0 80 a0 6e 20  SÐ. . .E iSÐ. n 
00000080 80 8b 40 a0 6f a0 75 4c a0 6f 8b 53 d0 80 a0 5f  ..@ o uL o.SÐ. _
00000090 20 80 8b 40 a0 6f a0 74 4c a0 6f 8b 50 84 d0 84   ..@ o tL o.P.Ð.
000000a0 a0 77 20 75 20 74 4c d3 a0 65 a0 5f 50 80 a0 43   w u tLÓ e _P. C
000000b0 20 80 01 81 25 3b 4c d3 a0 65 20 6e 81 25 3b 26   ...%;LÓ e n.%;&
000000c0 4c a0 69 8e 25 42                                L i.%B
000000c6

同等のJavaScript:

// indices array increment function
var i=(a,l=$.length,j=2)=>++a[j]>=l+j-2?a[j]=j&&i(a,l,j-1)+1:a[j],
// row indices
    r=[0,1,2],
// column indices
    c=[...r],
// minimum sum
    m=Infinity;
do{
  do{
// calculate sum of current row/column indices and keep minimum
    m=Math.min(m,
      (r.reduce((s,y)=>s+c.reduce((s,x)=>s+$[y][x])))
    )
// until column indices loop
  }while(i(c,A.length)!=2)
// until row indices loop
}while(i(r)!=2)
// output mean
m/9

こちらからデモをお試しください

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