Fivenum và một chút


14

(một nghịch lý, một nghịch lý, một nghịch lý khéo léo nhất)

Đây là phần đầu tiên của loạt nhiều phần được lấy cảm hứng từ các hàm R khác nhau.

Nhiệm vụ

Với một tập dữ liệu các số nguyên dương, tôi cần bạn để tính toán tóm tắt 5 số của . Tuy nhiên, tôi đang làm việc trên các bộ dữ liệu lớn, vì vậy tôi cần mã của bạn càng nhỏ càng tốt, cho phép tôi lưu trữ nó trên máy tính của mình.DDD

Tóm tắt năm số bao gồm:

  • Giá trị tối thiểu
  • Phần tư thứ nhất (Q1)
  • Trung bình / phần tư thứ hai (Q2)
  • Phần tư thứ ba (quý 3)
  • Gia trị lơn nhât

Có một số cách khác nhau để xác định các phần tư, nhưng chúng tôi sẽ sử dụng một cách được thực hiện bởi R:

Các định nghĩa:

  • Tối thiểu và tối đa: các giá trị nhỏ nhất và lớn nhất, tương ứng.
  • Trung vị: giá trị trung bình nếu có số lượng mục lẻ và giá trị trung bình số học của hai giá trị trung bình nhất nếu có số lượng mục chẵn. Lưu ý rằng điều này có nghĩa là trung vị có thể là một giá trị không nguyên. Chúng tôi đã phải tính toán trung bình trước đó .DD
  • Phần tư thứ nhất và thứ ba: Chia dữ liệu thành hai nửa, bao gồm phần tử trung tâm trong mỗi nửa nếu có số lượng mục nhập lẻ và tìm giá trị trung bình của mỗi nửa. Trung vị của nửa dưới là Phần tư thứ nhất, và phần trung vị của nửa trên là Phần tư thứ ba.D

Ví dụ:

D= =[1,2,3,4,5] . Trung vị khi đó là , và nửa dưới là , thu được phần tư thứ nhất là , và nửa trên là , thu được phần tư thứ ba là .3[1,2,3]2[3,4,5]4

D=[1,3,3,4,5,6,7,10] . Trung vị là , và nửa dưới là , thu được một phần tư thứ nhất là , và nửa trên là , mang lại một phần tư thứ ba là .4.5[1,3,3,4]3[5,6,7,10]6,5

Quy tắc bổ sung:

  • Đầu vào là một mảng hoặc tương đương gần nhất với ngôn ngữ của bạn.
  • Bạn có thể giả sử mảng được sắp xếp theo thứ tự tăng dần hoặc giảm dần (nhưng vui lòng chỉ định cái nào).
  • Bạn có thể trả lại / in kết quả theo bất kỳ thứ tự nhất quán nào và ở bất kỳ định dạng linh hoạt nào bạn thích, nhưng vui lòng biểu thị thứ tự và định dạng trong câu trả lời của bạn.
  • Các chức năng tích hợp tương đương fivenumđược phép, nhưng vui lòng thực hiện giải pháp của riêng bạn.
  • Bạn không thể cho rằng mỗi năm số sẽ là một số nguyên.
  • Giải thích được khuyến khích.
  • Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng!

Các trường hợp thử nghiệm được tạo ngẫu nhiên

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

Câu trả lời:


6

R , 7 byte

fivenum

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

Rõ ràng trả lời táo tợn. ;-)

Thật thú vị, fivenum(x)không tương đương với summary(x)ngay cả khi xlà số, vì các lượng tử được tính toán khác nhau: fivenumtrung bình tại các điểm không liên tục, trong khi summarynội suy. Bạn có thể buộc summaryphải cư xử như fivenumvới tùy chọn quantile.type, nhưng điều này vẫn dài hơn

R , 51 byte

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

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

trong đó tính toán các lượng tử của thứ tự 0 (tối thiểu), 0,25 (Q1), 0,5 (trung vị), 0,75 (quý 3) và 1 (tối đa). Việc t=2xác định cách xác định số lượng tử: có 9 loại có thể và định nghĩa thách thức tương ứng với loại 2 trong hầu hết các trường hợp và loại 7 khi . Thành thật mà nói, sự lựa chọn định nghĩa về lượng tử này là một chút kỳ lạ.n3(mod4)

Lưu ý rằng mã nguồn của tích fivenumhợp rất khác nhau (và dài hơn nhiều).


Điều duy nhất tôi có thể tìm thấy là quantiletrả về một vectơ được đặt tên, trong khi fivenumkhông được đặt tên. Có lẽ đó là một vấn đề ở hạ lưu của nơi fivenumđược sử dụng?
JAD

@JAD Đóng mã vào unname()sẽ giải quyết điều đó. Có thể có những lý do lịch sử?
Robin Ryder

1
Chức năng của bạn khác với fivenumcác đầu vào có độ dài 3 mod 4, bao gồm hai trong số các trường hợp thử nghiệm.
Nitrodon

@Nitrodon Argh! Cảm ơn đã chú ý! Nó sẽ ổn ngay bây giờ.
Robin Ryder

5

MATL , 18 byte

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

Thứ tự đầu ra đang tăng lên, như trong các trường hợp thử nghiệm.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

MATL, giống như MATLAB, tính toán các lượng tử bằng cách sử dụng phép nội suy tuyến tính nếu cần (giống như được chỉ định trong thử thách cho trung vị). Để đạt được hành vi cần thiết cho các phần tư thứ nhất và thứ ba, nó đủ để lặp lại trung vị nếu độ dài của đầu vào là số lẻ. Khi đó, kết quả chỉ là các lượng tử 0, .25, .5, .75 và 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 byte

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:])]

Điều này giả định rằng danh sách đầu vào được sắp xếp theo thứ tự tăng dần. flà hàm trả về tóm tắt 5 số.

{mTôin,mmộtx,Q1,Q2,Q3}

Tôi đã loại bỏ một vài byte bằng cách lấy một số gợi ý từ câu trả lời của FlipTack để tính toán Median.

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

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

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)

thật tốt khi sử dụng hàm tính toán trung vị; đệ trình đó sẽ không còn bởi Python (3?), mà là "gói thống kê Python +" hoặc tương tự.
Giuseppe

1

Than , 33 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Đầu ra theo thứ tự tăng dần hoặc giảm dần tùy thuộc vào việc đầu vào theo thứ tự tăng dần hay giảm dần. Giải trình:

≔⊖Lθη

Lấy chỉ số của phần tử cuối cùng.

IE

Ánh xạ qua các phần tử của mảng sau và chuyển kết quả thành chuỗi để in ngầm trên các dòng riêng biệt.

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

Tính toán vị trí của các phần tử tứ phân vị, trong đó một phần phụ 0.5biểu thị rằng giá trị là trung bình của hai phần tử liền kề.

⊘⁺§θ⌊ι§θ⌈ι

Tính toán phần tư tại mỗi vị trí bằng cách lấy trung bình của các giá trị tại sàn và trần của vị trí.



1

C (gcc) , 123 121 119 byte

-2 nhờ trần.

Giả sử một danh sách được sắp xếp theo thứ tự tăng dần.

Các đầu ra theo thứ tự: 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]);}

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


1

05AB1E , 18 byte

2F2äнIR})€ÅmIWsà‚«

Thứ tự đầu ra là : [Q1, Q3, Q2, min, max].

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm . (Tôi đã thêm một loại {cho bộ thử nghiệm, vì vậy các trường hợp thử nghiệm dễ xác minh hơn theo thứ tự [min, Q1, Q2, Q3, max].)

Giải trình:

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)
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.