Oylamanın C faktörünü bulun


11

Bu mücadelede, C-faktörü denilen bir sayıyı bularak, bir oylamanın ne kadar tartışmalı olduğunu belirleyeceksiniz. İstediğiniz C faktörü nedir?

Bir seçimde birden fazla oyunuz olduğunu düşünün. Biz kullanacağız 1ve 0meydan uğruna bir seçimde iki farklı adayları temsil etmek. Örnek seçimlerimizde on oy var:

0110111011

Şimdi, aday için herhangi bir oylamanın C faktörünü bulmak istediğimizi varsayalım 0. Bunu aşağıdaki işlevle yapabiliriz:

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

In , biz C-faktörünü belirlemek istiyoruz oy ve oyların bir dizidir. Yani, fonksiyonumuzu kullanarak, aday için herhangi bir oyun C faktörünü elde etmek için :fov0

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

Daha düşük bir C faktörü, oylamanın diğer oylara kıyasla daha az tartışmalı olduğunu göstermektedir. Dolayısıyla, bir adayın oyu 0, diğer oylardan aday için bir oydan daha farklıdır 1. Buna karşılık, bir aday 1oy için C faktörü , bu yüzden diğer oylara daha çok benzediği için daha az tartışmalıdır.0.3

Meydan okuma

Bir oylamanın sonuçları verildiğinde bir oylamanın C faktörünü belirlemek için fonksiyonunu yazın .f(o,v)ov

  • o0veya bir tamsayı olmalıdır 1.

  • v sıfır ve onlardan oluşan rastgele uzunluktaki bir dizi (veya dil özelliklerine bağlı olarak benzer bir kap tipi) olmalıdır.

  • Fonksiyon, yukarıdaki formülü veya değiştirilmiş bir yöntemi kullanarak fonksiyon parametreleri verildiğinde ortaya çıkan C faktörünü konsola döndürmeli veya yazdırmalıdır.

İyi şanslar! En az bayt kazanır (kazanan beş günde seçilir).


Örneğinizde mean(v)0,7'ye eşit değil mi?
HyperNeutrino

@HyperNeutrino Evet. Sorun nedir?
connectyourcharger

Nasıl abs(0 - 0.7)eşittir 0.3?
HyperNeutrino

Ah. Örnek düzeltildi. İki sayıyı tersine
çevirdim

Tamam. Açıkladığınız için teşekkürler!
HyperNeutrino

Yanıtlar:


6

Jöle , 3 bayt

ạÆm

Çevrimiçi deneyin!

Kelimenin tam anlamıyla "demek için mutlak fark".

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

Argümanları ters çevirirseniz atomları tersine çevirebilirsiniz.


10

R , 23 bayt

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

Çevrimiçi deneyin!

Zorluk v, o(yani mean(xor(o,v))) ' den farklı değerlerin oranını hesaplamakla ilgilidir . Bu nedenle kullanmaktan kaçınabiliriz abs.


2
Ayrıca keyfi oylama temsilleri için çalışır.
CriminallyVulgar

6

APL (Dyalog Unicode) , 9 8 5 bayt

≠⌹⊢=⊢

Çevrimiçi deneyin!

Anonim tren. Kaydedilen bir bayt için @ Adám'a ve 3 bayt için @ ngn'ye teşekkürler!

Nasıl:

≠⌹⊢=⊢  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. ipucu ile yapabilirsiniz: ⌹
ngn


3

05AB1E , 3 bayt

ÅAα

Çevrimiçi deneyin!


2
Önceleri ben çok geç Siparişim farklı olsa idi .. 30 saniye değilim αardından ÅA; p
Kevin Cruijssen

2
@KevinCruijssen Çözümünüzün gerçek zamanlı olarak geldiğini izledim, yorum yapmaya başladım ve hepsi yaklaşık 30 saniye içinde silindi. Neşeli!
connectyourcharger

@KevinCruijssen İki siparişin aynı şekilde nasıl çalıştığını gerçekten anlamıyorum ... :-) 05AB1E bilgim çok iyi değil
Luis Mendo

1
@KevinCruijssen Ah, anlıyorum. Beni şaşırtan şey, iki yaklaşımın rasgele sayılar için farklı sonuçlar vermesidir; ancak 0/1 girişler için aynı fikirde görünüyorlar. Örnek
Luis Mendo

