П'ять нумів і трохи


14

(парадокс, парадокс, найбільш геніальний парадокс)

Це перша частина багатоскладової серії, натхненна різними функціями R.

Завдання

З огляду на набір даних D позитивних цілих чисел, мені потрібно , щоб обчислити зведення 5 числа від D . Однак я працюю над великими наборами даних, тому мені потрібно, щоб ваш код був якомога меншим, що дозволяє мені зберігати його на своєму комп’ютері.

Підсумок п'яти чисел складається з:

  • Мінімальне значення
  • Перший квартал (Q1)
  • Середній / другий квартал (Q2)
  • Третій квартал (Q3)
  • Максимальне значення

Існує кілька різних способів визначення квартілів, але ми будемо використовувати той, реалізований R:

Визначення:

  • Мінімальні та максимальні: найменші та найбільші значення відповідно.
  • Медіана: середнє значення, якщо D має непарну кількість записів, і середнє арифметичне для двох середніх значень, якщо D має парну кількість записів. Зауважте, що це означає, що медіана може бути цілим значенням. Нам раніше доводилося обчислювати медіану .
  • Перший і Третій чвертілі: Розділіть дані на дві половини, включаючи центральний елемент у кожній половині, якщо D має непарну кількість записів, і знайдіть середнє значення кожної половини. Медіана нижньої половини - Перший чверть, а медіана верхньої половини - Третя чверть.

Приклади:

D=[1,2,3,4,5] . Тоді медіана становить3 , а нижня половина -[1,2,3] , даючи перший чверть2 , а верхня половина -[3,4,5] , даючи третю чверть4 .

D=[1,3,3,4,5,6,7,10] . Медіана -4.5 , а нижня -[1,3,3,4] , даючи перший чверть3 , а верхня половина -[5,6,7,10] , даючи третю чверть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

Відповіді:


6

R , 7 байт

fivenum

Спробуйте в Інтернеті!

Очевидна нахабна відповідь. ;-)

Цікаво, що fivenum(x)він не еквівалентний summary(x)навіть коли xє числовим, оскільки кванти обчислюються по-різному: в fivenumсередньому при розривах, тоді як summaryінтерполяти. Ви можете змусити summaryсебе поводитись так, як fivenumз варіантом quantile.type, але це все-таки довше, ніж

R , 51 байт

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

Спробуйте в Інтернеті!

t=2н3(мод4)

Зауважте, що вихідний код fivenumвбудованого дуже відрізняється (і набагато довше).


Єдине, що я можу знайти, це те, що quantileповертає названий вектор, поки він fivenumне називається. Можливо, це проблема нижче за те, де fivenumвикористовується?
JAD

@JAD Включення коду в unname()вирішило б це. Може, є історичні причини?
Робін Райдер

1
Ваша функція відрізняється від fivenumвходів довжиною 3 мод 4, включаючи два тестові випадки.
Nitrodon

@Nitrodon Argh! Дякуємо, що помітили! Зараз має бути гаразд.
Робін Райдер

5

MATL , 18 байт

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

Порядок випуску збільшується, як і в тестових випадках.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

MATL, як і MATLAB, обчислює кванти, використовуючи лінійну інтерполяцію, якщо це необхідно (так само, як зазначено в виклику для медіани). Для досягнення необхідної поведінки для першого та третього квартилів досить повторити медіану, якщо довжина введення непарна. Тоді результати - лише 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 числами.

{мiн,мах,Q1,Q2,Q3}

Я зняв кілька байтів, взявши підказки з відповіді FlipTack на Compute Median.

Спробуйте в Інтернеті!

Як це працює?

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 завдяки стельовій кішці.

Припускає список, відсортований у порядку зростання.

Виходи в порядку: min, Q1, Q2, Q3, max.

#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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.