Finden Sie den C-Faktor einer Abstimmung

11

In dieser Herausforderung bestimmen Sie, wie kontrovers eine Abstimmung bei einer Reihe anderer Stimmen ist, indem Sie eine Zahl ermitteln, die als C-Faktor bezeichnet wird. Was ist der C-Faktor?

Stellen Sie sich vor, Sie haben mehrere Stimmen bei einer Wahl. Wir werden 1und 0um der Herausforderung willen zwei verschiedene Kandidaten bei einer Wahl vertreten. Hier sind die zehn Stimmen bei unserer Beispielwahl:

0110111011

Angenommen, wir möchten den C-Faktor jeder Abstimmung für einen Kandidaten ermitteln 0. Wir können das mit der folgenden Funktion tun:

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

In , ist die Abstimmung , die wir den C-Faktor für und bestimmen , wollen eine Reihe von Stimmen. Verwenden Sie also unsere Funktion, um den C-Faktor jeder Abstimmung für einen Kandidaten zu erhalten :fov0

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

Ein niedrigerer C-Faktor zeigt, dass die Abstimmung im Vergleich zu den anderen Stimmen weniger kontrovers war. Eine Abstimmung für einen Kandidaten unterscheidet sich 0also stärker von den anderen Stimmen als eine Abstimmung für einen Kandidaten 1. Im Vergleich dazu 1beträgt der C-Faktor für eine Kandidatenstimme , daher ist er weniger kontrovers, da er eher den anderen Stimmen ähnelt.0.3

Die Herausforderung

Schreiben Sie eine Funktion , um den C-Faktor einer Abstimmung bei gegebenen Abstimmungsergebnissen zu bestimmen .f(o,v)ov

  • omuss eine ganze Zahl sein, entweder 0oder 1.

  • v muss ein Array (oder ein ähnlicher Containertyp, abhängig von den Sprachspezifikationen) beliebiger Länge sein, das Nullen und Einsen enthält.

  • Die Funktion sollte den resultierenden C-Faktor unter Berücksichtigung der Funktionsparameter unter Verwendung der obigen Formel oder einer modifizierten Methode zurückgeben oder an die Konsole drucken.

Viel Glück! Das kleinste Byte gewinnt (Gewinner in fünf Tagen ausgewählt).

schließen Sie ihr Ladegerät an
quelle
Ist mean(v)in Ihrem Beispiel nicht gleich 0,7?
HyperNeutrino
@ HyperNeutrino Ja. Was ist das Problem?
Verbinden Sie Ihr Ladegerät
Wie ist abs(0 - 0.7)gleich 0.3?
HyperNeutrino
Ah. Das Beispiel wurde behoben. Ich habe die beiden Zahlen umgekehrt
connectyourcharger
Oh ok. Danke fürs klarstellen!
HyperNeutrino

Antworten:

6

Gelee , 3 Bytes

ạÆm

Probieren Sie es online aus!

Wörtlich nur "absoluter Unterschied zu bedeuten".

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

Wenn Sie die Argumente invertieren, können Sie die Atome invertieren.

HyperNeutrino
quelle
10

R , 23 Bytes

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

Probieren Sie es online aus!

Die Herausforderung besteht darin, den Anteil der Werte zu berechnen, die sich vvon o(dh mean(xor(o,v))) unterscheiden. Wir können daher die Verwendung vermeiden abs.

Robin Ryder
quelle
2
Funktioniert auch für willkürliche Abstimmungsdarstellungen, ordentlich.
Kriminell
6

APL (Dyalog Unicode) , 9 8 5 Bytes

≠⌹⊢=⊢

Probieren Sie es online aus!

Anonymer Zug. Danke an @ Adám für ein gespeichertes Byte und danke an @ngn für 3 Bytes!

Wie:

≠⌹⊢=⊢  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é
quelle
4
Sie können es in 5. Hinweis tun: ⌹
ngn
4

Eigentlich 3 Bytes

♀^æ

Probieren Sie es online aus!

Erläuterung:

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

05AB1E , 3 Bytes

ÅAα

Probieren Sie es online aus!

Luis Mendo
quelle
2
Ich bin 30 Sekunden zu spät .. Meine Bestellung jedoch anders war, zuerst αdann ÅA, p
Kevin Cruijssen
2
@ KevinCruijssen Ich habe gesehen, wie Ihre Lösung in Echtzeit eingegangen ist. Ich habe mit dem Kommentieren begonnen und sie wurde innerhalb von 30 Sekunden gelöscht. Urkomisch!
Connectyourcharger
@ KevinCruijssen Ich verstehe nicht wirklich, wie die beiden Bestellungen gleich funktionieren ... :-) Meine 05AB1E-Kenntnisse sind nicht sehr gut
Luis Mendo
1
@ KevinCruijssen Ah, ich verstehe. Was mich verwirrte, war, dass die beiden Ansätze unterschiedliche Ergebnisse für beliebige Zahlen liefern; aber für 0/1 Eingaben scheinen sie übereinzustimmen. Beispiel
Luis Mendo
2
@ LuisMendo Ah, ja, du hast tatsächlich recht. Ich habe es mit ein paar anderen ganzen Zahlen getestet, aber diese lieferten unabhängig von der Reihenfolge auch die gleichen Ergebnisse (aber Ihr Testfall mit 0,8 unterscheidet sich tatsächlich). Wenn die Eingabe neben 0/ noch etwas anderes enthalten könnte 1, ist Ihr Ansatz, zuerst den Mittelwert und dann den absoluten Unterschied zu ermitteln, korrekt, wenn wir ihn mit der Formel in der Herausforderungsbeschreibung vergleichen. Mit nur 0s / 1s sind auch einige alternative 3-Byter möglich, wie z ÊÅA.
Kevin Cruijssen
2

