ปรากฏการณ์ Will Rogers


35

ปรากฏการณ์ Will Rogers ที่เรียกว่าอธิบายวิธีการปรับแต่งสถิติโดยเพิ่มค่าเฉลี่ยในสองชุด (หลาย) เมื่อองค์ประกอบหนึ่งถูกย้ายระหว่างสองชุด เป็นตัวอย่างง่ายๆให้พิจารณาทั้งสองชุด

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

วิธีการทางคณิตศาสตร์ของพวกเขาคือ 2และ5ตามลำดับ หากเราย้าย4ไปที่A:

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

ตอนนี้ค่าเฉลี่ยอยู่2.5และ5.5ตามลำดับดังนั้นค่าเฉลี่ยทั้งสองจึงเพิ่มขึ้นผ่านการจัดกลุ่มใหม่อย่างง่าย

เป็นอีกตัวอย่างหนึ่งที่ต้องพิจารณา

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

ในทางตรงกันข้ามมันเป็นไปไม่ได้ที่จะเพิ่มค่าเฉลี่ยทั้งชุด

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

ความท้าทาย

กำหนดจำนวนเต็มสองรายการที่ไม่ใช่ลบให้พิจารณาว่าเป็นไปได้หรือไม่ที่จะเพิ่มค่าเฉลี่ยทั้งสองโดยการย้ายจำนวนเต็มหนึ่งจากรายการหนึ่งไปอีกรายการหนึ่ง

ไม่มีการกำหนดค่าเฉลี่ยของรายการว่างดังนั้นหากหนึ่งในรายการมีเพียงองค์ประกอบเดียวองค์ประกอบนี้จะไม่สามารถย้ายได้

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

อินพุตอาจถูกใช้ในรูปแบบสตริงหรือรายการที่สะดวก

คุณต้องไม่สมมติว่าองค์ประกอบในแต่ละรายการไม่ซ้ำกันหรือถูกเรียงลำดับ คุณอาจคิดว่าทั้งสองรายการมีองค์ประกอบอย่างน้อยหนึ่งรายการ

ผลลัพธ์ควรเป็นจริงหากค่าเฉลี่ยทั้งสองสามารถเพิ่มได้โดยการย้ายจำนวนเต็มเดียวและเป็นเท็จอย่างอื่น

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบ

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]

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# 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>


ในฐานะนักคณิตศาสตร์และไม่ใช่ coder ฉันไม่สามารถจัดการกับความท้าทายได้ แต่ฉันสนใจในคำถามต่อไปนี้: หากค่าเฉลี่ยทั้งสองสามารถเพิ่มขึ้นได้ด้วยการเปลี่ยนจำนวนคอลเลกชันจำนวน จำกัด (พูดห้า) จากชุดหนึ่งไปอีกชุดหนึ่ง ตามเสมอหรือว่าค่าเฉลี่ยทั้งสองอาจเพิ่มขึ้นด้วยการเลื่อนจำนวนเต็มเพียงหนึ่งตัว ? ดังนั้นจึงแสดงว่าความท้าทายครอบคลุมทุกกรณีอย่างแท้จริง
เทรเวอร์ J ริชาร์ดส์

3
@ TrevorRichards ฉันคิดว่ากรณีทดสอบที่ผิดพลาดครั้งสุดท้ายครอบคลุมเรื่องนี้ คุณสามารถย้าย1และ9มากกว่าซึ่งจะเพิ่มทั้งค่าเฉลี่ย แต่คุณไม่สามารถทำได้โดยการย้ายหนึ่งเดียว
Martin Ender

@TrevorRichards โดยทั่วไปหากชุด A & B มีค่าเฉลี่ย a & b ที่มี <b ค่าเฉลี่ยทั้งสองสามารถเพิ่มขึ้นได้ถ้ามีเซตย่อย C ของ B ซึ่งมีค่าเฉลี่ย c ซึ่ง <c <b ในทางกลับกันหากคุณต้องการให้องค์ประกอบทั้งหมดย้ายจาก B เป็น A เพื่อให้มีค่า <b สมมติฐานของคุณจะเป็นจริง
เล่นแร่แปรธาตุ

คำตอบ:


11

Pyth, 29 28 26 24 ไบต์

