Oldukça rütbe değerleri


23

Görev

X 1 … x n tamsayılarının bir girdi listesi göz önüne alındığında , r 1 … r n ( {1… n} permütasyonu) derecelerinin bir listesini hesaplayın, böylece x r 1  ≤ x r 2  ≤… ≤ x r n . Daha sonra, her x i için , rütbesini, x içindeki tüm değerlerin ritminin aritmetik ortalaması ile değiştirin, x i'ye eşittir . (Yani, ne zaman x cinsinden eşit değerler arasında bir bağ varsa, bunların tümü arasındaki safları adil bir şekilde yeniden dağıtın.) Değiştirilmiş r ' 1 … r' sıra listesini çıkar.n .

(İstatistik meraklıları için: Mann-Whitney U testinde böyle bir gözlem sıralaması kullanılır (ikinci yöntem, 1. adım))

Örnek

Bir giriş listesi göz önüne alındığında [3, -6, 3, 3, 14, 3] , birinci sıra listesi [2, 1, 3, 4, 6, 5] olacaktır, bu da listeyi [-6, 3, 3, 3, 3, 14] . Ardından, giriş listesindeki 3 saniyenin tümü için sıralar (2 + 3 + 4 + 5) ÷ 4 = 3.5 olarak sıralanır . Nihai çıktı [3.5, 1, 3.5, 3.5, 6, 3.5] .

Test durumları

[4, 1, 4] -> [2.5, 1.0, 2.5]
[5, 14, 14, 14, 14, 5, 14] -> [1.5, 5.0, 5.0, 5.0, 5.0, 1.5, 5.0]
[9, 9, -5, -5, 13, -5, 13, 9, 9, 13] -> [5.5, 5.5, 2.0, 2.0, 9.0, 2.0, 9.0, 5.5, 5.5, 9.0]
[13, 16, 2, -5, -5, -5, 13, 16, -5, -5] -> [7.5, 9.5, 6.0, 3.0, 3.0, 3.0, 7.5, 9.5, 3.0, 3.0]

kurallar

Bu , yani bayt cinsinden en kısa kod kazanır.


Yanıtlar:


7

Jöle , 10 8 bayt

ð_'Ṡ‘S‘H

@ Xnor adlı kullanıcının yanıtındakicmp numarayı kullanarak 2 bayt kurtardı .

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

Nasıl çalışır

ð_'Ṡ‘S‘H  Main link. Left argument: A (list of values)

ð         Make the chain dyadic, setting the right argument to A.
 _'       Spawned subtraction; compute the matrix of differences.
   Ṡ      Apply the sign function to each difference.
    ‘     Increment.
     S    Sum across columns.
      ‘   Increment.
       H  Halve.

6

Pyth, 12

m+l<#dQ.OS/Q

Test odası

Her değer için bu, aritmetik ortalamasını hesaplar [1..frequency]ve mevcut değerden daha düşük değerlerin sayısını ekler.

Bu işe yarıyor çünkü her değer için hesaplayacağız:

(1 / frequency) * sum (i = 1..frequency) i + count_less

basitleştirebileceğimiz:

(1 / frequency) * [ frequency * (frequency + 1) / 2 + count_less * frequency ]

ve tekrar:

(frequency + 1) / 2 + count_less

Bununla birlikte, Pyth'ta ilk toplamı hesaplamak, diğer formül yerine, ortalama yerleşimi kullanarak hesaplamaktı.


4

Python 2, 51 bayt

lambda l:[-~sum(1+cmp(y,x)for x in l)/2.for y in l]

Her eleman yiçin cmpifade, her küçük için 2 puan xve her bir eşit için 1 puan verir x. Bu toplam 1 ekleyerek ve yarıya indirerek doğru aralığa yeniden ölçeklenir. 2.Tamsayı bölme önlemek için gereklidir.

Python 3, 52 bayt

Python 3 cmp, bir Boole ifadesi (+2 bayt) gerektiren, ancak yüzer bölme (-1 bayt) gerektiren.

lambda l:[-~sum((y>x)+(y>=x)for x in l)/2for y in l]

3

MATL , 14 bayt

7#utG&S&S2XQw)

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın (kodun biraz değiştirilmiş şekli; her sonuç farklı bir satırda).

      % Implicit input. Example: [5 14 14 14 14 5 14]
