Trung bình liên


26

Bài tập

Cho (bằng bất kỳ phương tiện nào) một tập dữ liệu dấu phẩy động được sắp xếp, trả về (bằng bất kỳ phương tiện nào và trong vòng 1 ‰ giá trị đúng) có nghĩa là liên vùng .

Một thuật toán có thể

  1. Hủy các phần tư thấp nhất và cao nhất của các điểm dữ liệu.
  2. Tính trung bình (tổng chia cho số đếm) của các điểm dữ liệu còn lại.

Lưu ý: Nếu kích thước tập dữ liệu không thể chia đều thành bốn, bạn sẽ phải cân các điểm dữ liệu được chia sẻ bởi các tập hợp con. Xem ví dụ đánh giá 2 dưới đây.

Đánh giá ví dụ 1

Cho {1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38}

  1. Số lượng dữ liệu là 12, vì vậy chúng tôi xóa 3 điểm dữ liệu thấp nhất và cao nhất:
    { 1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38 }
  2. Trung bình của 6 điểm dữ liệu còn lại:
    (5 + 6 + 6 + 7 + 7 + 8) / 6 = 6.5

Đánh giá ví dụ 2

Cho {1, 3, 5, 7, 9, 11, 13, 15, 17}

  1. Đếm là 9, vì vậy mỗi quý có 2¼ datapoint:
    { 1, 2, (0,25 × 5), (0,75 × 5), 7, 9, 11, (0,75 × 13), (0,25 × 13), 15, 17 }
  2. Trung bình của 4,5 điểm dữ liệu còn lại:
    (0,75 × 5 + 7 + 9 + 11 + 0,75 × 13) / 4,5 = 9

Câu trả lời:


5

Scilab, 8 byte

trimmean

Xem tài liệu . Theo mặc định, discard=50vì vậy IQM được tính toán.

EDIT: Bạn biết đấy, đây là một câu trả lời tích hợp tầm thường, vì vậy tôi đánh dấu nó là CW .


Tôi đoán đây sẽ là người chiến thắng. Làm tốt.
Adám

8

Bình thường , 11 10 byte

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

Bộ thử nghiệm.

Làm thế nào nó hoạt động

Nó tăng gấp bốn lần danh sách đầu vào để đảm bảo rằng số lượng dữ liệu chia hết cho 4.

Nó vẫn cần sắp xếp, vì *4áp dụng cho toàn bộ danh sách thay vì cho từng yếu tố riêng lẻ.

Sau đó, nó chia danh sách thành bốn phần bằng nhau, sau đó lấy đi phần đầu tiên và phần cuối cùng.

Danh sách còn lại được làm phẳng và lấy trung bình.


8

MATL , 12 11 byte

4Y"G"6L)]Ym

Đầu vào là một vectơ ngang, với định dạng

[1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 38]

hoặc là

[1 3 4 5 6 6 7 7 8 8 9 38]

Hãy thử trực tuyến!

Giải trình

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

Tôi không hiểu Làm thế nào để 6L)loại bỏ các yếu tố đầu tiên và cuối cùng? Khi tôi làm điều đó, nó đẩy một loạt các số phức.
DJMcMayhem

5
@DrGreenEggsandIronMan Số phức có thể được sử dụng cho số đó trong MATL. Đơn vị tưởng tượng là viết tắt của phần cuối của mảng và nếu có hai trong ba số thì chúng xác định một phạm vi. Vì vậy, [2, -1+i]khi được sử dụng như một chỉ số có nghĩa là2:end-1
Luis Mendo

7

Người tuyết , 66 byte

}vg","aS:10sB;aM4aRAsOal`,4nD,`aG0AaGal`NdE`AaL1AfL:nA;alaF,nDtSsP

Hãy thử trực tuyến!

Sử dụng thuật toán tương tự như câu trả lời của @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
Ngôn ngữ này có vẻ khủng khiếp. Tôi thích nó.
Mego


5

Thạch , 14 13 12 byte

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

Hãy thử trực tuyến!

Bộ thử nghiệm.

Làm thế nào nó hoạt động

Đó là bản dịch câu trả lời của tôi trong Pyth .


Tôi khá chắc chắn rằng điều này có thể rút ngắn, vì tôi có thể làm nó 15 trong APL.
Adám

@ Adám Vui lòng gửi giải pháp của bạn (để tôi có thể sao chép haha)
Leaky Nun

Tôi muốn cho Marinus một cơ hội ...
Adám


Đủ cơ hội sau hơn 9 tháng, chắc chắn
Luis Mendo


4

Brachylog , 21 byte

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

Hãy thử trực tuyến! hoặc xác minh nhiều trường hợp thử nghiệm

Giải trình

Về cơ bản, đây là thuật toán trả lời Pyth của @ 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

Thủ thuật nhỏ duy nhất là nhân với nghịch đảo của độ dài thay vì chia cho chiều dài, bởi vì phép chia giữa 2 số nguyên là chia số nguyên.


3

Octave , 44 byte

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

Điều này xác định một chức năng ẩn danh.

Đầu vào là một vector ngang.

Hãy thử nó trên ideone .

Giải trình

