Bir devlet kaç oy alır?


9

Her devletin nüfusunun bir listesi göz önüne alındığında, devletin seçim kolejinde aldığı oyların sayısı en azdan en azına çıkar.

Girdi: İlk sayı dağıtılacak toplam oy sayısını temsil eder; arkasından bir popülasyon ve liste gelir. Bu örnekte, durumlar için kısaltmalar kullanılmıştır, ancak büyük ve küçük harfler içeren herhangi bir ad kullanılabilir. İçerdiği tek bilgi eyaletin kısaltması ve nüfusu olduğu sürece bunu istediğiniz formatta alabilirsiniz.

Girdi, bir işleve bağımsız değişken olarak veya istediğiniz şekilde alınabilir.

Örnek (olası) giriş: 538 [[CA 38000000], [NH 1300000] etc.]

Çıktı: Çıktı, bir biçimde, her durumun aldığı oy sayısı. Devletleri büyükten küçüğe sıralayın. İki eyalette aynı sayıda oy varsa, sözlükte hangi isme göre birinci olursa (alfabetik olarak önce gelir).

Oy sayısını bulmadan önce, girişler listesinde DC adında bir devlet olup olmadığını kontrol edin ve varsa nüfusa bakılmaksızın devlete 3 oy verin. Ardından, listeden kaldırın ve geri kalan oyları DC yokmuş gibi atayın.

Seçim yüksekokulundaki oyların sayısı senatör ve temsilci sayısının toplamı olarak tanımlanır. Her eyalet iki senatör alır, bu yüzden temsilci sayısını almak için toplamdan iki kez eyalet sayısının (örnek girdide 538) çıkarılması. Başlamak için her eyalete bir temsilci atayın. Ardından, aşağıdaki işlemi gerçekleştirin:

  1. Her duruma , nüfusun nerede olduğu Aolarak tanımlanan bir sayı atayın .P/sqrt(2)P

  2. Durumları değerlerine göre sıralayın A.

  3. İlk durumu (en büyük Aolanı) bir temsilci daha atayın .

  4. Eyalete atanan geçerli temsilci sayısının değerini olduğu Agibi yeniden atayın .A = P/(sqrt(n)*sqrt(n + 1))n

  5. 2. adıma geri dönün. Tüm temsilciler bitene kadar tekrarlayın.

Örnek (mümkün olduğunda) çıkışı: {CA: 518, NH: 20}. Çıktının bu biçimde olması gerekmez, ancak aynı bilgileri içermesi gerekir.

