Encuentre el factor C de un voto


11

En este desafío, determinará qué tan controvertido es un voto, dada una serie de otros votos, al descubrir un número llamado factor C. ¿Cuál es el factor C, preguntas?

Bueno, imagina que tienes varios votos en una elección. Usaremos 1y 0por el bien del desafío representar a dos candidatos diferentes en una elección. Aquí están los diez votos en nuestra elección de muestra:

0110111011

Ahora, digamos que queremos encontrar el factor C de cualquier voto por candidato 0. Podemos hacer eso con la siguiente función:

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

En , es el voto para el que queremos determinar el factor C, y es un conjunto de votos. Entonces, usando nuestra función, para obtener el factor C de cualquier voto por candidato :fov0

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

Un factor C más bajo muestra que el voto fue menos controvertido en comparación con los otros votos. Entonces, un voto por candidato 0es más diferente de los otros votos que un voto por candidato 1. En comparación, el factor C para un 1voto de candidato es , por lo que es menos controvertido porque se parece más a los otros votos.0.3

El reto

Escriba una función para determinar el factor C de un voto dados los resultados de un voto .f(o,v)ov

  • odebe ser un número entero, ya sea 0o 1.

  • v debe ser una matriz (o un tipo de contenedor similar según las especificaciones del idioma) de longitud arbitraria que contenga ceros y unos.

  • La función debe devolver o imprimir en la consola el factor C resultante dados los parámetros de la función, utilizando la fórmula anterior o un método modificado.

¡Buena suerte! El menor número de bytes gana (ganador elegido en cinco días).


¿No es mean(v)igual a 0.7 en su ejemplo?
HyperNeutrino

@HyperNeutrino Sí. ¿Cual es el problema?
connectyourcharger

¿Cómo es abs(0 - 0.7)igual a 0.3?
HyperNeutrino

Ah Arreglado el ejemplo.
Invertí

Ah, vale. ¡Gracias por aclararlo!
HyperNeutrino

Respuestas:


6

Jalea , 3 bytes

ạÆm

Pruébalo en línea!

Literalmente solo "diferencia absoluta para significar".

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

Si inviertes los argumentos, puedes invertir los átomos.


10

R , 23 bytes

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

Pruébalo en línea!

El desafío se reduce a calcular la proporción de valores en vdiferentes de o(es decir, mean(xor(o,v))). Por lo tanto, podemos evitar el uso abs.


2
También funciona para representaciones de votación arbitrarias, ordenadas.
CriminallyVulgar

6

APL (Dyalog Unicode) , 9 8 5 bytes

≠⌹⊢=⊢

Pruébalo en línea!

Tren anónimo ¡Gracias a @ Adám por un byte guardado, y gracias a @ngn por 3 bytes!

Cómo:

≠⌹⊢=⊢  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.

44
puedes hacerlo en 5. pista: ⌹
ngn


3

05AB1E , 3 bytes

ÅAα

Pruébalo en línea!


2
Tengo 30 segundos demasiado tarde .. Mi orden era diferente, sin embargo, en primer lugar αa continuación ÅA, p
Kevin Cruijssen

2
@KevinCruijssen Observé su solución en tiempo real, comencé a comentar y se eliminó, todo en unos 30 segundos. ¡Divertidísimo!
connectyourcharger

@KevinCruijssen Realmente no entiendo cómo funcionan las dos órdenes de la misma manera ... :-) Mi conocimiento 05AB1E no es muy bueno
Luis Mendo

1
@KevinCruijssen Ah, ya veo. Lo que me confundía es que los dos enfoques dan resultados diferentes para números arbitrarios; pero para 0/1 entradas parecen estar de acuerdo. Ejemplo
Luis Mendo

2
@LuisMendo Ah, sí, tienes razón. Lo probé con algunos otros enteros, pero también obtuvieron los mismos resultados independientemente del orden (pero su caso de prueba con 0.8 es realmente diferente). Si la entrada podría haber contenido algo más además de 0/ 1, su enfoque de obtener primero la media y luego la diferencia absoluta es correcta cuando la comparamos con la fórmula en la descripción del desafío. Con solo 0s / 1s, también son posibles algunas alternativas de 3 bytes ÊÅA.
Kevin Cruijssen


2

Adjunto , 11 8 bytes

Mean@`/=

Pruébalo en línea! Toma argumentos como f[o, v].

Nada terriblemente original.

Aproximaciones alternativas

11 bytes: Average@`/=

11 bytes: ${1-x~y/#y} cuenta las ocurrencias de xin ydividido por la longitud de y, luego resta de 1.

11 bytes: {1-_2~_/#_} (Los argumentos se invierten para este)

15 bytes: ${Sum[x/=y]/#y} una versión más explícita de lo anterior, sin Average.



1

Protón , 26 bytes

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

Pruébalo en línea!

El resultado es una fracción porque Proton usa números sympy en lugar de Python regulares para una mejor precisión.

(-7 bytes; abs-diff a mean es más corto que la media de abs-diff; en realidad soy tonto)

-1 byte gracias a Rod


@ Rod Intenté descubrir cómo optimizar para la restricción de entrada 1/0 pero fallé. ¡Gracias!
HyperNeutrino

1

Perl 6 , 20 bytes

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

Pruébalo en línea!

* X!= *es una función anónima que toma el producto cruzado no igual de sus dos argumentos. Produce una secuencia de booleanos; por ejemplo, 1 X!= (1, 0, 1)evalúa a (False, True, False).

{ @_.sum / @_ }es otra función anónima que devuelve el promedio de sus argumentos. Boolean Trueevalúa 1numéricamente y Falsea 0.

El ooperador compone esas dos funciones en una.


1

Aliste , 3 bytes

nÆm

Pruébalo en línea!

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

El lenguaje está muy inspirado por Jelly hasta el punto de que probablemente sea más como si yo estuviera experimentando para tratar de recrear la estructura de cómo Jelly se analiza con mi propio código.

-1 byte gracias al Sr. Xcoder


Puede usar en nlugar de _...Aguardar 1 (¡ Pruébelo en línea! ).
Sr. Xcoder

@ Mr.Xcoder Ooh bien. Sí, me di cuenta del truco! = Después de hacer esto jajaja. ¡Gracias!
HyperNeutrino

1

Retina 0.8.2 , 27 bytes

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

Pruébalo en línea! Produce una fracción. Explicación: El primer grupo captura oy el segundo grupo captura cada entrada de v, mientras que el condicional garantiza que el tercer grupo solo realice una captura cuando el voto es diferente. La $#construcción devuelve el recuento de las capturas relevantes según lo deseado.




1

Elm 0.19, 48 bytes

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

Demostración en línea aquí .





0

Java 8, 47 bytes

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

Pruébalo en línea.

o alternativamente:

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

Pruébalo en línea.

Para ambas, las entradas son Supplier<DoubleStream>para la lista de votos vy doublepara la votación o.

Explicación:

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`

0

Lisp común 49 bytes

Solución:

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

Pruébalo en línea

Explicación:

(defun c(o v)
  (abs (- o (/ (reduce '+ v) (length v)))))
  • reducir aplica una función sobre todos los elementos de la lista (+ en este caso)
  • el resto es solo la función base, abs (o - mean (v))


0

Pyth, 4 bytes

aE.O

Explicación:

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

La entrada tiene el formato de:

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

con el conjunto de votos primero, y el candidato segundo.

Pruébalo en línea!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.