El llamado fenómeno de Will Rogers describe una forma de ajustar las estadísticas elevando el promedio en dos (múltiples) conjuntos cuando un elemento se mueve entre los dos conjuntos. Como un ejemplo simple, considere los dos conjuntos
A = {1, 2, 3}
B = {4, 5, 6}
Sus medios aritméticos son 2
y 5
, respectivamente. Si movemos el 4
a A
:
A = {1, 2, 3, 4}
B = {5, 6}
Ahora los promedios son 2.5
y 5.5
, respectivamente, por lo que ambos promedios se han elevado mediante una simple reagrupación.
Como otro ejemplo, considere
A = {3, 4, 5, 6} --> A = {3, 5, 6}
B = {2, 3, 4, 5} --> B = {2, 3, 4, 4, 5}
Por otro lado, no es posible aumentar ambos promedios para los conjuntos
A = {1, 5, 9}
B = {4, 5, 7, 8}
El reto
Dadas dos listas de enteros no negativos, determine si es posible aumentar ambos promedios moviendo un solo entero de una lista a la otra.
El promedio de una lista vacía no está definido, por lo que si una de las listas contiene solo un elemento, este elemento no se puede mover.
Puede escribir un programa o función, tomando entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), valor de retorno de función o parámetro de función (out).
La entrada puede tomarse en cualquier cadena conveniente o formato de lista.
No debe suponer que los elementos en cada lista son únicos, ni que están ordenados. Puede suponer que ambas listas contienen al menos un elemento.
El resultado debería ser verdadero si ambos promedios pueden elevarse moviendo un solo entero y falso de lo contrario.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Casos de prueba
Verdad:
[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]
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# 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>
fuente
1
y9
otra vez, lo que elevaría ambos promedios, pero no puede hacerlo moviendo uno solo.Respuestas:
Pyth,
29282624 bytesGracias a @Jakube por guardarme 3 bytes con
.p
yL
.Muy simple, comprueba si alguno de los elementos de la lista 2 es mayor que la media de la lista 1 y menor que la media de la lista 2, luego se repite con la lista 1 y la lista 2 conmutadas.
Imprime una lista no vacía para la verdad y
[]
para falsey.Pruébelo en línea aquí .
Banco de pruebas.
fuente
Pitón 3, 74
Toma dos listas como entrada. Comprueba si la primera lista tiene un elemento que es más grande que el promedio pero más pequeño que el otro. Luego, hace lo mismo para las dos entradas intercambiadas. Tener una comprensión de lista de dos capas fue más corto que definir una función separada para probar las dos órdenes (82):
fuente
Haskell,
5857Podemos verificar si ampliamos o disminuimos el promedio verificando si el elemento a eliminar o incluir es mayor o menor que el promedio.
podemos verificar eso verificando si el promedio es más pequeño o más grande que un elemento eliminando ese elemento de la matriz y verificando si la media de la nueva matriz es negativa o positiva, lo que a su vez es igual a verificar si la suma es positiva o negativa .
la comprobación de que se pone muy simplemente como
sum.map(-n+)
.fuente
Mathematica,
4947 bytesEvalúa una función pura que espera entrada en el formulario
{list1, list2}
.fuente
APL,
4540 bytes¡Guardado 5 bytes gracias a Moris Zucca!
Esto crea una función diádica sin nombre que acepta matrices a la izquierda y a la derecha y devuelve 1 o 0.
Puedes probarlo en línea .
fuente
R,
6652 bytesComo una función sin nombre, que acepta 2 vectores. Se deshizo de algunas cosas espurias.
Pruebas
fuente
SAS / IML, 67
Utiliza operadores de reducción de subíndice para obtener la respuesta, devolviendo 0 si no se encuentra ningún elemento que coincida con los requisitos o 1 si se encuentra uno.
Sin golf, aquí devuelvo el valor real usando la multiplicación de matrices:
Pruebas:
(Condensado para facilitar la lectura)
fuente
Python 2.7,
1029896Toma la entrada como una matriz de las 2 entradas y devuelve boolean.
La lógica es -encontrar el promedio de las 2 listas, luego encontrar un elemento tal que sea menor que el promedio de su propia lista y mayor que el promedio de la otra lista.
Probarlo para las entradas dadas se muestra aquí
fuente
*1.
lugar de*1.0
guardar un byte. Alternativamente, si hace esto en Python 3, la división devolverá un flotante por defecto, por lo que no necesitaría esa multiplicación en absoluto. (No creo que tenga que cambiar su código para usar Python 3.)f=
y cambiandoin[0,1]for
ain 0,1for
. Como en realidad tienes 101 bytes, esto te lleva a 98.CJam, 28 bytes
Esta es una función anónima que saca una matriz bidimensional de la pila y deja una matriz de elementos móviles a cambio.
En los navegadores compatibles, puede verificar todos los casos de prueba a la vez en el intérprete de CJam .
Casos de prueba
Código
Entrada
Salida
Cómo funciona
Si A y B son las matrices y avg (A) ≤ avg (B) simplemente verificamos si B ∩ {⌊avg (A) ⌋ + 1, ..., ⌈avg (B) ⌉-1} no está vacío. Cualquier elemento en esta intersección podría moverse de B a A para aumentar ambos promedios.
Esto empuja la matriz de todos los elementos de la matriz con un promedio más alto que se puede mover para aumentar ambos promedios. Esta matriz está vacía / falsa si y solo si no se pueden mover elementos para lograr este resultado.
fuente
Ruby, 86
Toma como entrada una matriz que contiene las dos matrices.
Trata de encontrar un elemento por debajo del promedio del grupo con el promedio más alto que sea mayor que el promedio del otro grupo.
Prueba: http://ideone.com/444W4U
fuente
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
embargo, obtengo un NameError con respecto a la variable . Creo que la llamada recursiva debería ser algo asíf[a.rotate,p]
.Matlab, 54
Usando una función anónima:
Ejemplos:
fuente
C #, 104
Llamadas de ejemplo:
fuente
C ++ 14, 157 bytes
Como lambda sin nombre, regresa por el último parámetro
r
. AsumeA
,B
ser contenedores comovector<int>
oarray<int,>
.Sin golf:
Uso:
fuente