Fivenum ve biraz


14

(bir paradoks, bir paradoks, en ustaca bir paradoks)

Bu, farklı R işlevlerinden esinlenen çok parçalı bir dizinin ilk bölümüdür.

Görev

Bir veri kümesi Verilen D pozitif tamsayılar, sana hesaplamamız gerekir 5 sayı özetini arasında D . Ancak, ben büyük veri kümeleri üzerinde çalışıyorum, bu yüzden kod bilgisayarımda saklamak için izin, mümkün olduğunca küçük olması gerekir.

Beş sayı özeti aşağıdakilerden oluşur:

  • Minimum değer
  • İlk çeyrek (1. Çeyrek)
  • Medyan / İkinci çeyrek (2. Çeyrek)
  • Üçüncü çeyrek (3. Çeyrek)
  • Maksimum değer

Çeyrekleri tanımlamanın birkaç farklı yolu vardır, ancak R tarafından uygulananı kullanacağız:

Tanımlar:

  • Minimum ve maksimum: sırasıyla en küçük ve en büyük değerler.
  • Medyan: eğer orta değer D ise girişlerinin bir tek sayı ve iki orta-en değerlerinin aritmetik ortalaması olan D girişlerinin hatta sahiptir. Bunun medyanın tamsayı olmayan bir değer olabileceğini unutmayın. Daha önce Medyan'ı Hesaplamak zorunda kaldık .
  • Birinci ve Üçüncü Çeyrekler: D nin tek sayıda girişi varsa, verileri her yarıdaki merkezi eleman dahil olmak üzere iki yarıya bölün ve her yarının ortanca değerini bulun. Alt yarının ortancası Birinci Çeyrek ve üst yarının ortancası Üçüncü Çeyrek'tir.

Örnekler:

D=[1,2,3,4,5] . Medyan daha sonra3 ve alt yarısı[1,2,3] 'dür, ilk çeyrek2 ' yi verir ve üst yarı[3,4,5] , üçüncü çeyreklik4 ü verir.

D=[1,3,3,4,5,6,7,10] . Ortanca4.5 ve alt yarısı[1,3,3,4] , ilk çeyrek3 ve üst yarısı[5,6,7,10] , üçüncü çeyreklik6.5 .

Ek kurallar:

  • Giriş bir dizi veya dilinizin en yakın karşılığıdır.
  • Dizinin artan veya azalan düzende sıralandığını varsayabilirsiniz (ancak lütfen hangisini belirtin).
  • Sonuçları tutarlı bir sırayla ve istediğiniz esnek biçimde döndürebilir / yazdırabilirsiniz , ancak lütfen cevabınızdaki sırayı ve formatı belirtin.
  • Eşdeğer yerleşik işlevlere fivenumizin verilir, ancak lütfen kendi çözümünüzü de uygulayın.
  • Sen olabilir değil bir tamsayı olacaktır beş sayı her varsayalım.
  • Açıklamalar teşvik edilir.
  • Bu , her dilde en kısa cevap kazanır!

Rastgele oluşturulan test senaryoları

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

Yanıtlar:


6

R , 7 bayt

fivenum

Çevrimiçi deneyin!

Açık arsız cevap. ;-)

İlginçtir ki, nicelikler farklı hesaplandığından, sayısal olduğunda bile fivenum(x)eşdeğer değildir : süreksizliklerin ortalaması, enterpolatlar. Seçenek gibi davranmaya zorlayabilirsiniz , ancak bu hala daha uzunsummary(x)xfivenumsummarysummaryfivenumquantile.type

R , 51 bayt

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

Çevrimiçi deneyin!

0 (min), 0.25 (Q1), 0.5 (medyan), 0.75 (Q3) ve 1 (max) miktarlarını hesaplar. t=2Belirtir ne kantilleri tanımlanmaktadır: 9 olası türleri vardır ve meydan tanımı karşılık çoğu durumda 2. Tip ve zaman 7 tip . Dürüst olmak gerekirse, bu kantil tanımının seçimi biraz garip.n3(mod4)

Yerleşikin kaynak kodunun fivenumçok farklı (ve çok daha uzun) olduğunu unutmayın.


Bulabildiğim tek şey , adlandırılmamış quantilebir adı döndürürken adlandırılmamış bir vektör döndürüyor fivenum. Belki de bu fivenum, kullanılan yerin akış aşağısında bir problemdir ?
JAD

@JAD Kodu içine almak unname()sorunu çözecektir. Belki tarihsel nedenler var mı?
Robin Ryder

1
Fonksiyonunuz fivenum, test durumlarından ikisi de dahil olmak üzere 3 mod 4 uzunluk girişleri için farklıdır .
Nitrodon

@Nitrodon Argh! Fark ettiğiniz için teşekkürler! Şimdi iyi olmalı.
Robin Ryder

5

MATL , 18 bayt

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

Test durumlarında olduğu gibi çıktı sırası artıyor.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

MATL, MATLAB gibi, gerektiğinde lineer enterpolasyon kullanarak kantilleri hesaplar (tıpkı medyan için belirtilen zorlukta belirtildiği gibi). Birinci ve üçüncü çeyrekler için gerekli davranışı elde etmek için, girdinin uzunluğu garip ise medyanı tekrarlamak yeterlidir. O zaman sonuçlar sadece 0, .25, .5, .75 ve 1 miktarlardır.

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 bayt

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

Bu, giriş listesinin artan sırada sıralandığını varsayar. f5 sayı özeti döndürme işlevidir.

5 rakamlı özet şu şekildedir:{min,max,Q1,Q2,Q3}

FlipTack'in Medyanı Hesapla cevabından birkaç ipucu alarak birkaç bayt çıkardım.

Çevrimiçi deneyin!

O nasıl çalışır?

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)

medyanı hesaplayan bir fonksiyon kullanmak iyidir; bu gönderi artık Python (3?) tarafından değil, "Python + istatistik paketi" veya benzeri bir yöntemle yapılır.
Giuseppe

1

Kömür , 33 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Girişin artan veya azalan sırada olmasına bağlı olarak çıkışlar artan veya azalan sırada. Açıklama:

≔⊖Lθη

Son öğenin dizinini al.

IE

Aşağıdaki dizinin öğeleri üzerinde eşleyin ve sonucu ayrı satırlarda örtük yazdırma için dizeye yayınlayın.

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

Çeyrek elemanların konumlarını hesaplayın, burada bir ekstra 0.5, değerin iki bitişik elemanın ortalaması olduğunu gösterir.

⊘⁺§θ⌊ι§θ⌈ι

Konumun zemini ve tavanındaki değerlerin ortalamasını alarak her konumdaki dörtte birlik oranı hesaplayın.



1

C (GCC) , 123 121 119 bayt

-2 tavan kedisi sayesinde.

Bir listenin artan sırada sıralandığını varsayar.

Çıkışlar sırayla: min, Q1, Q2, Q3, maks.

#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]);}

Çevrimiçi deneyin!


1

05AB1E , 18 bayt

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

Çıktı-sıradır: [Q1, Q3, Q2, min, max].

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın . ( {Test takımı için bir tür ekledim , bu yüzden test senaryolarının sırayla doğrulanması daha kolay [min, Q1, Q2, Q3, max].)

Açıklama:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.