四分位数均值


26

任务

给定(以任何方式)排序的浮点数据集,返回(以任何方式并在正确值的1‰之内)四分位数均值

一种可能的算法

  1. 丢弃数据点的最低和最高的四分之一。
  2. 计算剩余数据点的平均值(总和除以计数)。

注意:如果数据集大小不能一分为四,则必须权衡子集共享的数据点。请参阅下面的示例评估2

评估示例1

给定{1,3,4,5,6,6,7,7,8,8,9,38}

  1. 数据计数是12,所以我们除去最低和最高3数据点:
    { 1,3,4, 5,6,6,7,7,8,8,9,38 }
  2. 其余6个数据点的平均值:
    (5 + 6 + 6 + 7 + 7 + 8)/ 6 = 6.5

评估示例2

给定{1、3、5、7、9、11、13、15、17}

  1. 计数为9,因此每个季度都有2¼个数据点:
    { 1,2,(0.25×5),(0.75×5),7,9,11 ,(0.75×13),(0.25×13),15,17 }
  2. 其余4.5个数据点的平均值:
    (0.75×5 + 7 + 9 + 11 + 0.75×13)/ 4.5 = 9

Answers:



8

Pyth11 10字节

.O> <lQS * 4Ql
.OsPtc4S * 4

测试套件。

怎么运行的

它将输入列表加倍,以确保数据计数可被4整除。

它仍然需要排序,因为它*4适用于整个列表而不是每个单独的元素。

然后,它将列表分为四个相等的部分,然后删除第一部分和最后一部分。

其余列表被展平并取平均值。


8

MATL12 11字节

4Y"G"6L)]Ym

输入是水平向量,格式为

[1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38]

要么

[1 3 4 5 6 6 7 7 8 8 9 38]

在线尝试!

说明

4Y"    % Input horizontal vector implicitly. Repeat each element 4 times (run-length
       % decoding). The resulting array is still sorted.
G"     % Push input, for each: repeat as many times as the input size
  6L)  %   Remove first and last elements, by applying the index "2:end-1"
]      % End for each
Ym     % Compute mean. Display implicitly

我不明白 如何6L)删除第一个和最后一个元素?当我这样做时,它会推入一堆复数。
DJMcMayhem

5
@DrGreenEg​​gsandIronMan复数可用于MATL。虚数单位表示数组的末尾,如果三个数字中有两个数字,则它们定义一个范围。因此,[2, -1+i]当用作指标时2:end-1
Luis Mendo

7

雪人,66位元组

}vg","aS:10sB;aM4aRAsOal`,4nD,`aG0AaGal`NdE`AaL1AfL:nA;alaF,nDtSsP

在线尝试!

使用与@LeakyNun的答案相同的算法。

}         enable variables b, e, and g
vg        read a line of input into b
","aS     split on commas (in-place)
:10sB;aM  convert each element in resulting array to number ("frombase(10)-map")
4aR       repeat the array 4 times
AsO       sort the array
al        take the length and put it in e without consuming b (the array)
`,        swap b and e, then move e to g; now b=length g=array
4nD       divide b by 4 (4 was stored in e, which is why the array was moved)
,`        move the array and length/4 back to their original positions
aG        split the array into groups of length (length/4)
0AaG      take all elements with index >0 (i.e. remove the first element)
al        store the length of the new array in e again
`NdE`     bring it up to b, decrement, and put it back
AaL       take all elements with index <length-1 (i.e. remove last)
1AfL      flatten the array 1 level deep
:nA;      push a block that adds two numbers (to e)
al        store the length of this new array in g
aF        fold b over e (sum the numbers)
,         move g (the length) into e
nD        divide the sum by the length, resulting in the average
tSsP      to-string and print

2
这种语言看起来糟透了。我喜欢它。
Mego




4

Brachylog,21个字节

:3jo@4brbcLl/N,L+:N*.

在线尝试!验证多个测试用例

说明

这基本上是@LeakyNun的Pyth答案算法。

:3j      Append 3 copies of the input to itself
o@4      Sort and split in 4 lists of equal length
brb      Remove the head and the tail of the list of lists
cL       Concatenate the 2 sublists into a list L
l/N,     N is the inverse of the length of L
L+:N*.   Output is the product of N and the sum of the elements of L

唯一的小技巧是乘以长度的倒数而不是除以长度,因为2个整数之间的除法是整数除法。


3

八度,44字节

@(x)mean(reshape(~~(1:4)'*x,[],4)(:,2:3)(:))

这定义了一个匿名函数。

输入是水平向量。

在ideone上尝试一下

说明

首先将输入的水平向量乘以*4的列向量(用建~~(1:4)')乘以()。结果是一个四列矩阵,其中每一行都是输入向量的副本。然后,在保持元素线性顺序的同时,将其重塑为4列矩阵(reshape(...,[],4))。保留中心两列((:,2:3))并线性化为单个列((:)),然后计算平均值(mean(...))。


您可以保存更具可读性的1个字节,[x;x;x;x]而不是~~(1:4)'*x
Tom Carpenter

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))还要少2个字节。这就是我想出的原因,但基本上与您的方法相同。
汤姆·卡彭特

@TomCarpenter我不认为这是相似的。我认为您应该将其作为单独的答案发布
路易斯·门多



2

八度,42bytes

Octave的另一个匿名函数。

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))

