Encontre o fator C de uma votação

11

Nesse desafio, você determinará o quão controverso é um voto, considerando uma série de outros votos, calculando um número chamado fator C. Qual é o fator C, você pergunta?

Bem, imagine que você tenha vários votos em uma eleição. Usaremos 1e, 0para o bem do desafio, representar dois candidatos diferentes em uma eleição. Aqui estão os dez votos em nossa amostra de eleição:

0110111011

Agora, digamos que queremos encontrar o fator C de qualquer voto para candidato 0. Podemos fazer isso com a seguinte função:

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

Em , é a votação para a qual queremos determinar o fator C e é uma matriz de votos. Portanto, usando nossa função, para obter o fator C de qualquer voto para candidato :fov0

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

Um fator C mais baixo mostra que a votação foi menos controversa em comparação com os outros votos. Portanto, um voto para candidato 0é mais diferente dos outros votos que um voto para candidato 1. Em comparação, o fator C para uma 1votação de candidato é , portanto é menos controverso porque é mais parecido com os outros votos.0.3

O desafio

Escreva uma função para determinar o fator C de uma votação, dados os resultados de uma votação .f(o,v)ov

  • odeve ser um número inteiro, 0ou 1.

  • v deve ser uma matriz (ou tipo de contêiner semelhante, dependendo das especificações de idioma) de comprimento arbitrário contendo zeros e uns.

  • A função deve retornar ou imprimir no console o fator C resultante, dados os parâmetros da função, usando a fórmula acima ou um método modificado.

Boa sorte! O mínimo de bytes ganha (vencedor escolhido em cinco dias).

conecte seu carregador
fonte
Não é mean(v)igual a 0,7 no seu exemplo?
HyperNeutrino
@HyperNeutrino Yes. Qual é o problema?
connectyourcharger
Como é abs(0 - 0.7)igual a 0.3?
HyperNeutrino
Ah Corrigido o exemplo. I reverteu a dois números
connectyourcharger
Oh está bem. Obrigado por esclarecer!
HyperNeutrino

Respostas:

6

Gelatina , 3 bytes

ạÆm

Experimente online!

Literalmente apenas "diferença absoluta para significar".

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

Se você inverter os argumentos, poderá inverter os átomos.

HyperNeutrino
fonte
10

R , 23 bytes

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

Experimente online!

O desafio se resume a calcular a proporção de valores em vdiferente de o(ie mean(xor(o,v))). Portanto, podemos evitar o uso abs.

Robin Ryder
fonte
2
Também funciona para representações de voto arbitrárias, organizadas.
CriminallyVulgar
6

APL (Dyalog Unicode) , 9 8 5 bytes

≠⌹⊢=⊢

Experimente online!

Trem anônimo. Obrigado a @ Adám por um byte salvo e obrigado a @ngn por 3 bytes!

Quão:

≠⌹⊢=⊢  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é
fonte
4
você pode fazê-lo em 5. dica: ⌹
ngn
4

Na verdade , 3 bytes

♀^æ

Experimente online!

Explicação:

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

05AB1E , 3 bytes

ÅAα

Experimente online!

Luis Mendo
fonte
2
Tenho 30 segundos tarde demais .. Minha ordem foi diferente, porém, primeiro α, em seguida ÅA; p
Kevin Cruijssen
2
@KevinCruijssen Eu assisti sua solução chegar em tempo real, comecei a comentar e ela foi excluída, tudo em cerca de 30 segundos. Hilário!
connectyourcharger
@KevinCruijssen Eu realmente não entendo como as duas ordens funcionam da mesma ... :-) Meu 05AB1E conhecimento não é muito bom
Luis Mendo
11
@KevinCruijssen Ah, entendo. O que estava me confundindo é que as duas abordagens dão resultados diferentes para números arbitrários; mas para entradas 0/1 elas parecem concordar. Exemplo
Luis Mendo
2
@LuisMendo Ah, sim, você está realmente certo. Testei-o com alguns outros números inteiros, mas esses também deram os mesmos resultados, independentemente da ordem (mas o seu caso de teste com 0,8 realmente difere). Se a entrada puder conter algo além de 0/ 1, sua abordagem de obter a média primeiro e, em seguida, a diferença absoluta estará correta quando a compararmos com a fórmula na descrição do desafio. Com apenas 0s / 1s, alguns 3-byters alternativos também são possíveis, como ÊÅA.
Kevin Cruijssen 19/06/19
2

