Tak zwane zjawisko Will Rogers opisuje sposób dostrajania statystyki poprzez podniesienie średniej w dwóch (wielu) zestawach, gdy jeden element jest przenoszony między dwoma zestawami. Jako prosty przykład rozważ dwa zestawy
A = {1, 2, 3}
B = {4, 5, 6}
Ich średnie arytmetyczne są 2
i 5
, odpowiednio. Jeśli przeniesiemy 4
do A
:
A = {1, 2, 3, 4}
B = {5, 6}
Teraz są średnie 2.5
i 5.5
, odpowiednio, więc obie średnie zostały podniesione przez proste przegrupowanie.
Jako kolejny przykład rozważ
A = {3, 4, 5, 6} --> A = {3, 5, 6}
B = {2, 3, 4, 5} --> B = {2, 3, 4, 4, 5}
Z drugiej strony nie jest możliwe podniesienie obu średnich dla zbiorów
A = {1, 5, 9}
B = {4, 5, 7, 8}
Wyzwanie
Biorąc pod uwagę dwie listy nieujemnych liczb całkowitych, określ, czy możliwe jest podniesienie obu średnich, przenosząc jedną liczbę całkowitą z jednej listy na drugą.
Średnia pustej listy nie jest zdefiniowana, więc jeśli jedna z list zawiera tylko jeden element, tego elementu nie można przenieść.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Dane wejściowe mogą być pobierane w dowolnym dogodnym formacie ciągu lub listy.
Nie można zakładać, że elementy na każdej liście są unikalne, ani że są posortowane. Możesz założyć, że obie listy zawierają co najmniej jeden element.
Wyjście powinno być zgodne z prawdą, jeśli obie wartości średnie można podnieść, przesuwając jedną liczbę całkowitą, a fałsz w przeciwnym razie.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
Prawda:
[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]
Liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawisz swój wynik, możesz zachować stare wyniki w nagłówku, przekreślając je. Na przykład:
# 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>
źródło
1
i9
powyżej, które mogłyby podnieść obie średnie, ale nie można zrobić poprzez przeniesienie jednego.Odpowiedzi:
Pyth,
29282624 bajtówDzięki @Jakube za uratowanie mi 3 bajtów za pomocą
.p
iL
.Bardzo proste, sprawdza, czy którykolwiek element na liście 2 jest większy niż średnia z listy 1 i mniej niż średnia z listy 2, a następnie powtarza się z przełączoną listą 1 i listą 2.
Drukuje niepustą listę dla prawdy i
[]
dla falsey.Wypróbuj online tutaj .
Pakiet testowy.
źródło
Python 3, 74
Pobiera dwie listy jako dane wejściowe. Sprawdza, czy pierwsza lista zawiera element większy niż średnia, ale mniejszy niż drugi. Następnie robi to samo dla dwóch zamienionych wejść. Posiadanie dwuwarstwowego zrozumienia listy było krótsze niż zdefiniowanie oddzielnej funkcji do wypróbowania dwóch rzędów (82):
źródło
Haskell,
5857możemy sprawdzić, czy powiększamy lub obniżamy średnią, sprawdzając, czy element do usunięcia lub włączenia jest większy, czy mniejszy niż średnia.
możemy to sprawdzić, sprawdzając, czy średnia jest mniejsza czy większa od elementu, usuwając ten element z tablicy i sprawdzając, czy średnia nowej tablicy jest ujemna czy dodatnia, co z kolei jest tak samo jak sprawdzenie, czy suma jest dodatnia czy ujemna .
sprawdzenie, że jest to bardzo proste jako
sum.map(-n+)
.źródło
Mathematica,
4947 bajtówOcenia czystą funkcję, która oczekuje danych wejściowych w formularzu
{list1, list2}
.źródło
APL,
4540 bajtówZaoszczędź 5 bajtów dzięki Morisowi Zucca!
Tworzy to nienazwaną funkcję dyadyczną, która akceptuje tablice po lewej i prawej stronie i zwraca 1 lub 0.
Możesz spróbować online .
źródło
R,
6652 bajtówJako funkcja bez nazwy, która przyjmuje 2 wektory. Pozbyłem się fałszywych, które.
Testy
źródło
SAS / IML, 67
Używa operatorów redukcji indeksu dolnego, aby uzyskać odpowiedź, zwracając 0, jeśli nie zostanie znaleziony element spełniający wymagania lub 1, jeśli taki zostanie znaleziony.
Bez golfa, tutaj zwracam samą wartość rzeczywistą za pomocą mnożenia macierzy:
Testy:
(Skondensowane dla czytelności)
źródło
Python 2.7,
1029896Pobiera dane wejściowe jako tablicę 2 danych wejściowych i zwraca wartość logiczną.
Logika polega na znalezieniu średniej z 2 list, a następnie znajdź element taki, że jest mniejszy niż średni z własnej listy i większy niż średnia z drugiej listy.
Testowanie pod kątem danych wejściowych jest tutaj pokazane
źródło
*1.
zamiast*1.0
zapisać bajt. Alternatywnie, jeśli zrobisz to w Pythonie 3, dzielenie zwróci domyślnie liczbę zmiennoprzecinkową, więc w ogóle nie potrzebujesz tego mnożenia. (Nie sądzę, abyś musiał w ogóle zmieniać kod, aby korzystać z Pythona 3.)f=
i zmieniającin[0,1]for
nain 0,1for
. Ponieważ faktycznie masz 101 bajtów, obniżasz to do 98.CJam, 28 bajtów
Jest to anonimowa funkcja, która wyrywa dwuwymiarową tablicę ze stosu i pozostawia w zamian tablicę ruchomych elementów.
W obsługiwanych przeglądarkach możesz zweryfikować wszystkie przypadki testowe jednocześnie w interpretera CJam .
Przypadki testowe
Kod
Wkład
Wydajność
Jak to działa
Jeśli A i B są tablicami, a avg (A) ≤ avg (B) , po prostu sprawdzamy, czy B ∩ {⌊avg (A) ⌋ + 1,…, ⌈avg (B) ⌉-1} nie jest puste. Dowolny element na tym skrzyżowaniu można przesunąć z B do A, aby zwiększyć obie średnie.
Spycha to tablicę wszystkich elementów tablicy z wyższą średnią, którą można przesunąć w celu zwiększenia obu średnich. Ta tablica jest pusta / falsy wtedy i tylko wtedy, gdy nie można przenieść żadnych elementów, aby osiągnąć ten wynik.
źródło
Ruby, 86
Pobiera jako dane wejściowe tablicę zawierającą dwie tablice.
Próbuje znaleźć pozycję poniżej średniej z grupy o wyższej średniej, która jest większa niż średnia w innej grupie.
Test: http://ideone.com/444W4U
źródło
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
. Myślę, że połączenie rekurencyjne powinno być coś w rodzajuf[a.rotate,p]
.Matlab, 54
Korzystanie z anonimowej funkcji:
Przykłady:
źródło
C #, 104
Przykładowe połączenia:
źródło
C ++ 14, 157 bajtów
Jako nienazwana lambda, zwraca ostatni parametr
r
. Zakłada sięA
,B
że są to pojemniki takie jakvector<int>
lubarray<int,>
.Nie golfowany:
Stosowanie:
źródło