Will Rogers Olayı


35

Will Rogers denilen fenomen , bir eleman iki küme arasında hareket ettiğinde ortalamayı iki (çoklu) kümede ortalamayı yükselterek istatistikleri ayarlamanın bir yolunu açıklar. Basit bir örnek olarak, iki grubu göz önünde bulundurun

A = {1, 2, 3}
B = {4, 5, 6}

Aritmetik ortalamaları sırasıyla 2ve 5. Biz taşırsanız 4için A:

A = {1, 2, 3, 4}
B = {5, 6}

Şimdi ortalamalardır 2.5ve 5.5her iki ortalamalar basit regrouping aracılığıyla gündeme gelmiş, böylece sırasıyla.

Başka bir örnek olarak, düşünün

A = {3, 4, 5, 6} --> A = {3, 5, 6}
B = {2, 3, 4, 5} --> B = {2, 3, 4, 4, 5}

Öte yandan, setler için her iki ortalaması da yükseltmek mümkün değil

A = {1, 5, 9}
B = {4, 5, 7, 8}

Meydan okuma

Negatif olmayan tamsayılardan oluşan iki liste göz önüne alındığında, tek bir tamsayı bir listeden diğerine taşıyarak her iki ortalamayı da yükseltmenin mümkün olup olmadığını belirleyin.

Boş bir listenin ortalaması tanımlanmaz, bu nedenle listelerden biri yalnızca bir öğe içeriyorsa, bu öğe taşınamaz.

STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı yoluyla giriş alarak ve sonucu STDOUT (veya en yakın alternatif), fonksiyon dönüş değeri veya function (out) parametresi ile çıktı alarak bir program veya işlev yazabilirsiniz.

Giriş herhangi bir uygun dize veya liste biçiminde alınabilir.

Her listedeki öğelerin benzersiz olduğunu veya sıralanmadıklarını varsaymamalısınız. Her iki listenin de en az bir öğe içerdiğini varsayabilirsiniz.

Çıkış olmalıdır truthy iki ortalama tek bir tamsayı hareket ve yükseltilebilir eğer falsy aksi.

Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.

Test Kılıfları

Truthy:

[1], [2, 3]
[1, 2, 3], [4, 5, 6]
[3, 4, 5, 6], [2, 3, 4, 5]
[6, 5, 9, 5, 6, 0], [6, 2, 0, 9, 5, 2]
[0, 4], [9, 1, 0, 2, 8, 0, 5, 5, 4, 9]

Falsy:

[1], [2]
[2, 4], [5]
[1, 5], [2, 3, 4, 5]
[2, 1, 2, 3, 1, 3], [5, 1, 6]
[4, 4, 5, 2, 4, 0], [9, 2, 10, 1, 9, 0]

Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı yükseltirseniz, başlıkları üstüne vurarak eski skorları başlıkta tutabilirsiniz. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes

<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 53913</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>


Bir matematikçi olarak ve kodlayıcı değil, mücadeleye gerçekten değinemiyorum, ancak şu soruya ilgi duyuyorum: Eğer her iki ortalama da bir sonlu tamsayı koleksiyonunu bir setten diğerine kaydırarak yükseltilebilirse (beş) , her zaman ortalamaların sadece bir tam sayı kaydırılarak yükseltilebileceğini mi takip ediyor ? Bu nedenle, meydan okumanın gerçekten tüm vakaları kapsadığını gösteren
Trevor J Richards

3
@TrevorRichards Son sahtecilik sınavının olayı olduğunu düşünüyorum. Bir hareket olabilir 1ve 9üzerinde, her iki ortalamalarını yükseltmek hangi ama tek bir tane hareket ettirerek böylece yapamaz.
Martin Ender

@TrevorRichards Genel olarak, eğer A & B kümeleri A <b ile ortalamaları a & b'ye sahipse, ortalama C değeri olan bir C alt kümesi varsa, her iki ortalama da yükseltilebilir. Öte yandan, B'den A'ya tüm elemanların <b değerlerine sahip olmasını isterseniz, hipoteziniz doğru olacaktır.
Simyacı

Yanıtlar:


11

Pyth, 29 28 26 24 bayt

@Jakube'a 3 bayt .pve ile kaydettiğim için teşekkürler L.

Çok basit, 2. listedeki herhangi bir öğenin 1. listenin ortalamasından daha büyük ve 2. listenin ortalamasının altında olup olmadığını kontrol eder, ardından 1. liste ve 2. liste değiştirilir.

Lcsblbff&>YyhT<YyeTeT.pQ

Gerçeği ve falsey için boş olmayan bir liste yazdırır [].

