Так называемый феномен Уилла Роджерса описывает способ подстройки статистики путем увеличения среднего значения в двух (нескольких) наборах, когда один элемент перемещается между двумя наборами. В качестве простого примера рассмотрим два набора
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 (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Ввод может быть сделан в любой удобной строке или формате списка.
Вы не должны предполагать, что элементы в каждом списке уникальны или что они отсортированы. Вы можете предположить, что оба списка содержат хотя бы один элемент.
Вывод должен быть правдивым, если оба средних значения можно повысить, переместив одно целое число и, в противном случае, в ложь .
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Тестовые случаи
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]
Leaderboards
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# 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>
источник
1
и9
более, что поднимет оба средних, но вы не можете сделать это, сдвинув одно.Ответы:
Pyth,
29282624 байтаСпасибо @Jakube за то, что сэкономили мне 3 байта с помощью
.p
иL
.Очень просто, проверяет, больше ли какие-либо элементы в списке 2, чем среднее из списка 1, и меньше, чем среднее из списка 2, затем повторяется с переключенными списком 1 и списком 2.
Печатает непустой список для правды и
[]
фальси.Попробуйте это онлайн здесь .
Тестирование.
источник
Python 3, 74
Принимает два списка в качестве входных данных. Проверяет, есть ли в первом списке элемент, который больше среднего, но меньше другого. Затем делает то же самое для двух входов поменялись местами. Понимание двухслойного списка было короче, чем определение отдельной функции для проверки двух порядков (82):
источник
Хаскелл,
5857мы можем проверить, увеличиваем или опускаем среднее значение, проверяя, больше или меньше элемент для удаления или включения, чем среднее.
мы можем проверить это, проверив, является ли среднее значение меньшим или большим, чем элемент, удалив этот элемент из массива и проверив, является ли среднее значение нового массива отрицательным или положительным, что, в свою очередь, равнозначно проверке, является ли сумма положительной или отрицательной ,
проверка это ставится очень просто как
sum.map(-n+)
.источник
Mathematica,
4947 байтОценивает чистую функцию, которая ожидает ввода в форме
{list1, list2}
.источник
APL,
4540 байтБлагодаря Moris Zucca сэкономлено 5 байт!
Это создает безымянную двоичную функцию, которая принимает массивы слева и справа и возвращает 1 или 0.
Вы можете попробовать это онлайн .
источник
R,
6652 байтаВ качестве неназванной функции, которая принимает 2 вектора. Избавился от некоторых фальшивых.
тесты
источник
SAS / IML, 67
Для получения ответа он использует операторы сокращения индекса, возвращая 0, если не найдено ни одного элемента, соответствующего требованиям, или 1, если он найден.
Без игры в гольф, здесь я возвращаю фактическое значение, используя умножение матрицы:
тесты:
(Сжатый для удобства чтения)
источник
Python 2.7,
1029896Принимает входные данные как массив из 2 входных данных и возвращает логическое значение.
Логика такова: найдите среднее из 2 списков, затем найдите такой элемент, который меньше среднего своего списка и больше среднего другого списка.
Тестирование его для заданных входов продемонстрировано здесь.
источник
*1.
вместо того,*1.0
чтобы сохранить байт. В качестве альтернативы, если вы сделаете это в Python 3, деление вернет число с плавающей запятой по умолчанию, поэтому вам не понадобится это умножение вообще. (Я не думаю, что вам вообще придется менять свой код, чтобы использовать Python 3.)f=
и изменивin[0,1]for
наin 0,1for
. Поскольку вы на самом деле на 101 байт, это приводит вас к 98.CJam, 28 байт
Это анонимная функция, которая извлекает двумерный массив из стека и оставляет массив подвижных элементов взамен.
В поддерживаемых браузерах вы можете проверить все тестовые случаи одновременно в интерпретаторе CJam .
Контрольные примеры
Код
вход
Выход
Как это работает
Если A и B - массивы и avg (A) ≤ avg (B), мы просто проверяем, не является ли B ∩ {⌊avg (A) ⌋ + 1,…, ⌈avg (B) ⌉-1} не пустым). Любой элемент в этом пересечении может быть перемещен из B в A, чтобы увеличить оба средних.
Это выдвигает массив всех элементов массива с более высоким средним, который можно перемещать для увеличения обоих средних. Этот массив пустой / ложный, если и только если никакие элементы не могут быть перемещены для достижения этого результата.
источник
Руби, 86
Принимает в качестве входных данных массив, содержащий два массива.
Пытается найти элемент среднего значения из группы с более высоким средним значением, превышающим среднее значение в другой группе.
Тест: 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]}
b
хотя. Я думаю, что рекурсивный вызов должен быть примерно такимf[a.rotate,p]
.Матлаб, 54
Использование анонимной функции:
Примеры:
источник
C #, 104
Пример звонков:
источник
C ++ 14, 157 байт
Как и безымянная лямбда, возвращается по последнему параметру
r
. ПредполагаетсяA
,B
что контейнеры, какvector<int>
илиarray<int,>
.Ungolfed:
Использование:
источник