O chamado fenômeno de Will Rogers descreve uma maneira de ajustar as estatísticas aumentando a média em dois (multi) conjuntos quando um elemento é movido entre os dois conjuntos. Como um exemplo simples, considere os dois conjuntos
A = {1, 2, 3}
B = {4, 5, 6}
Seus meios aritméticos são 2
e 5
, respectivamente. Se passarmos 4
para A
:
A = {1, 2, 3, 4}
B = {5, 6}
Agora, as médias são 2.5
e 5.5
, respectivamente, portanto, ambas as médias foram aumentadas através de um simples reagrupamento.
Como outro exemplo, considere
A = {3, 4, 5, 6} --> A = {3, 5, 6}
B = {2, 3, 4, 5} --> B = {2, 3, 4, 4, 5}
Por outro lado, não é possível aumentar as duas médias para os conjuntos
A = {1, 5, 9}
B = {4, 5, 7, 8}
O desafio
Dadas duas listas de números inteiros não negativos, determine se é possível aumentar as duas médias movendo um único número inteiro de uma lista para outra.
A média de uma lista vazia não está definida; portanto, se uma das listas contiver apenas um elemento, esse elemento não poderá ser movido.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
A entrada pode ser obtida em qualquer formato conveniente de sequência ou lista.
Você não deve assumir que os elementos em cada lista são únicos, nem que são classificados. Você pode assumir que ambas as listas contêm pelo menos um elemento.
A saída deve ser verdadeira se ambas as médias puderem ser aumentadas movendo um único número inteiro e, caso contrário, falsificará .
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Casos de teste
Verdade:
[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]
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# 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>
fonte
1
e9
mais, o que elevaria ambas as médias, mas você não pode fazê-lo, movendo um único.Respostas:
Pitão,
29282624 bytesObrigado a @Jakube por me salvar 3 bytes com
.p
eL
.Muito simples, verifica se algum elemento da lista 2 é maior que a média da lista 1 e menor que a média da lista 2 e depois se repete com a lista 1 e a lista 2 alteradas.
Imprime uma lista não vazia
[]
para truthy e falsey.Experimente online aqui .
Suíte de teste.
fonte
Python 3, 74
Toma duas listas como entrada. Verifica se a primeira lista tem um elemento que é maior que a média, mas menor que o da outra. Então, faz o mesmo para as duas entradas trocadas. Ter uma compreensão de lista de duas camadas foi mais curto do que definir uma função separada para tentar as duas ordens (82):
fonte
Haskell,
5857podemos verificar se aumentamos ou diminuímos a média, verificando se o elemento a remover ou incluir é maior ou menor que a média.
podemos verificar isso verificando se a média é menor ou maior que um elemento removendo esse elemento da matriz e verificando se a média da nova matriz é negativa ou positiva, o que, por sua vez, é apenas como verificar se a soma é positiva ou negativa .
verificação que é colocada de forma muito simples
sum.map(-n+)
.fonte
Mathematica,
4947 bytesAvalia como uma função pura que espera entrada no formulário
{list1, list2}
.fonte
APL,
4540 bytesEconomizou 5 bytes graças a Moris Zucca!
Isso cria uma função diádica sem nome que aceita matrizes à esquerda e à direita e retorna 1 ou 0.
Você pode experimentá-lo online .
fonte
R,
6652 bytesComo uma função sem nome, que aceita 2 vetores. Livrei-me de alguns espúrios.
Testes
fonte
SAS / IML, 67
Ele usa operadores de redução de índice para obter a resposta, retornando 0 se nenhum elemento for encontrado que corresponda aos requisitos ou 1 se um for encontrado.
Sem jogar golfe, retornarei aqui o valor real usando a multiplicação de matrizes:
Testes:
(Condensado para facilitar a leitura)
fonte
Python 2.7,
1029896Pega a entrada como matriz das 2 entradas e retorna booleano.
A lógica é -conheça o avg das 2 listas e, em seguida, encontre um elemento que seja menor que o avg de sua própria lista e superior à média da outra lista.
Testá-lo para as entradas fornecidas é demonstrado aqui
fonte
*1.
vez de*1.0
salvar um byte. Como alternativa, se você fizer isso no Python 3, a divisão retornará um float por padrão, portanto você não precisaria dessa multiplicação. (Eu não acho que você teria que alterar o código em que todos possam usar Python 3.)f=
e alterandoin[0,1]for
parain 0,1for
. Já que você está na verdade com 101 bytes, isso o leva a 98.CJam, 28 bytes
Essa é uma função anônima que exibe uma matriz bidimensional da pilha e deixa uma matriz de elementos móveis em troca.
Nos navegadores suportados, é possível verificar todos os casos de teste ao mesmo tempo no intérprete CJam .
Casos de teste
Código
Entrada
Saída
Como funciona
Se A e B são as matrizes e avg (A) ≤ avg (B) , simplesmente verificamos se B ∩ {⌊ avg (A) ⌋ + 1,…, ⌈ avg (B) ⌉-1} está vazio. Qualquer elemento nessa interseção pode ser movido de B para A para aumentar as duas médias.
Isso empurra a matriz de todos os elementos da matriz com uma média mais alta que pode ser movida para aumentar as duas médias. Essa matriz está vazia / falsa se e somente se nenhum elemento puder ser movido para alcançar esse resultado.
fonte
Ruby, 86
Toma como entrada uma matriz contendo as duas matrizes.
Tenta encontrar um item abaixo da média do grupo com a média mais alta que é maior que a média do outro grupo.
Teste: http://ideone.com/444W4U
fonte
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
embora. Eu acho que a ligação recursiva deve ser algo comof[a.rotate,p]
.Matlab, 54
Usando uma função anônima:
Exemplos:
fonte
C #, 104
Chamadas de exemplo:
fonte
C ++ 14, 157 bytes
Como lambda sem nome, retorna pelo último parâmetro
r
. AssumeA
,B
para ser como recipientesvector<int>
ouarray<int,>
.Ungolfed:
Uso:
fonte