L                    Define y(b). Pyth has no builtin for mean
 c                   Float div
  sb                 Sum of b
  lb                 Length of b
f        .pQ         Filter all permutations of input
 f     eT            Filter the last element of the filter var
  &                  Logical and
   >Y                Inner filter var greater than
    y                Call the mean function we defined earlier
     hT              First element of outer filter var
   <Y                Inner filter var less than
    y                Mean of
     eT              Last element of outer filternvar

Burada çevrimiçi deneyin .

Test odası.


7

Python 3, 74

lambda*L:any(sum(C)/len(C)>x>sum(D)/len(D)for(C,D)in[L,L[::-1]]for x in C)

Giriş olarak iki liste alır. İlk listenin ortalamasından büyük, diğerininkinden küçük bir öğeye sahip olup olmadığını kontrol eder. Ardından, değiştirilen iki giriş için aynı şeyi yapar. İki katmanlı bir liste kavrayışına sahip olmak, iki emri denemek için ayrı bir işlev tanımlamaktan daha kısaydı (82):

f=lambda A,B:any(sum(A)/len(A)>x>sum(B)/len(B)for x in A)
lambda A,B:f(A,B)|f(B,A)

7

Haskell, 58 57

x%y=any(\n->(\g->g x<0&&g y>0)$sum.map(n-))x
x?y=x%y||y%x

Kaldırılacak veya eklenecek öğenin ortalamadan daha büyük veya daha küçük olup olmadığını kontrol ederek ortalamayı büyütüp büyütmediğimizi kontrol edebiliriz.

bu öğeyi diziden kaldırarak ortalamanın bir öğeden daha küçük veya büyük olup olmadığını kontrol ederek ve yeni dizinin ortalamasının negatif mi yoksa pozitif mi olduğunu kontrol ederek kontrol edebiliriz; .

Bunu kontrol etmek çok basit bir şekilde konur sum.map(-n+).


6

Mathematica, 49 47 bayt

m=Mean;MemberQ[#2,x_/;m@#<x<m@#2]&@@#~SortBy~m&

Formdaki girişi bekleyen saf bir fonksiyonla değerlendirir {list1, list2}.


4

APL, 45 40 bayt

Moris Zucca sayesinde 5 bayt kurtarıldı!

{U←∊⍺⍵[⊃⍒M←(+/÷≢)¨⍺⍵]⋄1∊(U<⌈/M)∧(U>⌊/M)}

Bu, sol ve sağdaki dizileri kabul eden ve 1 veya 0 döndüren adsız bir dyadic işlevi oluşturur.

{
  M←(+/÷≢)¨⍺⍵          ⍝ Compute the mean of each array
  U←∊⍺⍵[⊃⍒M]           ⍝ Get the array with the larger mean
  1∊(U<⌈/M)∧(U>⌊/M)    ⍝ Any smaller mean < U < larger mean
}

Şunları yapabilirsiniz çevrimiçi denemek .


1
Ortalamayı şu şekilde yazabilirsiniz: (+ / ÷ ≢)
Moris Zucca

@MorisZucca Teşekkürler! Önerinizi kullanmak için düzenlendi.
Alex A.

3

R, 66 52 Bayt

Adsız bir işlev olarak, 2 vektör kabul eder. Bazı sahte olanlardan kurtuldum.

function(a,b)any(a<(m=mean)(a)&a>m(b),b<m(b)&b>m(a))

Testler

> f=
+ function(a,b)any(a<(m=mean)(a)&a>m(b),b<m(b)&b>m(a))
> f(c(1), c(2, 3))
[1] TRUE
> f(c(1, 2, 3), c(4, 5, 6))
[1] TRUE
> f(c(3, 4, 5, 6), c(2, 3, 4, 5))
[1] TRUE
> f(c(6, 5, 9, 5, 6, 0), c(6, 2, 0, 9, 5, 2))
[1] TRUE
> f(c(0, 4), c(9, 1, 0, 2, 8, 0, 5, 5, 4, 9))
[1] TRUE
> 
> f(c(1), c(2))
[1] FALSE
> f(c(2, 4), c(5))
[1] FALSE
> f(c(1, 5), c(2, 3, 4, 5))
[1] FALSE
> f(c(2, 1, 2, 3, 1, 3), c(5, 1, 6))
[1] FALSE
> f(c(4, 4, 5, 2, 4, 0), c(9, 2, 10, 1, 9, 0))
[1] FALSE
> 

3

SAS / IML, 67

start m(a,b);return((a>b[:]&&a<a[:])||(b>a[:]&&b<b[:]))[<>];finish;

Cevap almak için abonelik azaltma işleçlerini kullanır, gereksinimleri karşılayan hiçbir öğe bulunmazsa 0, varsa bulunursa 1 döndürür.

Golf oynamayanlar, burada matris çarpımını kullanarak gerçek değeri geri döndürüyorum:

proc iml;
  b={1 2 3 4 5 6 7 8 9 };
  a={2 3 4 5 6};
  start m(a,b);
  return (a#(a>b[:] && a < a[:]) || b#(b>a[:] && b < b[:]))[<>];
  finish;

  z= m(a,b);
  print z;
quit;

Testler:

%macro test(a,b,n);
  z&n=m({&a},{&b});
  print z&n;
%mend test;

proc iml;
  b={1 2 3 4 5 };
  a={2 3 4 5 6 7};
start m(a,b);return((a>b[:]&&a<a[:])||(b>a[:]&&b<b[:]))[<>];finish;

* True;
 %test(1,2 3,1);
 %test(1 2 3,4 5 6,2);
 %test(3 4 5 6, 2 3 4 5,3);
 %test(6 5 9 5 6 0,6 2 0 9 5 2,4);
 %test(0 4, 9 1 0 2 8 0 5 5 4 9,5);
* False;
 %test(1,2,6);
 %test(2 4, 5,7);
 %test(1 5, 2 3 4 5,8);
 %test(2 1 2 3 1 3, 5 1 6,9);
 %test(4 4 5 2 4 0, 9 2 10 1 9 0,10);

quit;

(Okunabilirlik için yoğunlaştırılmış)

z1 1

z2 1

z3 1

z4 1

z5 1

z6 0

z7 0

z8 0

z9 0

z10 0


2

Python 2.7, 102 98 96

lambda p:any([1for i in 0,1for e in p[i]if g[i^1]<e<g[i]]for g in[[sum(l)*1./len(l)for l in p]])

Girişi 2 girişin dizisi olarak alır ve boolean döndürür.
Mantık, 2 listenin ortalama değerinde, daha sonra kendi listesinin ortalama değerinden daha az ve diğer listenin ortalamasından daha büyük bir öğe bulun.

Verilen girişler için test edilmesi burada gösterilmektedir.


2
Bir bayt kaydetmek *1.yerine bunu yapabilirsiniz *1.0. Alternatif olarak, bunu Python 3'te yaparsanız, bölme varsayılan olarak bir şamandıra döndürür, bu nedenle bu çarpma işlemine hiç gerek duymazsınız. (Python 3'ü kullanmak için kodunuzu değiştirmek zorunda kalacağınızı sanmıyorum.)
mathmandan

@ mathmandan Bana bir bayt kaydetti. Thanks :)
Kamehameha

