Das sogenannte Will Rogers-Phänomen beschreibt eine Möglichkeit, die Statistik zu optimieren, indem der Durchschnitt in zwei (Mehrfach-) Sätzen erhöht wird, wenn ein Element zwischen den beiden Sätzen verschoben wird. Betrachten Sie als einfaches Beispiel die beiden Mengen
A = {1, 2, 3}
B = {4, 5, 6}
Deren arithmetische Mittel sind 2
und 5
jeweils. Wenn wir den 4
zu bewegen A
:
A = {1, 2, 3, 4}
B = {5, 6}
Nun sind die Mittelwerte sind 2.5
und 5.5
jeweils so haben beide Mittelwerte durch eine einfache Umgruppierung angehoben.
Als weiteres Beispiel betrachten
A = {3, 4, 5, 6} --> A = {3, 5, 6}
B = {2, 3, 4, 5} --> B = {2, 3, 4, 4, 5}
Andererseits ist es nicht möglich, beide Mittelwerte für die Sätze zu erhöhen
A = {1, 5, 9}
B = {4, 5, 7, 8}
Die Herausforderung
Bestimmen Sie anhand von zwei Listen nicht negativer Ganzzahlen, ob es möglich ist, beide Durchschnitte zu erhöhen, indem Sie eine einzelne Ganzzahl von einer Liste zur anderen verschieben.
Der Durchschnitt einer leeren Liste ist nicht definiert. Wenn also eine der Listen nur ein Element enthält, kann dieses Element nicht verschoben werden.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Die Eingabe kann in einem beliebigen geeigneten Zeichenfolge- oder Listenformat erfolgen.
Sie dürfen nicht davon ausgehen, dass die Elemente in jeder Liste eindeutig oder sortiert sind. Sie können davon ausgehen, dass beide Listen mindestens ein Element enthalten.
Die Ausgabe sollte wahr sein, wenn beide Mittelwerte durch Verschieben einer einzelnen Ganzzahl erhöht werden können, andernfalls ist sie falsch .
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Testfälle
Wahrheit:
[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]
Falsch:
[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]
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihre Punktzahl verbessern, können Sie alte Punkte in der Überschrift behalten, indem Sie sie durchstreichen. Zum Beispiel:
# 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>
quelle
1
und9
mehr bewegen , was beide Durchschnitte erhöhen würde, aber Sie können dies nicht tun, indem Sie einen einzelnen bewegen.Antworten:
Pyth,
29282624 BytesVielen Dank an @Jakube für das Speichern von 3 Bytes mit
.p
undL
.Ganz einfach: Prüft, ob Elemente in Liste 2 größer als der Mittelwert von Liste 1 und kleiner als der Mittelwert von Liste 2 sind, und wiederholt dies, wobei Liste 1 und Liste 2 vertauscht sind.
Druckt eine nicht-leere Liste für truthy und
[]
für Falsey.Probieren Sie es hier online aus .
Test Suite.
quelle
Python 3, 74
Nimmt zwei Listen als Eingabe. Prüft, ob die erste Liste ein Element enthält, das größer als der Durchschnitt, aber kleiner als das andere ist. Dann gilt das gleiche für die beiden getauschten Eingänge. Ein zweischichtiges Listenverständnis war kürzer als die Definition einer separaten Funktion, um die beiden Befehle auszuprobieren (82):
quelle
Haskell,
5857Wir können überprüfen, ob wir den Durchschnitt vergrößern oder verkleinern, indem wir überprüfen, ob das zu entfernende oder einzuschließende Element größer oder kleiner als der Durchschnitt ist.
Wir können dies überprüfen, indem wir prüfen, ob der Durchschnitt kleiner oder größer als ein Element ist, indem wir dieses Element aus dem Array entfernen und prüfen, ob der Durchschnitt des neuen Arrays negativ oder positiv ist. Dies ist wiederum eine Überprüfung, ob die Summe positiv oder negativ ist .
Überprüfung, die sehr einfach als ausgedrückt wird
sum.map(-n+)
.quelle
Mathematica,
4947 BytesWird zu einer reinen Funktion ausgewertet, die Eingaben im Formular erwartet
{list1, list2}
.quelle
APL,
45 bis40 Bytes5 Bytes gespart dank Moris Zucca!
Dadurch wird eine unbenannte dyadische Funktion erstellt, die Arrays links und rechts akzeptiert und 1 oder 0 zurückgibt.
Sie können es online ausprobieren .
quelle
R,
6652 BytesAls unbenannte Funktion werden 2 Vektoren akzeptiert. Ich habe ein paar falsche Sachen beseitigt.
Tests
quelle
SAS / IML, 67
Es verwendet Operatoren zur Indexreduktion, um die Antwort zu erhalten. Sie geben 0 zurück, wenn kein Element gefunden wird, das den Anforderungen entspricht, oder 1, wenn eines gefunden wird.
Nicht golfen, hier gebe ich den tatsächlichen Wert selbst mit Matrixmultiplikation zurück:
Tests:
(Aus Gründen der Lesbarkeit gekürzt)
quelle
Python 2.7,
1029896Nimmt die Eingabe als Array der 2 Eingaben und gibt einen Booleschen Wert zurück.
Die Logik lautet: -finde den Durchschnitt der 2 Listen und finde dann ein Element so, dass es kleiner als der Durchschnitt der eigenen Liste und größer als der Durchschnitt der anderen Liste ist.
Das Testen für die angegebenen Eingaben wird hier demonstriert
quelle
*1.
stattdessen*1.0
ein Byte speichern. Wenn Sie dies in Python 3 tun, gibt die Division standardmäßig einen Gleitkommawert zurück, sodass Sie diese Multiplikation überhaupt nicht benötigen. (Ich glaube nicht, dass Sie Ihren Code ändern müssen, um Python 3 zu verwenden.)f=
und Änderungin[0,1]for
zuin 0,1for
. Da Sie tatsächlich bei 101 Bytes sind, werden Sie auf 98 reduziert.CJam, 28 Bytes
Dies ist eine anonyme Funktion, die ein zweidimensionales Array aus dem Stapel entfernt und im Gegenzug ein Array beweglicher Elemente zurücklässt.
In unterstützten Browsern können Sie alle Testfälle gleichzeitig im CJam-Interpreter überprüfen .
Testfälle
Code
Eingang
Ausgabe
Wie es funktioniert
Wenn A und B die Arrays sind und avg (A) ≤ avg (B) , prüfen wir einfach, ob B ∩ {⌊avg (A) ⌋ + 1,…, ⌈avg (B) ⌉-1} nicht leer ist. Jedes Element in diesem Schnittpunkt kann von B nach A verschoben werden , um beide Mittelwerte zu erhöhen.
Dies verschiebt das Array aller Elemente des Arrays mit dem höheren Durchschnitt, der verschoben werden kann, um beide Durchschnitte zu erhöhen. Dieses Array ist nur dann leer / falsch, wenn keine Elemente verschoben werden können, um dieses Ergebnis zu erzielen.
quelle
Rubin, 86
Nimmt als Eingabe ein Array, das die beiden Arrays enthält.
Versucht, ein unterdurchschnittliches Element aus der Gruppe mit dem höheren Durchschnitt zu finden, der größer als der Durchschnitt der anderen Gruppe ist.
Test: http://ideone.com/444W4U
quelle
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]}
b
. Ich denke, der rekursive Aufruf sollte so etwas wie seinf[a.rotate,p]
.Matlab, 54
Verwenden einer anonymen Funktion:
Beispiele:
quelle
C #, 104
Beispielaufrufe:
quelle
C ++ 14, 157 Bytes
Gibt als unbenanntes Lambda den letzten Parameter zurück
r
. AnnimmtA
,B
werden Behälter wievector<int>
oderarray<int,>
.Ungolfed:
Verwendung:
quelle