Fivenum и немного

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
Giuseppe
источник

Ответы:

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=2N3(модификация4)

Обратите внимание, что исходный код fivenum встроенного сильно отличается (и намного дольше).

Робин Райдер
источник
Единственное, что я могу найти, это то, что quantileвозвращает именованный вектор, тогда fivenumкак безымянный. Может быть, это проблема ниже по течению, где fivenumиспользуется?
JAD
@JAD Вложение кода в unname()это решит это. Может быть, есть исторические причины?
Робин Райдер
1
Ваша функция отличается от fivenumвходных данных длиной 3 mod 4, включая два контрольных примера.
Нитродон
@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-значной сводки

{мяN,мaИкс,Q1,Q2,Q3}

Я снял несколько байтов, взяв несколько подсказок из ответа FlipTack на Compute the 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)
mprogrammer
источник
хорошо использовать функцию, которая вычисляет медиану; это представление больше не будет Python (3?), но будет "Python + пакет статистики" или подобным.
Джузеппе
1

Древесный уголь , 33 байта

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

Попробуйте онлайн!Ссылка на подробную версию кода. Выводится в порядке возрастания или убывания в зависимости от того, находится ли вход в порядке возрастания или убывания. Объяснение:

≔⊖Lθη

Получить индекс последнего элемента.

IE

Сопоставьте элементы следующего массива и приведите результат к строке для неявной печати в отдельных строках.

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

Рассчитать позиции квартилей элементов, где дополнительный 0.5 означает, что значение является средним из двух соседних элементов.

⊘⁺§θ⌊ι§θ⌈ι

Рассчитайте квартиль в каждой позиции, взяв среднее значение для пола и потолка позиции.

Нил
источник
1

C (gcc) , 123 121 119 байтов

-2 благодаря потолку.

Предполагает список, отсортированный в порядке возрастания.

Выходы в порядке: мин, 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]);}

Попробуйте онлайн!

gastropner
источник
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)
Кевин Круйссен
источник