Sen kaldırarak bunu isimsiz işlev yapabilir f=ve değişim in[0,1]foriçin in 0,1for. Aslında 101 bayttan beri, bu sizi 98'e düşürür.
Kade

@ Vioz- Teşekkürler, bunu yapabileceğimi bilmiyordum :)
Kamehameha

2

CJam, 28 bayt

{{_:+1$,d/\+}%$~(m],@0=i)>&}

Bu, yığından iki boyutlu bir dizi açan ve karşılığında bir dizi hareketli eleman bırakan isimsiz bir fonksiyondur.

Desteklenen tarayıcılarda, tüm test durumlarını bir kerede CJam tercümanında doğrulayabilirsiniz .

Test durumları

kod

q~]{{_:+1$,d/\+}%$~(m],@0=i)>&}%:p

Giriş

[[1] [2 3]]
[[1 2 3] [4 5 6]]
[[3 4 5 6] [2 3 4 5]]
[[6 5 9 5 6 0] [6 2 0 9 5 2]]
[[0 4] [9 1 0 2 8 0 5 5 4 9]]
[[1] [2]]
[[2 4] [5]]
[[1 5] [2 3 4 5]]
[[2 1 2 3 1 3] [5 1 6]]
[[4 4 5 2 4 0] [9 2 10 1 9 0]]

Çıktı

[2]
[4]
[4]
[5]
[4]
""
""
""
""
""

Nasıl çalışır

A ve B diziler ve avg (A) ≤ avg (B) ise, basitçe B ∩ {⌊avg (A) ⌋ + 1,…, ⌈avg (B) ⌉-1} ' in boş olmadığını kontrol ederiz . Bu kesişme herhangi bir elemanı hareket olabilir B için A hem ortalamalar geliştirmek için.