Oyların daha az olması nedeniyle oyları yasal olarak atamanız mümkün değilse 3*(# of states), istediğinizi yazdırın. Çökebilir, hata verebilir vb.

Test senaryoları:

538 [['CA' 38000000], ['NH' 1300000]] --> CA: 518, NH: 20
538 [['NH' 1300000], ['CA' 38000000]] --> CA: 518, NH: 20 (must be in order from greatest to least!)
538 [['DC' 1000000], ['RH' 1]] --> RH: 535, DC: 3
100 [['A', 12], ['B', 8], ['C', 3]] --> A: 51, B: 35, C: 14
100 [['A', 12], ['B', 8], ['C', 3], ['D', 0]]: --> [49, 34, 14, 3] (yes, even states with no population get votes)
2 [['A', 1]] --> aasdfksjd;gjhkasldfj2fkdhgas (possible output)
12 [['A', 1], ['B', 2], ['C', 3], ['D', 4]] --> A: 3, B: 3, C: 3, D: 3
42 [['K', 123], ['L', 456], ['M', 789]] --> M: 23, L: 14, K: 5
420 [['K', 123], ['L', 456], ['M', 789]] --> M: 241, L: 140, K: 39
135 [['C', 236841], ['D', 55540], ['G', 70835], ['K', 68705], ['M', 278514], ['Ms', 475327], ['Nh', 141822], ['Nj', 179570], ['Ny', 331589], ['Nc', 353523], ['P', 432879], ['R', 68446], ['Sc', 206236], ['Ve', 85533], ['Vi', 630560]] --> Vi: 20, Ms: 16, P: 14, Nc: 12, Ny: 12, M: 10, C: 9, Sc: 8, Nj: 7, Nh: 6, Ve: 5, D: 4, G: 4, K: 4, R: 4

Diyor adımı beklenen çıkışı kontrol ve onunla kodumu karşılaştırarak sonra "nin yeniden atama değerleri Aolarak, A = P/(sqrt(n)*sqrt(n + 1))nerede, ndevlete tahsis üyelerin güncel sayıdır." " Eyalete atanan mevcut temsilci sayısı nerede olduğu Agibi değerlerini yeniden ata" olarak değiştirilmelidir . Bu beni attı. A = P/(sqrt(n)*sqrt(n + 1))n
Patrick Roberts

Eyalet sayısı oy sayısının yarısından fazlaysa ne olur?
msh210

Yanıtlar:


3

Temiz , 263 244 222 bayt

v n s=sortBy(\(a,b)(c,d).b>d)([(t,3.0)\\t<-s|fst t=="DC"]++w(n-3*(length s))[(t,1.0)\\t<-s|fst t<>"DC"])
w 0s=w 0 s=[(p,r+2.0)\\(p,r)<-s]
w n s#s=sortBy(\a b.A a>A b)s
#(p,r)=hd s
=w(n-1)[(p,r+1.0):tl s]
A((_,p),r)=p/sqrt(r*r+r)

Şunun gibi ara

Start = v 538 [("DC", 1000000.0), ("RH", 1.0)]

Ungolfed sürümü, tam program ( census.icl):

module census

import StdEnv

Start = votes 538 [("DC", 1000000.0), ("RH", 1.0)]

votes n states
# dc = filter (((==)"DC")o fst) states
= sortBy (\(a,b)(c,d).b>d) ([(t,3.0) \\ t <- dc] ++ votes` (n-3*length states) [(t,1.0)\\t<-removeMembers states dc])
where
    votes` 0 states = map (\(p,r).(p,r+2.0)) states
    votes` n states
    # states = sortBy (\a b.A a > A b) states
    # (p,r) = hd states
    = votes` (n-1) [(p,r+1.0):tl states]

    A ((_,p),r) = p / sqrt(r*r+r)

2

JavaScript ES6, 249 bayt 244 bayt

(r,s)=>{r-=s.length*3;s=s.map(t=>({s:t[0],p:t[1],a:t[1]/(q=Math.sqrt)(2),r:1}));while(r--)(t=>t.a=t.p/q(++t.r)/q(t.r+1))(s.filter(t=>t.s!='DC').sort((a,b)=>b.a-a.a)[0]);return''+s.sort((a,b)=>(r=b.r-a.r)?r:a.s>b.s?1:-1).map(t=>t.s+':'+(t.r+2))}

Test senaryoları

d = (r, s) => {
  r -= s.length * 3;
  s = s.map(t => ({
    s: t[0],
    p: t[1],
    a: t[1] / (q = Math.sqrt)(2),
    r: 1
  }));
  while (r--)(t => t.a = t.p / q(++t.r) / q(t.r + 1))(s.filter(t => t.s != 'DC').sort((a, b) => b.a - a.a)[0]);
  return '' + s.sort((a, b) => (r = b.r - a.r) ? r : a.s > b.s ? 1 : -1).map(t => t.s + ':' + (t.r + 2))
};

document.write(
  '<pre>' +
  d(135, [
    ['C', 236841],
    ['D', 55540],
    ['G', 70835],
    ['K', 68705],
    ['M', 278514],
    ['Ms', 475327],
    ['Nh', 141822],
    ['Nj', 179570],
    ['Ny', 331589],
    ['Nc', 353523],
    ['P', 432879],
    ['R', 68446],
    ['Sc', 206236],
    ['Ve', 85533],
    ['Vi', 630560]
  ]) +
  '</pre>'
);

5 bayt tasarrufu için @Neil'e teşekkür ederiz!


.some((t,i)=>t.a=t.p/q(++t.r)/q(t.r+1))çalışırsa size bir bayt kazandırır.
Neil

@Neil Bu aynı şeyi yapmaz. Mesele şu ki, 0. indeks temsili niteliği rher seferinde artırılan tek endekstir .
Patrick Roberts

Bu yüzden kullandım .someve kullanmadım .map.
Neil

Oh, evet, 5 bayt, çünkü artık kullanmıyorsun i. Güzel!
Neil

@Neil Bu durumun, devlet nüfusunun 0 olduğu bir senaryo için işe yaramayacağını fark ettim.
Patrick Roberts

1

Python 2, 219 bayt

v,s=input()
n={k:1 for k in s}
v-=3*len(s)
l=lambda x:-x[1]
if'DC'in s:del s['DC']
while v:A,_=sorted([(a,s[a]/(n[a]**2+n[a])**.5)for a in s],key=l)[0];n[A]+=1;v-=1
for a in n:n[a]+=2
print sorted(list(n.items()),key=l)

Girdiyi şu şekilde alır

420,{'K':123,'L':456,'M':789}

Baskılar:

[('M', 241), ('L', 140), ('K', 39)]

Python'da tam bir program yazmanın, sözdiziminin zorunlu bir parçası olması nedeniyle bir işlev yazmaktan neredeyse her zaman daha az bayt olduğunu her zaman komik buldum.
Patrick Roberts
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.