사 분위수 평균


26

태스크

정렬 된 부동 소수점 데이터 세트가 주어진 경우 ( 사소한 방법으로 올바른 값의 1 ‰ 이내) 사 분위수 평균을 반환 합니다.

하나의 가능한 알고리즘

  1. 데이터 포인트의 최저 및 최고 분기를 폐기하십시오.
  2. 나머지 데이터 포인트의 평균 (수를 수로 나눈 값)을 계산합니다.

참고 : 데이터 세트 크기를 4 개로 균등하게 분할 할 수없는 경우 하위 세트가 공유 하는 데이터 포인트의 무게측정해야 합니다. 아래의 평가 예 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/4 데이터 포인트가 있습니다 :
    { 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> <1QS * 4Ql
.OsPtc4S * 4

테스트 스위트.

작동 원리

데이터 수를 4로 나눌 수 있도록 입력 목록을 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
MATL에서는 @DrGreenEggsandIronMan 복소수를 사용할 수 있습니다. 허수 단위는 배열의 끝을 나타내며 세 개의 숫자 중 두 개가 있으면 범위를 정의합니다. 따라서 [2, -1+i]색인 수단으로 사용될 때2:end-1
Luis Mendo

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
이 언어는 끔찍해 보인다. 나는 그것을 좋아한다.
Mego


5

젤리 , 14 13 12 바이트

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

온라인으로 사용해보십시오!

테스트 스위트.

작동 원리

그것은 Pyth에서대답을 번역 한 것입니다 .


APL에서 15 일을 할 수 있기 때문에 이것이 단축 될 수 있다고 확신합니다.
Adám

@ Adám 솔루션을 게시하십시오 (하하를 복사 할 수 있도록)
Leaky Nun

마리 누스에게 기회를주고 싶다 ...
Adám


확실히 9 개월 이후의 충분한 기회
Luis Mendo


4

Brachylog , 21 바이트

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

온라인으로 사용해보십시오! 또는 여러 테스트 사례를 확인

설명

이것은 기본적으로 @LeakyNun의 Pyth 답변 알고리즘입니다.

: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에서 사용해보십시오 .

설명

입력 된 수평 벡터는 먼저 행렬 곱한 ( *) 4 개의 열 벡터로 구성됩니다 (로 빌드 됨 ~~(1:4)'). 결과는 각 행이 입력 벡터의 복사 본인 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 바이트가 적습니다. 그래서 제가 생각해 냈지만 기본적으로 귀하의 접근 방식과 동일합니다.
Tom Carpenter

@ TomCarpenter 나는 그것이 비슷한 생각하지 않습니다. 나는 당신이 그것을 별도의 답변으로 게시해야한다고 생각합니다
Luis Mendo

3

J , 20 18 바이트

@ 마일 덕분에 2 바이트

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

온라인으로 사용해보십시오! ( 온라인 통역사 )

용법

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

작동 원리

그것은 Pyth에서대답을 번역 한 것입니다 .



@ Adám Thanks가 추가되었습니다.
Leaky Nun

2
중간 부분의 평균 -@#(+/%#)@}.#}.4#]18 바이트로 직접 가져올 수 있습니다 .
마일


2

옥타브, 42 바이트

옥타브를위한 또 다른 익명 함수.

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

당신은 할 수 있습니다 온라인으로보십시오 . 해당 명령을 입력 한 다음 수행 할 작업 ans([1 2 4 5 6 9])또는 숫자 를 입력하십시오 .

이 작업은 먼저 4 개의 사본을 세로로 연결 한 다음 세로로 평평하게하여 각 입력 요소가 4 개인 입력 배열에서 1을 작성합니다. 정렬 순서가 유지됩니다.

그런 다음 입력 배열의 길이에 1의 입력 배열 길이의 3 배를 더한 요소의 범위를 추출합니다. 새로운 배열은 4 배 더 길기 때문에 위와 아래 사 분위를 잘라냅니다.

마지막으로 새 배열의 평균이 반환됩니다.


2

05AB1E, 15 바이트

€D€D¹gô¦¨˜DOsg/

설명

€D€D             # quadruple each element in list
    ¹gô          # split into pieces the size of input
       ¦¨˜       # remove the first and last and flatten the middle 2
          DOsg/  # sum and divide by length

온라인으로 사용해보십시오


2

APL (Dyalog) , 15 바이트

IQM←(+/÷≢)≢↓-∘≢↓4∘/

온라인으로 사용해보십시오!

4∘/ 각 원소를 네 배로

-∘≢↓ 인수에 요소가있는만큼 후행 요소를 삭제

≢↓ 인수에 요소가있는만큼 선행 요소를 삭제

() 다음 암묵적 기능을 적용하십시오.

+/ 합계

÷ 로 나눈

 탈리


1

자바 스크립트 (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합니다. 여기에서 유일한 속임수는 정렬 비교기를 다시 사용하여 0에서 모든 배열 요소를 빼서 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[#,#,#,#]&

4의 배수가 아닌 목록 길이의 문제를 방지하기 위해 목록의 4 개 사본을 정렬하고에 참여 "1 quarter the length of resulting list plus 1"하고를 "1/4 length list + 1 from the end"가져옵니다 Mean.


1

자바 146126 바이트

그런 자바는 매우 장황하다!

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

클로저, 82 81 바이트

편집 : "didvide by 2 n"부분을 다시 쓰면 1 바이트가 줄어 듭니다.

#(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)))

소수 결과를 갖지 않는 forfloat를 사용하여 4 개의 반복 된 값을 생성하는 데 사용 되며 2.0나머지는 표준입니다.


1

R, 17 11 바이트

mean(n,0.25)

n표준 R 형식의 입력 벡터 라고 가정 합니다 n=c(1, 2, 3, ...).

R이 "통계 컴퓨팅을위한 언어"로 간주 될 수 있고 많은 통계가 내장되어 있기 때문에 이것은 놀라운 일이 아닙니다.

최신 정보. rturnbull 덕분 trim에 기본적으로 첫 번째 선택적 인수 이므로 6 바이트를 절약 했습니다!

테스트 사례 :

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로 단축 될 수 있습니다 . 이렇게하면 6 바이트가 절약됩니다. .251/4
rturnbull

0

Excel, 17 바이트

=TRIMMEAN(A:A,.5)

편안한 입력 형식으로이를 쉽게 수행 할 수 있습니다. 열 A에 행당 하나를 입력하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.