Trouver le facteur C d'un vote

11

Dans ce défi, vous déterminerez à quel point un vote est controversé, compte tenu d'un éventail d'autres votes, en déterminant un nombre appelé le facteur C. Quel est le facteur C, demandez-vous?

Eh bien, imaginez que vous avez plusieurs votes sur une élection. Nous allons utiliser 1et 0pour le défi de représenter deux candidats différents lors d'une élection. Voici les dix votes de notre exemple d'élection:

0110111011

Maintenant, disons que nous voulons trouver le facteur C de tout vote pour un candidat 0. Nous pouvons le faire avec la fonction suivante:

f(o,v)=abs(omean(v))

En f , oest le vote pour lequel nous voulons déterminer le facteur C, et vest un tableau de votes. Donc, en utilisant notre fonction, pour obtenir le facteur C de tout vote pour le candidat 0:

f(0,[0,1,1,0,1,1,1,0,1,1])=0.7

Un facteur C inférieur montre que le vote a été moins controversé par rapport aux autres votes. Ainsi, un vote pour un candidat 0est plus différent des autres votes qu'un vote pour un candidat 1. En comparaison, le facteur C pour un 1vote de candidat est de 0.3 , il est donc moins controversé car il ressemble davantage aux autres votes.

Le défi

Écrivez une fonction f(o,v) pour déterminer le facteur C d'un vote ocompte tenu des résultats d'un vote v.

  • odoit être un entier, 0ou 1.

  • v doit être un tableau (ou un type de conteneur similaire selon les spécifications de la langue) de longueur arbitraire contenant des zéros et des uns.

  • La fonction doit renvoyer ou imprimer à la console le facteur C résultant en fonction des paramètres de la fonction, en utilisant la formule ci-dessus ou une méthode modifiée.

Bonne chance! Le moins d'octets l'emporte (gagnant choisi en cinq jours).

Branchez votre chargeur
la source
N'est-il pas mean(v)égal à 0,7 dans votre exemple?
HyperNeutrino
@HyperNeutrino Oui. Quel est le problème?
connectyourcharger le
Comment est abs(0 - 0.7)égal à 0.3?
HyperNeutrino
Ah. Correction de l'exemple. J'ai inversé les deux nombres
connectyourcharger
Ah d'accord. Merci de clarifier!
HyperNeutrino

Réponses:

6

Gelée , 3 octets

ạÆm

Essayez-le en ligne!

Littéralement juste "différence absolue pour signifier".

ạÆm  Main link
ạ    Absolute difference
 Æm  Arithmetic Mean

Si vous inversez les arguments, vous pouvez inverser les atomes.

HyperNeutrino
la source
10

R , 23 octets

function(o,v)mean(o!=v)

Essayez-le en ligne!

Le défi se résume à calculer la proportion de valeurs vdifférentes de o(ie mean(xor(o,v))). On peut donc éviter d'utiliser abs.

Robin Ryder
la source
2
Fonctionne également pour les représentations de vote arbitraires, soigné.
CriminallyVulgar
6

APL (Dyalog Unicode) , 9 8 5 octets

≠⌹⊢=⊢

Essayez-le en ligne!

Train anonyme. Merci à @ Adám pour un octet enregistré et merci à @ngn pour 3 octets!

Comment:

≠⌹⊢=⊢  Anonymous Train
      The right argument (⍵)
  ⊢=   Equals itself. Generates an array of 1s
      XOR left (⍺) and right args; generates  or (not ⍵), depending on ⍺.
      Divide these matrices.
J. Sallé
la source
4
vous pouvez le faire en 5. indice: ⌹
ngn
4

En fait , 3 octets

♀^æ

Essayez-le en ligne!

Explication:

♀^æ
♀^   XOR each vote with candidate (0 if matches, 1 if not)
  æ  mean of the list
Mego
la source
3

05AB1E , 3 octets

ÅAα

Essayez-le en ligne!

Luis Mendo
la source
2
Je suis 30 secondes trop tard .. Ma commande était différent mais, d' abord , αpuis ÅA, p
Kevin Cruijssen
2
@KevinCruijssen J'ai vu votre solution arriver en temps réel, j'ai commencé à commenter, et elle a été supprimée, le tout en 30 secondes environ. Hilarant!
connectyourcharger le
@KevinCruijssen Je ne comprends pas vraiment comment les deux commandes fonctionnent de la même manière: :-) Mes connaissances 05AB1E ne sont pas très bonnes
Luis Mendo
1
@KevinCruijssen Ah, je vois. Ce qui m'a dérouté, c'est que les deux approches donnent des résultats différents pour des nombres arbitraires; mais pour les entrées 0/1, ils semblent d'accord. Exemple
Luis Mendo
2
@LuisMendo Ah, oui, vous avez bien raison. Je l'ai testé avec quelques autres entiers, mais ceux-ci ont également donné les mêmes résultats quel que soit l'ordre (mais votre cas de test avec 0.8 diffère en effet). Si l'entrée aurait pu contenir autre chose que 0/ 1, votre approche consistant à obtenir d'abord la moyenne puis la différence absolue est correcte lorsque nous la comparons à la formule dans la description du défi. Avec seulement 0s / 1s, quelques 3 octets alternatifs sont également possibles, comme ÊÅA.
Kevin Cruijssen
2