ขอขอบคุณที่ @Jakube สำหรับการบันทึกฉัน 3 ไบต์ด้วยและ.pL

ง่ายมากตรวจสอบว่าองค์ประกอบใด ๆ ในรายการ 2 มากกว่าค่าเฉลี่ยของรายการ 1 และน้อยกว่าค่าเฉลี่ยของรายการ 2 จากนั้นทำซ้ำกับรายการ 1 และสลับรายการ 2

Lcsblbff&>YyhT<YyeTeT.pQ

พิมพ์รายการที่ไม่ว่างเปล่าสำหรับความจริงและ[]สำหรับความเท็จ

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

ลองมันออนไลน์ได้ที่นี่

ชุดทดสอบ


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)

ใช้สองรายการเป็นอินพุต ตรวจสอบว่ารายการแรกมีองค์ประกอบที่ใหญ่กว่าค่าเฉลี่ย แต่เล็กกว่าอีกรายการหนึ่ง จากนั้นทำเช่นเดียวกันสำหรับอินพุตทั้งสองที่สลับกัน การมีความเข้าใจรายการสองชั้นสั้นกว่าการกำหนดฟังก์ชั่นแยกต่างหากเพื่อลองคำสั่งสองคำสั่ง (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

เราสามารถตรวจสอบว่าเราขยายหรือลดค่าเฉลี่ยโดยการตรวจสอบว่าองค์ประกอบที่จะลบหรือรวมนั้นใหญ่กว่าหรือเล็กกว่าค่าเฉลี่ย

เราสามารถตรวจสอบได้โดยการตรวจสอบว่าค่าเฉลี่ยมีขนาดเล็กหรือใหญ่กว่าองค์ประกอบโดยการลบองค์ประกอบนั้นออกจากอาร์เรย์และตรวจสอบว่าค่าเฉลี่ยของอาร์เรย์ใหม่นั้นเป็นลบหรือบวกซึ่งจะเป็นการตรวจสอบว่าผลรวมเป็นบวกหรือลบ .

sum.map(-n+)การตรวจสอบว่าจะใส่มากเพียงเป็น


6

Mathematica, 49 47 ไบต์

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

{list1, list2}ประเมินฟังก์ชั่นบริสุทธิ์ที่คาดว่าการป้อนข้อมูลในรูปแบบ


4

APL, 45 40 ไบต์

บันทึก 5 ไบต์ขอบคุณ Moris Zucca!

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

สิ่งนี้จะสร้างฟังก์ชั่น dyadic ที่ไม่มีชื่อซึ่งยอมรับอาร์เรย์ทางซ้ายและขวาและส่งคืน 1 หรือ 0

{
  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
}

คุณสามารถลองออนไลน์ได้


1
คุณสามารถเขียนค่าเฉลี่ยเป็น: (+ / ÷≢)
Moris Zucca

@ MorisZucca ขอบคุณ! แก้ไขเพื่อใช้ข้อเสนอแนะของคุณ
Alex A.

3

R, 66 52 ไบต์

ในฐานะที่เป็นฟังก์ชั่นที่ไม่มีชื่อที่ยอมรับ 2 เวกเตอร์ ได้กำจัดของปลอมบางอย่าง

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

การทดสอบ

> 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;

มันใช้ตัวดำเนินการลดตัวห้อยเพื่อรับคำตอบโดยส่งคืน 0 ถ้าไม่พบองค์ประกอบที่ตรงกับข้อกำหนดหรือ 1 ถ้าพบ

ไม่ใช่กอล์ฟที่นี่ฉันคืนค่าจริงโดยใช้การคูณเมทริกซ์:

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;

แบบทดสอบ:

%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;

(ย่อมาจากการอ่าน)

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

รับอินพุตเป็นอาร์เรย์ของ 2 อินพุตและส่งคืนบูลีน
ตรรกะคือ - หาค่าเฉลี่ยของ 2 รายการจากนั้นหาองค์ประกอบเช่นว่ามันน้อยกว่าค่าเฉลี่ยของรายการของตัวเองและสูงกว่าค่าเฉลี่ยของรายการอื่น

การทดสอบสำหรับอินพุตที่ให้นั้นเป็นตัวอย่างที่นี่


2
คุณสามารถทำได้*1.แทนที่จะ*1.0บันทึกเป็นไบต์ อีกทางเลือกหนึ่งถ้าคุณทำสิ่งนี้ใน Python 3 การหารจะคืนค่าทศนิยมตามค่าเริ่มต้นดังนั้นคุณไม่จำเป็นต้องคูณมันเลย (ฉันไม่คิดว่าคุณจะต้องเปลี่ยนรหัสของคุณเลยเพื่อใช้ Python 3)
mathmandan

@mathmandan บันทึกฉันเป็นไบต์ ขอบคุณ :)
Kamehameha

