\begingroup

给定一个长度为 N 的整数数组和一个奇数 K,返回 N – K + 1 个整数,其中第 i 个整数表示从 i 开始的 K 长度子数组的中位数。

您可以编写完整的程序或函数。

输入是 N、K 和输入数组。您可以以任何合理的形式输入,如果没有必要,则不必输入长度。

样本测试(输入形式为 N、K,然后是数组)

10 3
3 5 8 2 4 7 5 2 7 4

输出

5 5 4 4 5 5 5 4

如何获得输出:

  • 第一个数字是范围 [1, 3] 或 [1, 1 + K – 1] 的中位数
  • 第二个数字是范围 [2, 4] 的中位数

这是,因此最短的代码获胜!(以字节为单位。)

\endgroup

2

  • 1
    \begingroup
    “滚动中位数”可能是一个好名字
    \endgroup


    – 

  • 1
    \begingroup
    对于那些想要测试其解决方案效率的人,请参阅
    \endgroup


    – 


15 个解决方案
15

\begingroup

,3字节

ṡÆṁ

向量化中位数是否是 Golflang 设计的良好选择?我不知道。但它在这里肯定有帮助。

获取列表然后 k。

解释

ṡÆṁ­⁡​‎‎⁡⁠⁡‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁢‏⁠‎⁡⁠⁣‏‏​⁡⁠⁡‌­
ṡ    # ‎⁡Get all overlaps in the list of length k
 Æṁ  # ‎⁢Find the median of each
💎

的帮助下创建

\endgroup

\begingroup

,24字节

[ clump [ median ] map ]

\endgroup

\begingroup

45 39 字节

编辑:-6 字节,感谢

\(x,N,K)Map(\(i)median(x[1:K+i]),K:N-K)


+,15字节

zoo::rollmedian

(不使用输入N

\endgroup

2

  • \begingroup
    我看到你已经回答了,所以在自己尝试之前没有偷看…但当我最终查看时,我发现我得到的结果非常相似:
    \endgroup


    – 

  • \begingroup
    @DominicvanEssen 谢谢,这是一个更好的索引管理。
    \endgroup


    – 

\begingroup

,67 字节

x=>k=>g=n=>n<k?[]:[...g(n-1),x.slice(n-k,n).sort((p,q)=>p-q)[k>>1]]

7671字节

不要读n

x=>n=>x.flatMap(c=>++k<0?[]:x.slice(k,k+n).sort((p,q)=>p-q)[n>>1],k=-n)

\endgroup

1

  • \begingroup
    通过将类型数组作为输入,得到
    \endgroup


    – 

\begingroup

3,58 字节

lambda n,x,k:[sorted(x[i:i+k])[k//2]for i in range(n-k+1)]


3,61 字节

不需要n

lambda x,k:[sorted(x[i:i+k])[k//2]for i in range(len(x)-k+1)]

\endgroup

\begingroup

,4字节

lv∆ṁ

l    # Get all overlapping slices of length k
 v∆ṁ # Take the median of each

\endgroup

\begingroup

,13字节

⊡⌊÷2⊸⧻⍉≡⊏⊸≡⍏◫

⊡⌊÷2⊸⧻⍉≡⊏⊸≡⍏◫­⁡​‎‎⁡⁠⁤⁡‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁢⁤‏⁠‎⁡⁠⁣⁡‏⁠‎⁡⁠⁣⁢‏⁠‎⁡⁠⁣⁣‏⁠‎⁡⁠⁣⁤‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁢⁣‏‏​⁡⁠⁡‌⁤​‎‎⁡⁠⁡‏⁠‎⁡⁠⁢‏⁠‎⁡⁠⁣‏⁠‎⁡⁠⁤‏⁠‎⁡⁠⁢⁡‏⁠‎⁡⁠⁢⁢‏‏​⁡⁠⁡‌­
            ◫  # ‎⁡windows of length k
       ≡⊏⊸≡⍏   # ‎⁢sort each window
      ⍉        # ‎⁣transpose
⊡⌊÷2⊸⧻         # ‎⁤get the middle row

\endgroup

\begingroup

APL+WIN,30字节

提示输入数字向量,后跟 k

(⌈.5×k)⌷¨(⊂¨⍒¨i)⌷¨i←(k←⎕),/v←⎕

\endgroup

\begingroup

,8

ãV ËÍgVz

ãV ËÍgVz     :Implicit input of array U & integer V
ãV           :Sub-arrays of U of length V
   Ë         :Map
    Í        :  Sort
     g       :  Get element at 0-based index
      Vz     :    V floor divided by 2

\endgroup

\begingroup

带图像包,31 字节

@(x,k)median(im2col(x,[1 k]),1)

怎么运行的

@(x,k)定义一个匿名函数输入x(行向量)和k(标量)。

im2col(x,[1 k])x产生长度为 的滑块k,排列为矩阵的列。对于输入x = [3 5 8 2 4 7 5 2 7 4]k = 3这给出

3   5   8   2   4   7   5   2
5   8   2   4   7   5   2   7
8   2   4   7   5   2   7   4

median(...,1)沿第一维(即垂直方向)计算中值。

\endgroup

\begingroup

Google 表格,60 字节

=MAP(SEQUENCE(B1-B2+1),LAMBDA(i,MEDIAN(OFFSET(A4,i-1,,B2))))

\endgroup

\begingroup

 4  3

ṡÆṁ

二元链接接受左侧的可排序数字列表和右侧的中缀长度,并产生一个数字列表。

如何?

ṡÆṁ - Link: list of numbers L, positive integer N
ṡ   - overlapping slices of {L} of length {N}
 Æṁ - median (vectorises)

\endgroup

3

  • \begingroup
    (从编辑历史来看)我想知道类似的方法是否⁹Ƥ可行,直到我意识到 Æṁ矢量化。非常有趣的行为
    \endgroup


    – 


  • \begingroup
    我当时想也许ÆṁƤ可以从 STDIN 获取长度(就像其他一些超级命令一样),然后突然想到使用。另外,我没想到你已经发布了这个!(我会以我现在身体不舒服为借口。)
    \endgroup


    – 

  • 1
    \begingroup
    希望你早日康复。不用担心重复,因为 CGSE 允许重复,这说明英雄所见略同 :p
    \endgroup


    – 

\begingroup

,47字节

$[a,k]->map 0..-size a k'i->median a\[i..i+k-1]

需要现代版 Arturo,这样median就不会出现故障。所以没有在线链接。

\endgroup

1

  • \begingroup
    您以管理员身份运行 Arturo 吗?
    \endgroup


    – 

\begingroup

,23 字节

Median/@##~Partition~1&

未命名函数需要两个格式为 的参数[{3,5,8,2,4,7,5,2,7,4},3]##~Partition~1与 相同,它创建长度为 的子列表Partition[#1,#2,1]数组#2#1

\endgroup

\begingroup

,44字节

f(L,N,K)=[L[i+1...i+K].medianfori=[0...N-K]]

\endgroup