Міжквартальне середнє


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

Відповіді:



8

Pyth , 11 10 байт

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

Тестовий набір.

Як це працює

Він у чотирьох формах перераховує вхідний список, щоб переконатися, що кількість даних розділяється на 4.

Це все ще потребує сортування, тому що *4 стосується всього списку замість кожного окремого елемента.

Потім він розбиває список на чотири рівні частини, потім забирає першу і останню частину.

Список, що залишився, вирівняний і взято середнє значення.


8

MATL , 12 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
@DrGreenEggsandIronMan Комплексні номери можуть використовуватися для цього в MATL. Уявна одиниця означає кінець масиву, і якщо є два з трьох чисел, вони визначають діапазон. Тож, [2, -1+i]коли використовується як індекс, означає2:end-1
Луїс Мендо

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
Ця мова виглядає жахливо. Я це люблю.
Мего


5

Желе , 14 13 12 байт

x4ṫL '$ ḣLN $ S ÷ LH
 x4ṫLḊḣLN $ S ÷ LH
x4œs4ḊṖFS ÷ LH

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

Тестовий набір.

Як це працює

Це переклад моєї відповіді в Pyth .


Я впевнений, що це можна скоротити, оскільки я можу це зробити 15 в APL.
Адам

@ Adám Будь ласка, опублікуйте своє рішення (щоб я можу скопіювати ха-ха)
Leaky Nun

Я хочу дати шанс Марінусу ...
Адам


Досить шансів через більше 9 місяців, звичайно
Луїс Мендо


4

Брахілог , 21 байт

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

Спробуйте в Інтернеті! або перевірити кілька тестових випадків

Пояснення

Це в основному алгоритм відповіді Pyth @ LeakyNun.

: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

Єдина маленька хитрість полягає в множенні на обернену довжину замість ділення на довжину, оскільки ділення між двома цілими числами - це ціле ділення.


3

Октава , 44 байти

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

Це визначає анонімну функцію.

Вхід - горизонтальний вектор.

Спробуйте це на ideone .

Пояснення

Вхідний горизонтальний вектор спочатку матрично множиться ( *) на вектор стовпців із чотирьох (побудований з ~~(1:4)'). Результат - матриця з чотирма стовпцями, де кожен рядок є копією вхідного вектора. Потім це переробляється, зберігаючи лінійний порядок елементів, у матрицю з 4 стовпцями ( reshape(...,[],4)). У центрі два стовпці зберігаються ( (:,2:3)) та лінеаризовані в один стовпчик ( (:)), середній з яких обчислюється ( mean(...)).


Ви можете зберегти 1 байт, читаючи [x;x;x;x]замість цього~~(1:4)'*x
Том Карпентер,

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))також на 2 байти менше. Ось чому я і придумав, але в основному такий же, як і ваш підхід.
Том Карпентер,

@TomCarpenter Я не думаю, що це так схоже. Я думаю, ви повинні опублікувати це як окрему відповідь
Луїс Мендо

3

J , 20 18 байт

2 байти завдяки @miles

# -: @% ~ - @ # + / @}. #}. 4 #]
- @ # (+ /% #) @}. #}. 4 #]

Спробуйте в Інтернеті! ( Інтернет-перекладач )

Використання

>> f =: -@#(+/%#)@}.#}.4#]
>> f 1 3 5 7 9 11 13 15 17
<< 9

Як це працює

Це переклад моєї відповіді в Pyth .



@ Adám Спасибі, додано.
Лина монашка

2
Можна просто безпосередньо взяти середню середню частину -@#(+/%#)@}.#}.4#]на 18 байт .
милі


2

Октава, 42 байт

Ще одна анонімна функція для Octave.

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

Ви можете спробувати в Інтернеті . Просто введіть цю команду, а потім виконайтеans([1 2 4 5 6 9]) чи будь-які потрібні цифри.

Цей починається із створення вхідного масиву з 4-х кожного вхідного елемента спочатку об'єднанням чотирьох копій по вертикалі, а потім вирівнюванням по вертикалі. Це підтримує порядок сортування.

Потім витягується діапазон елементів з довжини вхідного масиву плюс 1 до трьох разів більше довжини вхідного масиву. Оскільки новий масив у чотири рази довший, це рубить верхній і нижній квартилі.

Нарешті повертається середнє значення нового масиву.



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

Власне, 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

Математика, 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 146 126 байт

Така ява набагато багатослівна!

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 байт

Редагувати: на 1 байт менше, переписавши частину "didvide на 2 n".

#(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це вхідний вектор у стандартній формі Rn=c(1, 2, 3, ...) .

Це ні в чому не дивно, оскільки R можна вважати "мовою статистичних обчислень" і має багато статистичних вбудованих даних.

ОНОВЛЕННЯ.Збережено 6 байт завдяки rturnbull, оскільки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можна скоротити до .25або 1/4. Це заощадить вам шість байтів.
rturnbull

0

Excel, 17 байт

=TRIMMEAN(A:A,.5)

Розслаблений формат введення робить це легко. Введіть по одному рядку у стовпчик А.

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