Attaché , 11 8 octets

Mean@`/=

Essayez-le en ligne! Prend les arguments comme f[o, v].

Rien de terriblement original.

Approches alternatives

11 octets: Average@`/=

11 octets: ${1-x~y/#y} compte les occurrences de xdans ydivisé par la longueur de y, puis soustrait celle de 1.

11 octets: {1-_2~_/#_} (Les arguments sont inversés pour celui-ci)

15 octets: ${Sum[x/=y]/#y} une version plus explicite de ce qui précède, sans Average.

Conor O'Brien
la source
1

JavaScript, 38 octets

n=>a=>a.map(x=>n-=x/a.length)|n<0?-n:n

Essayez-le

Hirsute
la source
1

Proton , 26 octets

(o,v)=>1-v.count(o)/len(v)

Essayez-le en ligne!

La sortie est une fraction car Proton utilise sympy au lieu des nombres Python réguliers pour une meilleure précision.

(-7 octets; abs-diff signifie plus court que la moyenne de abs-diff; je suis en fait stupide)

-1 octet grâce à Rod

HyperNeutrino
la source
@Rod J'essayais de comprendre comment optimiser la restriction d'entrée 1/0, mais j'ai échoué. Merci!
HyperNeutrino
1

Perl 6 , 20 octets

{@_.sum/@_}o(*X!= *)

Essayez-le en ligne!

* X!= *est une fonction anonyme qui prend le produit croisé non égal de ses deux arguments. Il produit une séquence de booléens; par exemple, 1 X!= (1, 0, 1)évalue à (False, True, False).

{ @_.sum / @_ }est une autre fonction anonyme qui renvoie la moyenne de ses arguments. Boolean Trueévalue à 1numériquement et Falseà 0.

L' oopérateur compose ces deux fonctions en une seule.

Sean
la source
1

Inscrire , 3 octets

nÆm

Essayez-le en ligne!

nÆm  Main Link
n    Not Equals (returns a list of whether or not each element is unequal to to the value)
 Æm  Arithmetic Mean

Le langage est très fortement inspiré par Jelly au point que c'est probablement plus comme moi d'expérimenter pour essayer de recréer la structure de la façon dont Jelly est analysée avec mon propre code.

-1 octet merci à M. Xcoder

HyperNeutrino
la source
Vous pouvez utiliser nau lieu de _...Apour enregistrer 1 ( Essayez-le en ligne! ).
M. Xcoder
@ Mr.Xcoder Ooh sympa. Ouais j'ai réalisé l'astuce! = Après avoir fait ce lol. Merci!
HyperNeutrino
1

Retina 0.8.2 , 27 octets

(.),((?(\1)|()).)*$
$#3/$#2

Essayez-le en ligne! Produit une fraction. Explication: Le premier groupe capture oet le deuxième groupe capture chaque entrée de v, tandis que le conditionnel garantit que le troisième groupe ne fait une capture que lorsque le vote est différent. La $#construction renvoie ensuite le nombre de captures pertinentes comme souhaité.

Neil
la source
1

Orme 0,19, 48 octets

f a v=abs(v-(List.sum a/toFloat(List.length a)))

Démo en ligne ici .

OOBalance
la source
1

C (gcc) , 62 octets

float f(o,v,l,k)int*v;{float r=0;for(k=l;k;)r+=v[--k]^o;r/=l;}

Essayez-le en ligne!

Appelez le f(int o, int *v, int length_of_v).

pizzapants184
la source
0

Java 8, 47 octets

v->o->(o-=v.get().sum()/v.get().count())<0?-o:o

Essayez-le en ligne.

Ou bien:

v->o->Math.abs(o-v.get().sum()/v.get().count())

Essayez-le en ligne.

Pour les deux, les entrées sont un Supplier<DoubleStream>pour la liste des votes vet doublepour le vote o.

Explication:

v->o->                 // Method with DoubleStream-Supplier & double parameters and double return
  (o-=v.get().sum()    //  Get the sum of the DoubleStream-Supplier
      /v.get().count() //  Divide it by the amount of items in the DoubleStream-Supplier
      )                //  Subtract this from `o`
       <0?-o:o         //  And get the absolute value of this updated value `o`
Kevin Cruijssen
la source
0

Lisp commun 49 octets

Solution:

(defun c(o v)(abs(- o(/(reduce'+ v)(length v)))))

Essayez-le en ligne

Explication:

(defun c(o v)
  (abs (- o (/ (reduce '+ v) (length v)))))
  • réduire applique une fonction sur tous les éléments de la liste (+ dans ce cas)
  • le repos est juste la fonction de base, abs (o - moyenne (v))
David Horák
la source
0

Pyth, 4 octets

aE.O

Explication:

       ( implicitly set Q = eval(input()) )
a      Absolute difference between
 E     eval(input()) (this is the second line of input taken)
  .O   and the average of
    Q  (implicit) Q (the first line of input)

L'entrée est au format:

[0,1,1,0,1,1,1,0,1,1]
0

avec la gamme de votes en premier, et le candidat en second.

Essayez-le en ligne!

RK.
la source