Найти С-фактор голосования

11

В этом задании вы будете определять, насколько спорным является голосование, учитывая множество других голосов, вычисляя число, называемое С-фактором. Вы спросите, что такое С-фактор?

Ну, представьте, у вас есть несколько голосов на выборах. Мы будем использовать 1и 0ради задачи представлять двух разных кандидатов на выборах. Вот десять голосов на наших выборочных выборах:

0110111011

Теперь, скажем, мы хотим найти C-фактор любого голоса за кандидата 0. Мы можем сделать это с помощью следующей функции:

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

В f , oэто голосование , мы хотим определить C-фактор для, и vявляется массивом голосов. Итак, используя нашу функцию, чтобы получить C-фактор любого голоса за кандидата 0:

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

Более низкий C-фактор показывает, что голосование было менее спорным по сравнению с другими голосами. Таким образом, голосование за кандидата 0более отличается от других голосов, чем голосование за кандидата 1. Для сравнения, C-фактор для 1голосования кандидата равен , поэтому он менее спорный, потому что он больше похож на другие голоса.0.3

Соревнование

Напишите функцию чтобы определить C-фактор голосования с учетом результатов голосования .f(o,v)ov

  • oдолжно быть целым числом, либо 0или 1.

  • v должен быть массивом (или похожим типом контейнера в зависимости от языковых спецификаций) произвольной длины, содержащим нули и единицы.

  • Функция должна вернуть или вывести на консоль полученный C-фактор с учетом параметров функции, используя приведенную выше формулу или модифицированный метод.

Удачи! Побеждает наименьшее количество байтов (победитель выбирается через пять дней).

connectyourcharger
источник
Разве не mean(v)равно 0,7 в вашем примере?
HyperNeutrino
@HyperNeutrino Да. В чем проблема?
connectyourcharger
Как abs(0 - 0.7)равняется 0.3?
HyperNeutrino
Ах. Исправлен пример. Я поменял два числа
connectyourcharger
Ох, ну ладно. Спасибо за разъяснение!
HyperNeutrino

Ответы:

6

Желе , 3 байта

ạÆm

Попробуйте онлайн!

Буквально просто «абсолютная разница значит».

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

Если вы инвертируете аргументы, вы можете инвертировать атомы.

HyperNeutrino
источник
10

R , 23 байта

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

Попробуйте онлайн!

Задача сводится к вычислению пропорции значений, vотличных от o(то есть mean(xor(o,v))). Поэтому мы можем избежать использования abs.

Робин Райдер
источник
2
Также работает для произвольных представлений голосования, аккуратно.
Преступно-
6

APL (Dyalog Unicode) , 9 8 5 байт

≠⌹⊢=⊢

Попробуйте онлайн!

Анонимный поезд. Спасибо @ Adám за сохраненный байт и благодаря @ngn за 3 байта!

Как:

≠⌹⊢=⊢  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.
Ж. Салле
источник
4
Вы можете сделать это в 5. Подсказка: n
нгн
3

05AB1E , 3 байта

ÅAα

Попробуйте онлайн!

Луис Мендо
источник
2
Я опаздываю на 30 секунд .. Мой заказ был другим, хотя, сначала αтогда ÅA; p
Кевин Круйссен
2
@KevinCruijssen Я наблюдал, как ваше решение пришло в режиме реального времени, я начал комментировать, и оно было удалено, всего за 30 секунд. Веселое!
connectyourcharger
@KevinCruijssen Я не очень понимаю, как эти два заказа работают одинаково ... :-) Мои знания 05AB1E не очень хороши
Луис Мендо
1
@KevinCruijssen А, понятно. Что меня смущало, так это то, что оба подхода дают разные результаты для произвольных чисел; но для входов 0/1 они, кажется, согласны. Пример
Луис Мендо
2
@ LuisMendo Ах, да, ты действительно прав. Я протестировал его с несколькими другими целыми числами, но они дали одинаковые результаты, независимо от порядка (но ваш тестовый пример с 0,8 действительно отличается). Если входные данные могли содержать что-то еще, кроме 0/ 1, ваш подход сначала получить среднее, а затем абсолютную разницу верен, когда мы сравним это с формулой в описании задачи. Только с 0s / 1s возможны альтернативные 3-байтовые символы, например ÊÅA.
Кевин Круйссен
2

Атташе , 11 8 байт

Mean@`/=

Попробуйте онлайн! Принимает аргументы как f[o, v].

Ничего страшного оригинального.

Альтернативные подходы

11 байт: Average@`/=

11 байт: ${1-x~y/#y} Считает вхождения xв yделенное на длину y, а затем вычитает , что с 1.

11 байт: {1-_2~_/#_} (для этого аргументы меняются местами)

15 байт: ${Sum[x/=y]/#y} более явная версия выше, без Average.

Конор О'Брайен
источник
1

Протон , 26 байт

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

Попробуйте онлайн!

Выходные данные являются дробными, потому что Proton использует sympy вместо обычных чисел Python для большей точности.

(-7 байт; abs-diff означает, что значение короче среднего значения abs-diff; я на самом деле тупой)

-1 байт благодаря штанге

HyperNeutrino
источник
@Rod Я пытался выяснить, как оптимизировать ограничение ввода 1/0, но не получилось. Спасибо!
HyperNeutrino
1

Perl 6 , 20 байт

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

Попробуйте онлайн!

* X!= *является анонимной функцией, которая принимает не равное произведение двух своих аргументов. Это производит последовательность логических значений; например, 1 X!= (1, 0, 1)оценивает в (False, True, False).

{ @_.sum / @_ }это еще одна анонимная функция, которая возвращает среднее значение своих аргументов. Boolean Trueоценивает 1численно и Falseдо 0.

oОператор сочиняет эти две функции в одном.

Шон
источник
1

Подключить , 3 байта

nÆm

Попробуйте онлайн!

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

Язык очень сильно вдохновлен Jelly до такой степени, что, вероятно, мне больше нравится экспериментировать, пытаясь воссоздать структуру того, как Jelly анализируется с моим собственным кодом.

-1 байт благодаря мистеру Xcoder

HyperNeutrino
источник
Вы можете использовать nвместо _...Aсохранения 1 ( Попробуйте онлайн! ).
г-н Xcoder
@ Мистер Xcoder О, хорошо. Да, я понял трюк! = После этого лол. Спасибо!
ГиперНейтрино
1

Сетчатка 0.8.2 , 27 байт

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

Попробуйте онлайн!Выводит дробь. Объяснение: Первая группа захватывает, oа вторая группа захватывает каждую запись v, в то время как условный гарантирует, что третья группа делает захват только тогда, когда голосование отличается. $#Конструкция затем возвращает количество соответствующих захватов , как хотелось бы .

Нил
источник
1

Вяз 0,19, 48 байтов

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

Онлайн демо здесь .

OOBalance
источник
0

Java 8, 47 байт

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

Попробуйте онлайн.

или альтернативно:

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

Попробуйте онлайн.

Для обоих входов есть Supplier<DoubleStream>для списка голосов vи doubleдля голосования 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`
Кевин Круйссен
источник
0

Общий Лисп 49 байтов

Решение:

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

Попробуйте онлайн

Объяснение:

(defun c(o v)
  (abs (- o (/ (reduce '+ v) (length v)))))
  • Reduce применяет функцию ко всем элементам списка (в данном случае +)
  • отдых - это просто базовая функция, abs (o - mean (v))
Дэвид Хорак
источник
0

Pyth, 4 байта

aE.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)

Ввод в формате:

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

с массивом голосов первым, а кандидат - вторым.

Попробуйте онлайн!

RK.
источник