Fivenum和一点


14

(一个悖论,一个悖论,一个最巧妙的悖论)

这是受不同R函数启发的多部分系列的第一部分。

任务

给定一个数据集d正整数,我需要你计算5号汇总d。但是,我正在处理大型数据集,因此我需要您的代码尽可能小,以便将其存储在计算机上。

这五个数字摘要包括:

  • 最低值
  • 第一四分位数(Q1)
  • 中位数/第二四分位数(Q2)
  • 第三四分位数(Q3)
  • 最大值

定义四分位数的方法有几种,但是我们将使用R实现的方法:

定义:

  • 最小值和最大值:分别为最小值和最大值。
  • 中位数:如果中间值d有奇数个条目,和两个中间最值的算术平均值,如果d有条目的偶数。请注意,这意味着中位数可能是非整数值。我们之前不得不计算中位数
  • 第一和第三四分位数:如果d的条目数为奇数,则将数据分为两半,包括每一半的中心元素,并找到每一半的中位数。下半部分的中位数是第一四分位数,上半部分的中位数是第三四分位数。

例子:

d=[1个2345]。中位数为然后3,而下半部分是[1个23],得到的第一四分位数2,和上半部是[345],得到的第三四分位4

d=[1个33456710]。中值是4.5,而下半部分是[1个334],得到的第一四分位数3,和上半部是[56710],得到的第三个四分位数6.5

附加规则:

  • 输入形式为数组或您的语言最接近的等效形式。
  • 您可能会假设数组按升序或降序排序(但请指定哪个)。
  • 您可以按照任何一致的顺序以及以您喜欢的任何灵活格式返回/打印结果,但是请在您的答案中注明顺序和格式。
  • fivenum允许使用等效的内置功能,但也请实施自己的解决方案。
  • 您可能不会假定五个数字中的每个数字都是整数。
  • 鼓励解释。
  • 这是,因此每种语言的最短答案都可以胜出!

随机生成的测试用例

1 1 1 1 1 2 2 2 2 2 3 3 4 4 4 4 4 5 5 5 -> 1 1.5 2.5 4 5 
1 2 2 2 4 4 5 5 6 7 7 8 9 9 9 9 9 10 10 10 -> 1 4 7 9 10 
2 2 2 6 8 10 15 16 21 22 23 24 26 33 35 38 38 45 46 47 48 -> 2 10 23 38 48 
1 2 9 -> 1 1.5 2 5.5 9 
1 2 3 3 3 4 9 -> 1 2.5 3 3.5 9
1 1 2 5 7 7 8 8 15 16 18 24 24 26 26 27 27 28 28 28 29 29 39 39 40 45 46 48 48 48 48 49 50 52 60 63 72 73 79 85 86 87 88 90 91 93 94 95 95 97 100 -> 1 25 45 76 100
2 2 4 4 6 8 10 11 13 14 14 15 17 21 23 24 26 27 27 28 28 30 31 33 33 34 36 36 38 38 39 40 41 42 42 43 45 45 47 47 47 47 47 48 48 48 50 51 53 53 55 56 56 56 57 57 58 62 62 63 64 64 65 65 66 67 67 67 68 69 69 71 71 71 74 79 80 81 81 81 82 82 83 83 86 86 86 87 89 94 94 94 95 95 97 98 99 100 100 100 -> 2 33.5 54 76.5 100
1 3 3 4 -> 1 2 3 3.5 4
1 3 3 3 4 -> 1 3 3 3 4

Answers:


6

R,7个字节

fivenum

在线尝试!

明显的厚脸皮答案。;-)

有趣的fivenum(x)是,summary(x)即使x是数值也不等于,因为分位数的计算方式不同:fivenum不连续的平均值,而summary内插。您可以使用该选项强制summary行为,但这要比fivenumquantile.type

R,51字节

function(x)quantile(x,(0:4)/4,t=2+5*!sum(!!x)%%4-3)

在线尝试!

t=2ñ34

请注意,fivenum内置源代码非常不同(并且更长)。


我唯一能找到的是quantile返回一个命名向量,而未fivenum命名。也许这是在哪里fivenum使用下游的问题?
JAD

@JAD将代码包含在内即可unname()解决该问题。也许有历史原因?
罗宾·赖德

1
您的功能不同于fivenum长度为3 mod 4的输入,包括两个测试用例。
Nitrodon

