给定一个长度为 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
15 个解决方案
15
,3字节
ṡÆṁ
向量化中位数是否是 Golflang 设计的良好选择?我不知道。但它在这里肯定有帮助。
获取列表然后 k。
解释
ṡÆṁ
ṡ # Get all overlaps in the list of length k
Æṁ # Find the median of each
💎
的帮助下创建。
\endgroup
|
,24字节
[ clump [ median ] map ]
\endgroup
|
,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
–
|
,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
–
|
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
|
,4字节
lv∆ṁ
l # Get all overlapping slices of length k
v∆ṁ # Take the median of each
\endgroup
|
,13字节
⊡⌊÷2⊸⧻⍉≡⊏⊸≡⍏◫
⊡⌊÷2⊸⧻⍉≡⊏⊸≡⍏◫
◫ # windows of length k
≡⊏⊸≡⍏ # sort each window
⍉ # transpose
⊡⌊÷2⊸⧻ # get the middle row
\endgroup
|
APL+WIN,30字节
提示输入数字向量,后跟 k
(⌈.5×k)⌷¨(⊂¨⍒¨i)⌷¨i←(k←⎕),/v←⎕
\endgroup
|
,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
|
带图像包,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
|
Google 表格,60 字节
=MAP(SEQUENCE(B1-B2+1),LAMBDA(i,MEDIAN(OFFSET(A4,i-1,,B2))))
\endgroup
|
, 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
–
|
,47字节
$[a,k]->map 0..-size a k'i->median a\[i..i+k-1]
需要现代版 Arturo,这样median
就不会出现故障。所以没有在线链接。
\endgroup
1
-
\begingroup
您以管理员身份运行 Arturo 吗?
\endgroup
–
|
,23 字节
Median/@##~Partition~1&
未命名函数需要两个格式为 的参数[{3,5,8,2,4,7,5,2,7,4},3]
。##~Partition~1
与 相同,它创建长度为 的子列表Partition[#1,#2,1]
数组。#2
#1
\endgroup
|
,44字节
f(L,N,K)=[L[i+1...i+K].medianfori=[0...N-K]]
\endgroup
|
“滚动中位数”可能是一个好名字
\endgroup
–
对于那些想要测试其解决方案效率的人,请参阅。
\endgroup
–
|