查找具有最小均值2.0的子矩阵


15

您会得到一个n×m的整数矩阵,其中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 '02

2
@KritixiLithos它使用“ submatrix”的更一般定义,其中submatrix是可以从原始文件中删除任意数量的行和列而获得的任何矩阵(因此,其余行/列不必相邻)。
Martin Ender

Answers:


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Ṃ÷9这就是我得到的...编辑-哈哈,就像你一样:D
Jonathan Allan

忍者了17秒。:P无论如何,谢谢。:)
丹尼斯

我忍不住想出有一种方法可以9通过3在重复的链中除以除法,但是是否有可能获得3正确的论点,使得它有可能在11中出现?
乔纳森·艾伦,

不是一个字节,这就是保存一个字节的过程。您不能将3放置在链的外部(这都是因为它是Monadic的,所以您必须将其分组才能使用),而在链的内部则必须3明确指定或将其分组÷
丹尼斯

4

05AB1E21 16字节

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

在线尝试!

说明

  • 对于每一行,获取大小为3的每个有序子集的总和
  • 转置结果矩阵
  • 对于每一行,获取大小为3的每个有序子集的总和
  • 展平结果矩阵
  • 除以9
  • 获得最低


0

Bean,198个字节

十六进制转储:

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

在这里尝试演示

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.