2
@LuisMendo Ah, evet, gerçekten haklısın. Birkaç başka tamsayı ile test ettim, ancak bunlar siparişten bağımsız olarak aynı sonuçları verdi (ancak 0.8 olan test durumunuz gerçekten farklı). Girdi 0/ öğesinden başka bir şey içeriyor olsaydı, 1ilk önce ortalamayı alma yaklaşımınız ve ardından mutlak fark, meydan okuma açıklamasındaki formülle karşılaştırdığımızda doğrudur. Sadece 0s / 1s ile bazı alternatif 3 byter'lar da mümkündür ÊÅA.
Kevin Cruijssen


2

Ataşesi , 11 8 bayt

Mean@`/=

Çevrimiçi deneyin! Gibi argümanlar alır f[o, v].

Çok orijinal bir şey yok.

Alternatif yaklaşımlar

11 bayt: Average@`/=

11 bayt: ${1-x~y/#y} sayar oluşumları xiçinde yuzunluğuna bölünmesi yve sonra o çıkarır 1.

11 bayt: {1-_2~_/#_} (Bunun için argümanlar ters çevrilir)

15 bayt: ${Sum[x/=y]/#y} Yukarıdakilerin daha açık bir sürümü, onsuz Average.



1

Proton , 26 bayt

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

Çevrimiçi deneyin!

Proton daha iyi hassasiyet için normal Python numaraları yerine sympy kullandığından, çıktı bir kesirdir.

(-7 bayt; abs-diff ortalama abs-diff ortalamasından daha kısadır; aslında aptalım)

Rod sayesinde -1 bayt


@ Çubuk 1/0 giriş kısıtlaması için nasıl optimize edileceğini anlamaya çalışıyordum ama başarısız oldu. Teşekkürler!
HyperNeutrino

1

Perl 6 , 20 bayt

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

Çevrimiçi deneyin!

* X!= *iki argümanının eşit olmayan çapraz ürününü alan anonim bir fonksiyondur. Bir dizi Boolean üretir; örneğin, olarak 1 X!= (1, 0, 1)değerlendirir (False, True, False).

{ @_.sum / @_ }argümanlarının ortalamasını döndüren başka bir anonim işlevdir. Boolean sayısal olarak ve olarak Truedeğerlendirir .1False0

oOperatör birine bu iki işlevi oluşturur.


1

Enlist , 3 bayt

nÆm

Çevrimiçi deneyin!

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

Dil, Jelly'den, Jelly'in kendi kodumla nasıl ayrıştırıldığının yapısını yeniden yaratmayı denemeye çalıştığım noktaya kadar çok büyük bir ilham kaynağı oldu.

Bay Xcoder sayesinde -1 bayt


Sen kullanabilirsiniz nyerine _...A1 (kaydetmek için çevrimiçi deneyin! ).
Bay Xcoder

@ Mr.Xcoder Ooh güzel. Evet bu lol yaptıktan sonra! = Hile fark ettim. Teşekkürler!
HyperNeutrino

1

Retina 0.8.2 , 27 bayt

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

Çevrimiçi deneyin! Kesir çıkarır. Açıklama: Birinci grup oher girişi yakalar ve ikinci grup yakalar v, koşullu ise üçüncü grubun yalnızca oy farklı olmadığında yakalanmasını sağlar. $#İstediğiniz gibi inşaat sonra ilgili yakalar sayısını döndürür.








0

Java 8, 47 bayt

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

Çevrimiçi deneyin.

Veya alternatif olarak:

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

Çevrimiçi deneyin.

Her ikisi için girişler bir olan Supplier<DoubleStream>oyların listesi için vve doubleoy için o.

Açıklama:

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

Ortak Lisp 49 bayt

Çözüm:

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

Çevrimiçi deneyin

Açıklama:

(defun c(o v)
  (abs (- o (/ (reduce '+ v) (length v)))))
  • reduce, tüm liste öğelerine bir işlev uygular (+ bu durumda)
  • dinlenme sadece temel işlevdir, abs (o - ortalama (v))


0

Pyth, 4 bayt

aE.O

Açıklama:

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

Girdi şu biçimde:

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

önce oy dizisi ve ikinci aday.

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.