Le phénomène dit de Will Rogers décrit un moyen d'ajuster les statistiques en augmentant la moyenne en deux (multi) ensembles lorsqu'un élément est déplacé entre les deux ensembles. Comme exemple simple, considérons les deux ensembles
A = {1, 2, 3}
B = {4, 5, 6}
Leurs moyennes arithmétiques sont 2
et 5
, respectivement. Si nous passons le 4
à A
:
A = {1, 2, 3, 4}
B = {5, 6}
Maintenant, les moyennes sont 2.5
et 5.5
, respectivement, donc les deux moyennes ont été relevées par un simple regroupement.
Comme autre exemple, considérons
A = {3, 4, 5, 6} --> A = {3, 5, 6}
B = {2, 3, 4, 5} --> B = {2, 3, 4, 4, 5}
Par contre, il n’est pas possible de relever les deux moyennes pour les ensembles
A = {1, 5, 9}
B = {4, 5, 7, 8}
Le défi
À partir de deux listes d’entiers non négatifs, déterminez s’il est possible d’élever les deux moyennes en déplaçant un seul entier d’une liste à l’autre.
La moyenne d'une liste vide n'est pas définie. Par conséquent, si l'une des listes ne contient qu'un seul élément, cet élément ne peut pas être déplacé.
Vous pouvez écrire un programme ou une fonction en prenant l’entrée via STDIN (ou l’alternative la plus proche), un argument de ligne de commande ou une argumentation de fonction et en générant le résultat via STDOUT (ou l’alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).
La saisie peut être effectuée dans n’importe quelle chaîne ou format de liste.
Vous ne devez pas supposer que les éléments de chaque liste sont uniques, ni qu'ils sont triés. Vous pouvez supposer que les deux listes contiennent au moins un élément.
La sortie devrait être véridique si les deux moyennes peuvent être relevées en déplaçant un seul entier et une fausseté autrement.
C'est le code de golf, donc la réponse la plus courte (en octets) gagne.
Cas de test
Vérité
[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]
Fausseté:
[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]
Classements
Voici un extrait de pile permettant de générer un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
# 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>
la source
1
et9
plus, ce qui augmenterait les deux moyennes, mais vous ne pouvez pas le faire en déplaçant une seule.Réponses:
Pyth,
29282624 octetsMerci à @Jakube pour m'avoir économisé 3 octets avec
.p
etL
.Très simple, vérifie si des éléments de la liste 2 sont supérieurs à la moyenne de la liste 1 et inférieurs à la moyenne de la liste 2, puis répète avec la liste 1 et la liste 2 remplacées.
Imprime une liste non vide pour la vérité et
[]
pour Falsey.Essayez-le en ligne ici .
Suite de tests.
la source
Python 3, 74
Prend deux listes en entrée. Vérifie si la première liste a un élément plus grand que la moyenne mais plus petit que l'autre. Ensuite, fait la même chose pour les deux entrées permutées. Avoir une compréhension de liste à deux couches était plus court que de définir une fonction séparée pour essayer les deux ordres (82):
la source
Haskell,
58 ans57nous pouvons vérifier si nous augmentons ou diminuons la moyenne en vérifiant si l'élément à supprimer ou à inclure est plus grand ou plus petit que la moyenne.
nous pouvons vérifier cela en vérifiant si la moyenne est plus petite ou plus grande qu'un élément en supprimant cet élément du tableau et en vérifiant si la moyenne du nouveau tableau est négative ou positive, ce qui revient tout autant à vérifier si la somme est positive ou négative. .
vérifier que c'est mis très simplement comme
sum.map(-n+)
.la source
Mathematica,
4947 octetsEvalue en une fonction pure qui attend une entrée dans le formulaire
{list1, list2}
.la source
APL,
4540 octets5 octets sauvés grâce à Moris Zucca!
Cela crée une fonction dyadique non nommée qui accepte les tableaux à gauche et à droite et renvoie 1 ou 0.
Vous pouvez l' essayer en ligne .
la source
R,
6652 octetsEn tant que fonction non nommée, elle accepte 2 vecteurs. Je me suis débarrassé de quelques trucs parasites.
Des tests
la source
SAS / IML, 67 ans
Il utilise des opérateurs de réduction en indice pour obtenir la réponse. Il renvoie 0 si aucun élément correspondant aux exigences n'est trouvé ou 1 si un est trouvé.
Non-golfé, je renvoie ici la valeur réelle elle-même en utilisant la multiplication matricielle:
Tests:
(Condensé pour la lisibilité)
la source
Python 2.7,
1029896Prend l'entrée en tant que tableau des 2 entrées et retourne un booléen.
La logique est la suivante: recherchez l'avg des 2 listes, puis recherchez un élément tel qu'il soit inférieur à l'avg de sa propre liste et supérieur à la moyenne de l'autre liste.
Le tester pour les entrées données est démontré ici
la source
*1.
au lieu de*1.0
sauvegarder un octet. Sinon, si vous faites cela dans Python 3, la division retournera un float par défaut, de sorte que vous n'auriez pas besoin de cette multiplication du tout. (Je ne pense pas que vous deviez changer votre code pour utiliser Python 3.)f=
et en remplaçantin[0,1]for
parin 0,1for
. Puisque vous êtes actuellement à 101 octets, cela vous ramène à 98.CJam, 28 octets
Il s'agit d'une fonction anonyme qui ouvre un tableau à deux dimensions de la pile et laisse un tableau d'éléments mobiles en retour.
Dans les navigateurs pris en charge, vous pouvez vérifier tous les tests en même temps dans l’ interpréteur CJam .
Cas de test
Code
Contribution
Sortie
Comment ça marche
Si A et B sont les tableaux et avg (A) ≤ avg (B), nous vérifions simplement si B ∩ {⌊avg (A) + 1,…, avg (B)-1} est non vide. Tout élément de cette intersection peut être déplacé de B vers A pour augmenter les deux moyennes.
Cela pousse le tableau de tous les éléments du tableau avec une moyenne plus élevée qui peut être déplacé pour augmenter les deux moyennes. Ce tableau est vide / faux si et seulement si aucun élément ne peut être déplacé pour atteindre ce résultat.
la source
Ruby, 86
Prend en entrée un tableau contenant les deux tableaux.
Essaie de trouver un élément de sous moyenne dans le groupe avec la moyenne la plus élevée qui est supérieure à la moyenne de l'autre groupe.
Test: http://ideone.com/444W4U
la source
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
. Je pense que l'appel récursif devrait être quelque chose commef[a.rotate,p]
.Matlab, 54 ans
Utiliser une fonction anonyme:
Exemples:
la source
C #, 104
Exemple d'appels:
la source
C ++ 14, 157 octets
Comme lambda sans nom, retourne par le dernier paramètre
r
. SupposeA
,B
être des conteneurs commevector<int>
ouarray<int,>
.Ungolfed:
Usage:
la source