Anexo , 11 8 bytes

Mean@`/=

Experimente online! Aceita argumentos como f[o, v].

Nada terrivelmente original.

Abordagens alternativas

11 bytes: Average@`/=

11 bytes: ${1-x~y/#y} conta as ocorrências de xin ydividido pelo comprimento de ye subtrai isso de 1.

11 bytes: {1-_2~_/#_} (os argumentos são revertidos para este)

15 bytes: ${Sum[x/=y]/#y} uma versão mais explícita do anterior, sem Average.

Conor O'Brien
fonte
1

JavaScript, 38 bytes

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

Tente

Shaggy
fonte
1

Próton , 26 bytes

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

Experimente online!

A saída é uma fração porque o Proton usa números sympy em vez de números regulares do Python para melhor precisão.

(-7 bytes; abs-diff significa menos que a média de abs-diff; na verdade, sou burro)

-1 byte graças a Rod

HyperNeutrino
fonte
@ Rod Eu estava tentando descobrir como otimizar a restrição de entrada 1/0, mas falhou. Obrigado!
HyperNeutrino
1

Perl 6 , 20 bytes

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

Experimente online!

* X!= *é uma função anônima que pega o produto cruzado não-igual de seus dois argumentos. Produz uma sequência de booleanos; por exemplo, 1 X!= (1, 0, 1)avalia como (False, True, False).

{ @_.sum / @_ }é outra função anônima que retorna a média de seus argumentos. Booleano Trueavalia para 1numericamente e Falsepara 0.

O ooperador compõe essas duas funções em uma.

Sean
fonte
1

Alistar , 3 bytes

nÆm

Experimente online!

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

A linguagem é fortemente inspirada por Jelly, a tal ponto que provavelmente é mais como eu experimentando tentar recriar a estrutura de como Jelly é analisada com meu próprio código.

-1 byte graças ao Sr. Xcoder

HyperNeutrino
fonte
Você pode usar em nvez de _...Asalvar 1 ( Experimente online! ).
Mr. Xcoder
@ Mr.Xcoder Ooh legal. Sim, eu percebi o truque! = Depois de fazer isso lol. Obrigado!
HyperNeutrino 19/06/19
1

Retina 0.8.2 , 27 bytes

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

Experimente online! Produz uma fração. Explicação: O primeiro grupo captura oe o segundo grupo captura cada entrada de v, enquanto o condicional garante que o terceiro grupo faça uma captura apenas quando a votação for diferente. A $#construção retorna a contagem das capturas relevantes, conforme desejado.

Neil
fonte
1

Olmo 0,19, 48 bytes

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

Demonstração online aqui .

OOBalance
fonte
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;}

Experimente online!

Ligar como f(int o, int *v, int length_of_v).

pizzapants184
fonte
0

Java 8, 47 bytes

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

Experimente online.

ou alternativamente:

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

Experimente online.

Para ambas as entradas, são indicados Supplier<DoubleStream>para a lista de votos ve doublepara a votação o.

Explicação:

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

Lisp comum 49 bytes

Solução:

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

Experimente online

Explicação:

(defun c(o v)
  (abs (- o (/ (reduce '+ v) (length v)))))
  • reduzir aplica uma função sobre todos os elementos da lista (+ neste caso)
  • resto é apenas a função base, abs (o - mean (v))
David Horák
fonte
0

Pitão, 4 bytes

aE.O

Explicação:

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

A entrada está no formato de:

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

com a série de votos primeiro e o candidato em segundo.

Experimente online!

RK.
fonte