Vectơ ngang đầu vào được nhân ma trận đầu tiên ( *) bằng một vectơ cột gồm bốn cái (được xây dựng với ~~(1:4)'). Kết quả là một ma trận bốn cột trong đó mỗi hàng là một bản sao của vectơ đầu vào. Điều này sau đó được định hình lại, trong khi duy trì thứ tự tuyến tính của các phần tử, thành một ma trận 4 cột ( reshape(...,[],4)). Hai cột trung tâm được giữ ( (:,2:3)) và tuyến tính hóa thành một cột đơn ( (:)), trong đó giá trị trung bình được tính ( mean(...)).


Bạn có thể tiết kiệm 1 byte với nhiều thứ dễ đọc hơn [x;x;x;x]thay vì~~(1:4)'*x
Tom Carpenter

@(x)mean([x;x;x;x](:)((b=numel(x))+1:3*b))cũng ít hơn 2 byte. Đó là lý do tại sao tôi nghĩ ra, nhưng về cơ bản nó giống như cách tiếp cận của bạn.
Tom Carpenter

@TomCarpenter Tôi không nghĩ nó giống như vậy. Tôi nghĩ bạn nên đăng nó dưới dạng một câu trả lời riêng biệt
Luis Mendo

3

J , 20 18 byte

2 byte nhờ @miles

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

Hãy thử trực tuyến! ( Phiên dịch trực tuyến )

Sử dụng

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

Làm thế nào nó hoạt động

Đó là bản dịch câu trả lời của tôi trong Pyth .



@ Adám Cảm ơn, đã thêm.
Nữ tu bị rò rỉ

2
Bạn chỉ có thể lấy trực tiếp mức trung bình của phần giữa -@#(+/%#)@}.#}.4#]cho 18 byte .
dặm


2

Octave, 42byte

Một chức năng ẩn danh khác cho Octave.

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

Bạn có thể thử nó trực tuyến . Chỉ cần nhập lệnh đó, và sau đó làm ans([1 2 4 5 6 9])hoặc bất kỳ số nào được yêu cầu.

Cái này bắt đầu bằng cách tạo từ mảng đầu vào một với 4 của mỗi phần tử đầu vào bằng cách ghép bốn bản sao theo chiều dọc, sau đó làm phẳng nó theo chiều dọc. Điều này duy trì thứ tự sắp xếp.

Sau đó, trích xuất phạm vi của các phần tử từ độ dài của mảng đầu vào cộng với 1 đến ba lần chiều dài của mảng đầu vào. Bởi vì mảng mới dài hơn bốn lần, điều này sẽ loại bỏ các phần tư trên và dưới.

Cuối cùng, giá trị trung bình của mảng mới được trả về.


2

05AB1E, 15 byte

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

Giải trình

€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

Dùng thử trực tuyến


2

APL (Dyalog) , 15 byte

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

Hãy thử trực tuyến!

4∘/ tăng gấp bốn lần mỗi yếu tố

-∘≢↓ bỏ càng nhiều phần tử theo sau vì có các phần tử trong các đối số

≢↓ bỏ càng nhiều phần tử hàng đầu như có phần tử trong đối số

(... ) áp dụng các chức năng ngầm như sau:

+/ Tổng

÷ chia

 kiểm đếm


1

JavaScript (ES6), 75 byte

a=>a.concat(a,a,a).sort(g=(x,y)=>x-y).slice(l=a.length,-l).reduce(g,0)/l/-2

Sử dụng cách tiếp cận tăng gấp bốn lần và rõ ràng, và tôi có thể sử dụng reduce, điều này thật tuyệt. Thủ thuật duy nhất ở đây là lưu 4 byte bằng cách sử dụng lại bộ so sánh sắp xếp để trừ tất cả các phần tử mảng từ 0, cho tôi số -2llần trả lời tôi muốn.



1

Trên thực tế, 12 byte

4α;l¼≈;±(Htæ

Hãy thử trực tuyến!(hiện tại không hoạt động vì TIO là một vài phiên bản phía sau)

Giải trình:

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

Toán học, 51 byte

Mean@#[[(l=1+Length@#/4);;-l]]&@Sort@Join[#,#,#,#]&

Sắp xếp bốn bản sao của danh sách (để ngăn chặn các vấn đề với độ dài danh sách không phải là bội số của bốn), tham gia "1 quarter the length of resulting list plus 1"vào "1/4 length list + 1 from the end", lấy chúng Mean.


1

Java 146 126 byte

Thật dài dòng java!

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 cũ hơn có thể đọc được một phần với các trường hợp thử nghiệm

/**
 *
 * @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 byte

Chỉnh sửa: Giảm 1 byte bằng cách viết lại phần "didvide by 2 n".

#(let[n(count %)](*(/ n)0.5(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))))

Trước:

#(let[n(count %)](/(apply +(subvec(vec(for[i % j(range 4)]i))n(* 3 n)))(* 2.0 n)))

Sử dụng forđể tạo 4 giá trị lặp lại, sử dụng float 2.0không có kết quả phân số, phần còn lại chỉ là tiêu chuẩn.


1

R, 17 11 byte

mean(n,0.25)

Giả sử nlà vectơ đầu vào ở dạng R tiêu chuẩnn=c(1, 2, 3, ...) .

Điều này không có gì đáng ngạc nhiên vì R có thể được coi là ngôn ngữ của THE THE tính toán thống kê và có nhiều tích hợp thống kê.

CẬP NHẬT. Đã lưu 6 byte nhờ rturnbull vìtrim là đối số tùy chọn đầu tiên theo mặc định!

Các trường hợp thử nghiệm:

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

trimlà đối số thứ hai mặc định, bạn không cần đặt tên cho nó; 0.25có thể rút ngắn thành .25hoặc 1/4. Điều này giúp bạn tiết kiệm sáu byte.
rturnbull

0

Excel, 17 byte

=TRIMMEAN(A:A,.5)

Định dạng đầu vào thư giãn làm cho điều này dễ dàng. Nhập một hàng trên mỗi hàng trong Cột A.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.