您可以在线尝试。只需输入该命令,然后执行do ans([1 2 4 5 6 9])或所需的任何数字即可。

首先从输入数组创建一个每个输入元素包含4个元素的方法,方法是先垂直连接四个副本,然后垂直将其展平。这将保持排序顺序。

然后从输入数组的长度加1到输入数组的长度的三倍提取元素的范围。因为新数组的长度是原来的四倍,所以会砍掉上下四分位数。

最后,返回新数组的均值。


2

05AB1E,15字节

€D€D¹gô¦¨˜DOsg/

说明

€D€D             # quadruple each element in list
    ¹gô          # split into pieces the size of input
       ¦¨˜       # remove the first and last and flatten the middle 2
          DOsg/  # sum and divide by length

在线尝试


2

APL(Dyalog),15字节

IQM←(+/÷≢)≢↓-∘≢↓4∘/

在线尝试!

4∘/ 每个元素一式四份

-∘≢↓ 删除与参数中的元素一样多的尾随元素

≢↓ 删除与参数中的元素一样多的前导元素

() 应用以下默认功能:

+/ 总和

÷ 除以

 理货


1

JavaScript(ES6),75个字节

a=>a.concat(a,a,a).sort(g=(x,y)=>x-y).slice(l=a.length,-l).reduce(g,0)/l/-2

使用明显的四重排序方法,我开始使用reduce,这很好。唯一的窍门是通过重用排序比较器从零减去所有数组元素来节省4个字节,这给了我所需的-2l时间。


1

Golfscript,28个 29字节

〜.4 * $ \,。@ / 1> 2 <{+} * {+} *'/'@ 2 *
〜.4 * $ \,。@ / 1> 2 <{+} * {+} * \ 2 * -1?*

在线尝试!


1

其实是12个位元组

4α;l¼≈;±(Htæ

在线尝试!(当前不起作用,因为TIO落后几个版本)

说明:

4α;l¼≈;±(Htæ
4α            repeat each element 4 times
  ;l¼≈        length divided by 4, as integer
      ;±      copy, unary negate
        (Ht   remove first and last quartiles
           æ  mean

1

Mathematica,51个字节

Mean@#[[(l=1+Length@#/4);;-l]]&@Sort@Join[#,#,#,#]&

对列表进行排序的四个副本(防止与列表的长度不是四的倍数的问题),参与"1 quarter the length of resulting list plus 1"过的"1/4 length list + 1 from the end",需要他们Mean


1

Java 146126字节

这样的java很冗长!

float m(float[]n){float r=0;int l=n.length,i=l/4;r-=(n[i])*(l%4)/4;r+=n[i*3]*(4-(l%4))/4;for(;i<l*3/4;r+=n[i],i++);return r/l*2;}

较旧的Ungolfed部分可读的测试用例

/**
 *
 * @author rohan
 */
public Golf{

float m(float[]n){
//declarations 
float r=0;
int x,i=0,l=n.length;
//sum the array 
for(float m:n){r+=m;}
//remove the excess
for(;i<l/4;r-=n[i]+n[l-i-1],i++);
//weight the quartiles
r-=(n[l/4]+n[l*3/4])*(l%4)/4;
//return the sum/length but multiply by two since only half of the set is averaged
return r/l*2;
    }
static void interQuartileMean(float... set){
    System.out.println(new Golf().m(set));
}
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    //test cases pass with flying colours
        interQuartileMean(1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38);
        interQuartileMean(1, 3, 5, 7, 9, 11, 13, 15, 17);   
    }

}

1

Clojure,82 81字节

编辑:通过重写“除以2 n”部分少1个字节。

#(let[n(count %)](*(/ n)0.5(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))))

以前:

#(let[n(count %)](/(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))(* 2.0 n)))

用于for生成4个重复值,使用float 2.0不具有分数结果,其余只是标准值。


1

R,17 11字节

mean(n,0.25)

假设n输入向量为标准R形式n=c(1, 2, 3, ...)

毫不奇怪,因为R可以被视为“统计计算的语言”,并且具有许多统计内置函数。

更新。由于rturnbull节省了6个字节,因为trim默认情况下它是第一个可选参数!

测试用例:

a <- c(1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38)
b <- c(1, 3, 5, 7, 9, 11, 13, 15, 17)
mean(a,trim=0.25) # Returns 6.5
mean(b,trim=0.25) # Returns 9

由于trim是默认的第二个参数,因此无需命名。0.25可以缩短为.251/4。这样可以节省六个字节。
rturnbull

0

Excel,17个字节

=TRIMMEAN(A:A,.5)

宽松的输入格式使此操作变得容易。在A列中每行输入一个。

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.