@Nitrodon Argh!感谢您的关注!现在应该可以了。
罗宾·赖德

5

MATL,18字节

tno?t.5Xqh]5:q4/Xq

与测试用例一样,输出顺序也在增加。

在线尝试!验证所有测试用例

说明

像MATLAB一样,MATL也会根据需要使用线性插值来计算分位数(正好在挑战中指定的中位数)。为了获得第一个和第三个四分位数的所需行为,如果输入的长度为奇数,则只需重复中位数即可。那么结果就是0,.25,.5,.75和1个分位数。

t       % Implicit input: numeric row array. Duplicate
no      % Length, parity
?       % If not zero (that is, if input length is odd)
  .5    %   Push .5
  Xq    %   .5-quantile: median. For even length it behaves as required
  h     %   Concatenate horizontally
]       % End
5:q     % Push [0 1 2 3 4]
4/      % Divide by 4, element-wise: gives [0 .25 .5 .75 1]
Xq      % [0 .25 .5 .75 1]-quantiles. Implicit display



1

Python 3.8,97个字节

lambda l:[l[0],l[-1]]+[(i[x(i)//2]+i[~x(i)//2])/2for i in(l[:~((x:=len)(l)//2-1)],l,l[x(l)//2:])]

假定输入列表按升序排序。f是用于返回5位数摘要的函数。

{一世ñ一种X1个23}

我从FlipTack的“计算中位数”答案中得到了一些提示,从而得出了一些字节

在线尝试!

它是如何工作的?

lambda l:
    [l[0],l[-1]] # The minimum and maximum, because l is assumed to be sorted in ascending order
    +[(i[x(i)//2]+i[~x(i)//2])/2 # This line computes the median...
    for i in(l[:~((x:=len)(l)//2-1)],l,l[x(l)//2:])] # ...for each of these lists (the first half, the overall list, and the second half)
    # The (x:=len) is an assignment expression from Python 3.8.
    # It assigns the len function to the variable x but also returns len.
    # Therefore, x can be used as len to save a byte (yes, just one byte)

可以使用计算中位数的函数;该提交将不再由Python(3?)提供,而是“ Python +统计信息包”或类似的文件。
朱塞佩

1

木炭,33字节

≔⊖LθηIE⟦⁰⊘÷η²⊘η⁻η⊘÷η²η⟧⊘⁺§θ⌊ι§θ⌈ι

在线尝试!链接是详细版本的代码。根据输入是升序还是降序,以升序或降序输出。说明:

≔⊖Lθη

获取最后一个元素的索引。

IE

映射以下数组的元素,并将结果转换为字符串,以便在单独的行上进行隐式打印。

⟦⁰⊘÷η²⊘η⁻η⊘÷η²η⟧

计算四分位元素的位置,其中多余0.5表示该值是两个相邻元素的平均值。

⊘⁺§θ⌊ι§θ⌈ι

通过取该位置的地板和天花板上的值的平均值来计算每个位置的四分位数。



1

C(GCC) 123个 121 119字节

-2多亏了ceilingcat。

假设列表按升序排序。

输出顺序为:最小值,Q1,Q2,Q3,最大值

#define M(K,x)(K[~-x/2]+K[x/2])/2.,
f(L,n,m)int*L;{m=n-n/2;printf("%d %f %f %f %d",*L,M(L,m)M(L,n)M((L+n/2),m)L[n-1]);}

在线尝试!


1

05AB1E,18 个字节

2F2äнIR})€ÅmIWsà‚«

输出顺序为:[Q1, Q3, Q2, min, max]

在线尝试验证所有测试用例。(我{为测试套件添加了一种排序方式,因此更容易按顺序验证测试用例[min, Q1, Q2, Q3, max]。)

说明:

2F                 # Loop 2 times:
  2ä               #  Split the list at the top of the stack into two halves
                   #  (which is the (implicit) input-list in the first iteration)
    н              #  Only leave the first halve
     IR            #  Push the input in reverse
       })          # After the loop: wrap all three lists into a list
                  # For each of the lists:
          Åm       #  Get the middle/median depending on the parity of the size of the list
            I      # Then push the input-list again
             W     # Get the minimum (without popping)
              s    # Swap to get the input-list again
               à   # Get the maximum (by popping the list)
                  # Pair the min-max together to a pair
                 « # And merge both lists together
                   # (after which the result is output implicitly)
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.