Attache , 11 8 Bytes

Mean@`/=

Probieren Sie es online aus! Nimmt Argumente als f[o, v].

Nichts schrecklich Originelles.

Alternative Ansätze

11 Bytes: Average@`/=

11 Bytes: ${1-x~y/#y} Zählt die Vorkommen von xin ygeteilt durch die Länge von yund subtrahiert diese dann von 1.

11 Bytes: {1-_2~_/#_} (Argumente für dieses sind umgekehrt)

15 Bytes: ${Sum[x/=y]/#y} Eine explizitere Version des oben genannten, ohne Average.

Conor O'Brien
quelle
1

JavaScript, 38 Bytes

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

Versuch es

Zottelig
quelle
1

Proton , 26 Bytes

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

Probieren Sie es online aus!

Die Ausgabe ist ein Bruchteil, da Proton zur besseren Genauigkeit Sympy anstelle regulärer Python-Zahlen verwendet.

(-7 Bytes; abs-diff zu bedeuten ist kürzer als der Mittelwert von abs-diff; ich bin eigentlich dumm)

-1 Byte dank Rod

HyperNeutrino
quelle
@ Rod Ich habe versucht herauszufinden, wie ich die 1/0-Eingabebeschränkung optimieren kann, bin aber gescheitert. Vielen Dank!
HyperNeutrino
1

Perl 6 , 20 Bytes

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

Probieren Sie es online aus!

* X!= *ist eine anonyme Funktion, die das ungleiche Kreuzprodukt ihrer beiden Argumente verwendet. Es erzeugt eine Folge von Booleschen Werten; zum Beispiel 1 X!= (1, 0, 1)bewertet zu (False, True, False).

{ @_.sum / @_ }ist eine weitere anonyme Funktion, die den Durchschnitt ihrer Argumente zurückgibt. Boolean Truewertet zu 1numerisch und Falsezu aus 0.

Der oBediener fasst diese beiden Funktionen zu einer zusammen.

Sean
quelle
1

Tragen Sie 3 Bytes ein

nÆm

Probieren Sie es online aus!

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

Die Sprache ist sehr stark von Jelly inspiriert, so dass es wahrscheinlich eher so ist, als würde ich experimentieren, um zu versuchen, die Struktur wiederherzustellen, wie Jelly mit meinem eigenen Code analysiert wird.

-1 Byte danke an Mr. Xcoder

HyperNeutrino
quelle
Sie können verwenden, nanstatt _...A1 zu speichern ( Online ausprobieren! ).
Herr Xcoder
@ Mr.Xcoder Ooh schön. Ja, ich habe den! = Trick erkannt, nachdem ich diesen lol gemacht habe. Vielen Dank!
HyperNeutrino
1

Retina 0,8,2 , 27 Bytes

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

Probieren Sie es online aus! Gibt einen Bruchteil aus. Erläuterung: Die erste Gruppe erfasst ound die zweite Gruppe erfasst jeden Eintrag von v, während die Bedingung sicherstellt, dass die dritte Gruppe nur dann eine Erfassung vornimmt, wenn die Abstimmung unterschiedlich ist. Die $#Konstruktion gibt dann die Anzahl der relevanten Erfassungen wie gewünscht zurück.

Neil
quelle
1

Ulme 0,19, 48 Bytes

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

Online-Demo hier .

OOBalance
quelle
1

C (gcc) , 62 Bytes

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

Probieren Sie es online aus!

Rufen Sie an als f(int o, int *v, int length_of_v).

pizzapants184
quelle
0

Java 8, 47 Bytes

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

Probieren Sie es online aus.

oder alternativ:

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

Probieren Sie es online aus.

Für beide sind die Eingaben a Supplier<DoubleStream>für die Liste der Stimmen vund doublefür die Abstimmung o.

Erläuterung:

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
quelle
0

Common Lisp 49 Bytes

Lösung:

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

Probieren Sie es online aus

Erläuterung:

(defun c(o v)
  (abs (- o (/ (reduce '+ v) (length v)))))
  • Reduzieren wendet eine Funktion auf alle Listenelemente an (+ in diesem Fall)
  • Ruhe ist nur die Basisfunktion, abs (o - Mittelwert (v))
David Horák
quelle
0

Pyth, 4 Bytes

aE.O

Erläuterung:

       ( 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)

Die Eingabe hat das Format:

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

mit der Reihe der Stimmen zuerst und dem Kandidaten zweitens.

Probieren Sie es online aus!

RK.
quelle