Wie viele Stimmen bekommt ein Staat?

9

Bei einer Liste der Bevölkerungsgruppen jedes Staates wird die Anzahl der Stimmen, die dieser Staat im Wahlkollegium erhält, vom größten bis zum kleinsten ausgegeben.

Eingabe: Die erste Zahl gibt die Gesamtzahl der zu verteilenden Stimmen an. Es folgt eine Liste und Populationen. In diesem Beispiel werden Abkürzungen für Status verwendet, es kann jedoch auch ein Name verwendet werden, der Groß- und Kleinbuchstaben enthält. Sie können dies in einem beliebigen Format verwenden, sofern nur die Abkürzung des Staates und seine Grundgesamtheit enthalten sind.

Die Eingabe kann als Argument für eine Funktion oder auf eine beliebige Weise verwendet werden.

Beispiel (mögliche) Eingabe: 538 [[CA 38000000], [NH 1300000] etc.]

Ausgabe: Gibt in einem bestimmten Format die Anzahl der Stimmen aus, die jeder Staat erhält. Ordnen Sie die Staaten vom größten zum kleinsten. Wenn zwei Staaten die gleiche Anzahl von Stimmen haben, ordnen Sie nach dem Namen, der in einem Wörterbuch an erster Stelle steht (der alphabetisch an erster Stelle steht).

Bevor Sie die Anzahl der Stimmen ermitteln, überprüfen Sie zunächst, ob in der Liste der Eingaben ein Bundesstaat mit dem Namen DC vorhanden ist, und geben Sie dem Bundesstaat, falls vorhanden, unabhängig von seiner Bevölkerungszahl 3 Stimmen. Entfernen Sie es dann aus der Liste und weisen Sie den Rest der Stimmen zu, als ob DC nicht vorhanden wäre.

Die Anzahl der Stimmen im Wahlkollegium ist definiert als die Summe der Anzahl der Senatoren und Vertreter. Jeder Staat erhält zwei Senatoren. Subtrahieren Sie also die doppelte Anzahl von Staaten von der Gesamtzahl (538 in der Beispieleingabe), um die Anzahl der Vertreter zu erhalten. Weisen Sie jedem Staat einen Vertreter zu, um zu beginnen. Führen Sie dann den folgenden Vorgang aus:

  1. Weisen Sie jedem Bundesstaat eine Nummer zu, Adefiniert als P/sqrt(2)wo Psich die Bevölkerung befindet.

  2. Sortieren Sie die Zustände nach ihren Werten von A.

  3. Weisen Sie dem ersten Staat (dem mit dem größten A) einen weiteren Vertreter zu.

  4. Weisen Sie die Werte von Aas neu zu A = P/(sqrt(n)*sqrt(n + 1)), wobei ndie aktuelle Anzahl der dem Staat zugewiesenen Vertreter ist.

  5. Fahren Sie mit Schritt 2 fort. Wiederholen Sie diesen Vorgang, bis alle Vertreter aufgebraucht sind.

Beispiel (mögliche) Ausgabe : {CA: 518, NH: 20}. Die Ausgabe muss nicht in diesem Format vorliegen, sondern muss dieselben Informationen enthalten.

Beachten Sie, dass Sie 3*(# of states)drucken können, was immer Sie möchten , wenn es nicht möglich ist, Stimmen legal zuzuweisen, da weniger als Stimmen vorhanden sind . Sie können abstürzen, einen Fehler auslösen usw.

Testfälle:

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
soktinpk
quelle
Nachdem die erwartete Ausgabe Überprüfung und meinen Code mit ihm zu vergleichen, den Schritt, der sagt „Umhang Werte A, wie A = P/(sqrt(n)*sqrt(n + 1)), wo nist die aktuelle Anzahl der Mitglieder in den Zustand zugewiesen.“ sollte in "Werte neu zuweisen von A, as A = P/(sqrt(n)*sqrt(n + 1)), wo nist die aktuelle Anzahl der dem Staat zugewiesenen Vertreter " geändert werden . Das hat mich umgehauen.
Patrick Roberts
Was soll passieren, wenn die Anzahl der Staaten mehr als die Hälfte der Stimmen beträgt?
msh210

Antworten:

3

Sauber , 263 244 222 Bytes

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)

Rufen Sie an wie

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

Ungolfed Version, Vollprogramm ( 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)

quelle
2

JavaScript ES6, 249 Bytes 244 Bytes

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

Testfälle

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>'
);

Dank an @Neil für das Speichern von 5 Bytes!

Patrick Roberts
quelle
.some((t,i)=>t.a=t.p/q(++t.r)/q(t.r+1))würde Ihnen ein Byte sparen, wenn es funktioniert.
Neil
@Neil Das macht nicht das Gleiche. Der Punkt ist, dass der 0. Index der einzige ist, dessen repräsentatives Attribut rjedes Mal erhöht wird.
Patrick Roberts
Deshalb habe ich verwendet .someund nicht .map.
Neil
Oh ja, 5 Bytes, weil du ikeine mehr verwendest. Nett!
Neil
@Neil Ich habe gerade festgestellt, dass dies für ein Szenario mit einer Zustandsbevölkerung von 0 nicht funktionieren würde. Aktualisierung auf alternative Lösung mit äquivalenten Bytes.
Patrick Roberts
1

Python 2, 219 Bytes

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)

Nimmt Eingabe als

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

Drucke:

[('M', 241), ('L', 140), ('K', 39)]
TFeld
quelle
Ich fand es immer lustig, dass das Schreiben eines vollständigen Programms in Python fast immer weniger Bytes als das Schreiben einer Funktion ist, da Einrückungen ein obligatorischer Bestandteil der Syntax sind.
Patrick Roberts