{          }%              e# For each of the arrays:
 _:+                       e#   Compute the sum of its elements.
    1$,                    e#   Compute its length.
       d/                  e#   Cast to Double and perform division.
         \+                e#   Prepend the computed average to the array.
             $             e# Sort the arrays (by the averages).
              ~            e# Dump both arrays on the stack.
               (           e# Shift out the higher average.
                m]         e# Round up to the nearest integer b.
                  ,        e# Push [0 ... b-1].
                   @0=     e# Replace the array with lower average by its average.
                      i)   e# Round down to the nearest integer a and add 1.
                        >  e# Skip the first a integer of the range.
                           e# This pushes [a+1 ... b-1].
                         & e# Intersect the result with the remaining array.

Bu, her iki ortalamayı da artırmak için hareket ettirilebilecek daha yüksek ortalamaya sahip dizinin tüm öğelerinin dizisini iter. Bu dizi, ancak bu sonucu elde etmek için hiçbir öğenin taşınamadığı durumlarda boş / sahtedir.


1

Ruby, 86

A=->x{x.reduce(0.0,:+)/x.size}
F=->q{b,a=q.sort_by{|x|A[x]};a.any?{|x|x<A[a]&&x>A[b]}}

Giriş olarak iki diziyi içeren bir dizi alır.

Diğer grubun ortalamasından daha yüksek olan ortalamanın üzerinde bir alt ortalama madde bulmaya çalışır.

Test: http://ideone.com/444W4U


Bunun üzerinde çalışmaya başlamadan önce zaten bir Ruby çözümü vardı, çok benzer bir şeyle sonuçlandı, ancak fonksiyonun ilk listenin 'daha iyi' olduğunu varsaymasını sağlayarak daha az iki karaktere sahip oldu, sonra kendini başka bir yolla çağır. f=->a,s=1{i,j=a.map{|x|x.inject(0.0,:+)/x.size};a[0].any?{|y|i>y&&j<y}||s&&f[b,a,p]}
histocrat

@ histokrat Güzel yaklaşım! Değişkenle ilgili olarak bir NameError alıyorum b. Özyinelemeli çağrı gibi bir şey olması gerektiğini düşünüyorum f[a.rotate,p].
Cristian Lupascu

1
Hata! Demek hile yaparak daha iyi bir skor elde ettim.
histokrat

1

Matlab, 54

İsimsiz bir işlev kullanma:

f=@(A,B)any([B>mean(A)&B<mean(B) A>mean(B)&A<mean(A)])

Örnekler:

>> f=@(A,B)any([B>mean(A)&B<mean(B) A>mean(B)&A<mean(A)])
f = 
    @(A,B)any([B>mean(A)&B<mean(B),A>mean(B)&A<mean(A)])

>> f([1 2 3],[4 5 6])
ans =
     1

>> f([3 4 5 6],[2 3 4 5])
ans =
     1

>> f([1 5 9],[4 5 7 8])
ans =
     0

1

C #, 104

bool f(int[]a,int[]b){double i=a.Average(),j=b.Average();return a.Any(x=>x<i&&x>j)||b.Any(x=>x<j&&x>i);}

Örnek Aramalar:

f(new []{1,2,3}, new []{4,5,6})
f(new []{1}, new []{2, 3})
f(new []{1, 2, 3}, new []{4, 5, 6})
f(new []{3, 4, 5, 6}, new []{2, 3, 4, 5})
f(new []{6, 5, 9, 5, 6, 0}, new []{6, 2, 0, 9, 5, 2})
f(new []{0, 4}, new []{9, 1, 0, 2, 8, 0, 5, 5, 4, 9})

f(new []{1}, new []{2})
f(new []{2, 4}, new []{5})
f(new []{1, 5}, new []{2, 3, 4, 5})
f(new []{2, 1, 2, 3, 1, 3}, new []{5, 1, 6})
f(new []{4, 4, 5, 2, 4, 0}, new []{9, 2, 10, 1, 9, 0})

0

C ++ 14, 157 bayt

Adsız lambda olarak, son parametreye göre döner r. Varsayılmıştır A, Bbenzeri kaplar olarak vector<int>ya da array<int,>.

[](auto A,auto B,int&r){auto m=[](auto C){auto s=0.;for(auto x:C)s+=x;return s/C.size();};r=0;for(auto x:A)r+=x<m(A)&&x>m(B);for(auto x:B)r+=x<m(B)&&x>m(A);}

Ungolfed:

auto f=
[](auto A,auto B,int&r){
  auto m=[](auto C){
   auto s=0.;
   for(auto x:C) s+=x;
   return s/C.size();
  };
  r=0;
  for (auto x:A) r+=x<m(A)&&x>m(B);
  for (auto x:B) r+=x<m(B)&&x>m(A);
}
;

Kullanımı:

int main() {
  std::vector<int>
    a={1,2,3}, b={4,5,6};
  //  a={1,5,9}, b={4,5,7,8};
  int r;
  f(a,b,r);
  std::cout << r << std::endl;
}
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.