คุณสามารถทำให้มันเป็นฟังก์ชั่นที่ไม่ระบุชื่อโดยการลบf=และการเปลี่ยนแปลงไปin[0,1]for in 0,1forเนื่องจากคุณอยู่ที่ 101 ไบต์จึงทำให้คุณลดลงเหลือ 98
Kade

@ Vioz- ขอบคุณไม่ได้รู้ว่าฉันจะทำอย่างนั้น :)
Kamehameha

2

CJam, 28 ไบต์

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ปรากฏอาร์เรย์สองมิติจากสแต็กและปล่อยให้อาร์เรย์ขององค์ประกอบที่เคลื่อนย้ายได้กลับมา

ในเบราว์เซอร์ที่สนับสนุนคุณสามารถตรวจสอบกรณีทดสอบทั้งหมดในครั้งเดียวในล่าม CJam

กรณีทดสอบ

รหัส

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

อินพุต

[[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]]

เอาท์พุต

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

มันทำงานอย่างไร

หาก A และ B เป็นอาร์เรย์และavg (A) ≤ avg (B)เราเพียงตรวจสอบว่าB ∩ {⌊avg (A) ⌋ + 1, …, ⌈avg (B) ⌉-1}นั้นไม่ว่างเปล่า องค์ประกอบใด ๆ ในสี่แยกนี้สามารถย้ายจากBถึงAเพื่อเพิ่มค่าเฉลี่ยทั้งสอง

{          }%              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.

สิ่งนี้จะผลักดันอาร์เรย์ขององค์ประกอบทั้งหมดของอาร์เรย์ด้วยค่าเฉลี่ยที่สูงขึ้นซึ่งสามารถเคลื่อนย้ายเพื่อเพิ่มค่าเฉลี่ยทั้งสอง อาร์เรย์นี้ว่างเปล่า / เท็จถ้าหากไม่มีองค์ประกอบใดที่สามารถเคลื่อนย้ายเพื่อให้ได้ผลลัพธ์นี้


1

ทับทิม, 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]}}

ใช้เป็นอินพุตอาร์เรย์ที่มีสองอาร์เรย์

พยายามที่จะหารายการเฉลี่ยย่อยจากกลุ่มที่มีค่าเฉลี่ยที่สูงกว่าที่สูงกว่าค่าเฉลี่ยของกลุ่มอื่น ๆ

ทดสอบ: http://ideone.com/444W4U


เริ่มทำงานกับสิ่งนี้โดยไม่สังเกตเห็นว่ามีวิธีแก้ปัญหาทับทิมอยู่แล้วและจบลงด้วยสิ่งที่คล้ายกันมาก แต่มันช่วยให้ตัวละครน้อยลงสองตัวโดยให้ฟังก์ชั่นถือว่ารายการแรกดีกว่า 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 วิธีการที่ดี! ฉันได้รับ NameError เกี่ยวกับตัวแปรbแม้ว่า ฉันคิดว่าการโทรซ้ำควรเป็นเช่นf[a.rotate,p]นั้น
Cristian Lupascu

1
โอ๊ะนั่นคือวิธีที่ฉันได้คะแนนที่ดีขึ้นโดยการโกง
ประวัติศาสตร์ 24

1

Matlab, 54

ใช้ฟังก์ชั่นที่ไม่ระบุชื่อ:

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 = 
    @(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);}

ตัวอย่างการโทร:

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 ไบต์

rในฐานะที่เป็นชื่อแลมบ์ดากลับโดยพารามิเตอร์ที่ผ่านมา ถือว่าA, Bจะเป็นภาชนะที่เหมือนหรือvector<int>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);
}
;

การใช้งาน:

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.