ファイブナムと少し


14

(パラドックス、パラドックス、最も独創的なパラドックス)

これは、さまざまなR関数に触発されたマルチパートシリーズの最初のパートです。

タスク

データセットを考えるとD正の整数の、私はあなたが計算する必要が5数要約D。ただし、大規模なデータセットで作業しているため、コードをできるだけ小さくして、コンピューターに保存できるようにする必要があります。

5つの数字の概要は次のとおりです。

  • 最小値
  • 最初の四分位(Q1)
  • 中央値/ 2分の1(Q2)
  • 3番目の四分位(Q3)
  • 最大値

四分位数を定義する方法はいくつかありますが、Rによって実装された方法を使用します。

定義:

  • 最小値と最大値:それぞれ最小値と最大値。
  • 中央値以下の場合中央値Dあればエントリの奇数、及び2つの中間最も値の算術平均値を有し、Dエントリの偶数を有します。これは、中央値が非整数値であることを意味することに注意してください。以前に中央値計算する必要がありました。
  • 第1四分位と第3四分位:Dのエントリ数が奇数の場合、各半分の中央要素を含む2つの半分にデータを分割し、各半分の中央値を求めます。下半分の中央値は第1四分位、上半分の中央値は第3四分位です。

例:

D=[12345]。中央値は、その後で3、及び下半分である[123]の最初の四分位得2、上半分である[345]の第三四分位生じ、4

D=[133456710]。中央値は4.5、下半分である[1334]の第一四分位得3、及び上半分である[56710]の第三四分位得6.5

追加のルール:

  • 入力は、配列または言語に最も近い同等のものです。
  • 配列は昇順または降順でソートされていると想定できます(ただし、どちらを指定してください)。
  • 一貫性のある順序で、任意の柔軟な形式で結果を返す/印刷することができますが、回答で順序と形式を指定してください。
  • と同等の組み込み関数fivenumが許可されていますが、独自のソリューションも実装してください。
  • 5つの数値のそれぞれが整数であるとは限りません
  • 説明が奨励されます。
  • これはなので、各言語の最短回答が勝ちです!

ランダムに生成されたテストケース

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

回答:


6

R、7バイト

fivenum

オンラインでお試しください!

明白な生意気な答え。;-)

興味深いことに、分位数は異なる方法で計算されるため、数値である場合とfivenum(x)同等ではありません。つまり、不連続点での平均、補間です。オプションを使用して強制的に動作させることができますが、これはまだsummary(x)xfivenumsummarysummaryfivenumquantile.type

R、51バイト

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

オンラインでお試しください!

t=2n3モッド4

fivenumビルトインのソースコードは非常に異なる(さらに長い)ことに注意してください。


私が見つけることができる唯一のものquantileは、名前付きベクトルを返すことですfivenum。たぶんそれはどこfivenumで使われるの下流の問題でしょうか?
JAD

@JADコードを囲むunname()ことで解決します。おそらく歴史的な理由があるのでしょうか?
ロビンライダー

1
関数は、fivenum2つのテストケースを含む、長さ3 mod 4の入力とは異なります。
ニトロドン

@Nitrodon Argh!気づいてくれてありがとう!今は大丈夫です。
ロビンライダー

5

MATL、18バイト

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

テストケースのように、出力順序は増加しています。

オンラインでお試しください!または、すべてのテストケースを確認します

説明

MATLは、MATLABと同様に、必要に応じて線形補間を使用して変位値を計算します(中央値のチャレンジで指定されたとおり)。1番目と3番目の四分位に必要な動作を実現するには、入力の長さが奇数の場合に中央値を繰り返すだけで十分です。その場合、結果は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:])]

これは、入力リストが昇順でソートされていることを前提としています。f5桁の要約を返す関数です。

{mnmaバツQ1Q2Q3}

Compute the Medianに対する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ます。余分な値は、値が2つの隣接する要素の平均であることを示します。

⊘⁺§θ⌊ι§θ⌈ι

位置の床と天井の値の平均を取ることにより、各位置で四分位を計算します。




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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.