7#u   % Replace each value by a unique, integer label. Example: [1; 2; 2; 2; 2; 1; 2]
t     % Duplicate
G&S   % Push input again. Sort and get indices of the sorting. Example: [1 6 2 3 4 5 7]
&S    % Sort and get the indices, again. This gives the ranks. Example: [1 3 4 5 6 2 7]
2XQ   % Compute mean of ranks for equal values of the integer label. Example: [1.5; 5]
w     % Swap top two elements in stack
)     % Index the means with the integer labels. Example: [1.5; 5; 5; 5; 5; 1.5; 5]
      % Implicit display


3

R, 17 12 bayt

STDIN çıkışlarından girişi STDOUT'a alır. Çıktı esnekse, o zaman hendekleri açabiliriz cat().

rank(scan())

Oldukça basit, bir kırıcı için ortalamaya ayarlanan yerleşik rütbe kullanır.

Kullanımda:

> rank(scan())
1: 5 14 14 14 14 5 14
8: 
Read 7 items
[1] 1.5 5.0 5.0 5.0 5.0 1.5 5.0
> rank(scan())
1: 3 -6 3 3 14 3
7: 
Read 6 items
[1] 3.5 1.0 3.5 3.5 6.0 3.5
> 

Bana kalmışsa düşebilirsin cat(). Ne var ki topluluk konsensüsünün ne olduğunu bilmiyorum.
Lynn

@Lynn Teşekkür ederim. Her zaman geri koyabilirim.
MickyT 19

2

J, 18 bayt

1-:@+1+/"1@:+*@-/~

Xnor'ın yöntemini kullanarak Dennis'in çözümüne dayanıyor .

Düzgün bir yaklaşım kullanmak benim için 24 bayt gerektirir .

(i.~~.){](+/%#)/.1+/:@/:

kullanım

   f =: 1-:@+1+/"1@:+*@-/~
   f 3 _6 3 3 14 3
3.5 1 3.5 3.5 6 3.5
   f 4 1 4
2.5 1 2.5
   f 5 14 14 14 14 5 14
1.5 5 5 5 5 1.5 5
   f 9 9 _5 _5 13 _5 13 9 9 13
5.5 5.5 2 2 9 2 9 5.5 5.5 9
   f 13 16 2 _5 _5 _5 13 16 _5 _5
7.5 9.5 6 3 3 3 7.5 9.5 3 3

1

Aslında, 18 bayt

;╗`╝╜"╛-su"£MΣu½`M

Çevrimiçi deneyin!

Bu aslında xnor'ın Python çözümünün bir limanıdır .

Açıklama:

;╗`╝╜"╛-su"£MΣu½`M
;╗                  push a copy of input to reg0
  `             `M  for x in input:
   ╝                  push x to reg1
    ╜                 push input from reg0
     "    "£M         for y in input:
      ╛                 push x from reg0
       -s               cmp(y,x) (sgn(y-x))
         u              add 1
             Σu½      sum, add 1, half

1

APL, 17 karakter

(y+.×⍋X)÷+/y←∘.=⍨X

Listenin saklandığını varsayarak X.

Açıklama:

APL'nin ifadeleri sağdan sola doğru değerlendirdiğini unutmayın. Sonra:

  • ∘.=⍨X= X∘.=XBurada ∘.=kullanılarak dış üründür =diyadik fonksiyonu olarak göstermektedir. (Normalde çarpacağınız yer. Yani matematiksel dış ürün olarak yazılabilir ∘.×.)
  • Elde edilen matris, her rütbe için eşit nesnelerin sayısının bir vektörünü vermek üzere kullanılarak doğrudan katlanır yve ykatlanır +(bunu söyleyelim z←+/y).
  • ⍋X saflarını döndürür X
  • y+.×⍋X matrisimizin y ürününü bu vektörle verir.
  • Sonuç (bileşen bilge) ile bölünür z.


0

JavaScript (ES6), 49 48 bayt

a=>a.map(n=>a.reduce((r,m)=>r+(n>m)+(n>=m),1)/2)

Düzenleme: İfade yeniden biçimlendirilerek 1 bayt kaydedildi, böylece şimdi @ xnor'ın Python 3 cevabı gibi görünüyor.

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.