Quanti voti ottiene uno stato?


9

Dato un elenco delle popolazioni di ogni stato, ha prodotto, dal più grande al meno, il numero di voti che lo stato ottiene nel collegio elettorale.

Input: il primo numero rappresenta il numero totale di voti da distribuire; è seguito da un elenco di e popolazioni. In questo esempio, vengono utilizzate abbreviazioni per stati, ma è possibile utilizzare qualsiasi nome contenente lettere maiuscole e minuscole. Puoi prenderlo in qualsiasi formato desideri, a condizione che l'unica informazione contenuta sia l'abbreviazione dello stato e la sua popolazione.

L'input può essere preso come argomento per una funzione o come desiderato.

Esempio (possibile) input: 538 [[CA 38000000], [NH 1300000] etc.]

Output: output, in alcuni formati, il numero di voti ottenuti da ogni stato. Ordina gli stati dal più grande al meno. Se due stati hanno lo stesso numero di voti, ordina secondo il nome che verrebbe per primo in un dizionario (che viene prima in ordine alfabetico).

Prima di trovare il numero di voti, controlla se esiste uno stato denominato DC nell'elenco degli input e, in tal caso, assegna allo stato 3 voti, indipendentemente dalla sua popolazione. Quindi, rimuovilo dall'elenco e assegna il resto dei voti come se DC non esistesse.

Il numero di voti nel collegio elettorale è definito come la somma del numero di senatori e rappresentanti. Ogni stato riceve due senatori, quindi sottrai il doppio del numero di stati dal totale (538, nell'input di esempio) per ottenere il numero di rappresentanti. Assegna a ogni stato un rappresentante per iniziare. Quindi, eseguire il seguente processo:

  1. Assegna a ogni stato un numero, Adefinito come P/sqrt(2)dove si Ptrova la popolazione.

  2. Ordinare gli stati in base ai loro valori di A.

  3. Assegna al primo stato (quello con il più grande A) un altro rappresentante.

  4. Riassegna i valori di A, as A = P/(sqrt(n)*sqrt(n + 1)), dove nè il numero corrente di rappresentanti assegnati allo stato.

  5. Tornare al passaggio 2. Ripetere fino a quando tutti i rappresentanti si sono esauriti.

Esempio (possibile) uscita: {CA: 518, NH: 20}. L'output non deve essere in questo formato, ma deve contenere le stesse informazioni.

Tieni presente che se non è possibile assegnare legalmente voti perché sono presenti meno 3*(# of states)voti, stampa quello che vuoi. È possibile arrestarsi in modo anomalo, generare un errore, ecc.

Casi test:

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

Dopo aver verificato l'output previsto e aver confrontato il mio codice con esso, il passaggio che dice "Riassegna valori di A, come A = P/(sqrt(n)*sqrt(n + 1)), dove nè il numero corrente di membri assegnati allo stato". dovrebbe essere modificato in "Riassegna valori di A, come A = P/(sqrt(n)*sqrt(n + 1)), dove si ntrova il numero corrente di rappresentanti assegnati allo stato". Questo mi ha buttato via.
Patrick Roberts,

Cosa dovrebbe accadere se il numero di stati è superiore alla metà del numero di voti?
msh210

Risposte:


3

Pulito , 263 244 222 byte

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)

Chiama come

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

Versione non golfata, programma completo ( 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 byte 244 byte

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

Casi test

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

Ringraziamenti a @Neil per aver salvato 5 byte!


.some((t,i)=>t.a=t.p/q(++t.r)/q(t.r+1))ti farebbe risparmiare un byte se funziona.
Neil,

@Neil Questo non fa la stessa cosa. Il punto è che l'indice 0 è l'unico il cui attributo rappresentativo rviene incrementato ogni volta.
Patrick Roberts,

Ecco perché l'ho usato .somee non .map.
Neil,

Oh, sì, 5 byte, perché non li usi ipiù. Bello!
Neil,

@Neil Ho appena capito che non avrebbe funzionato per uno scenario in cui la popolazione dello stato è 0. Aggiornamento alla soluzione alternativa con byte equivalenti.
Patrick Roberts,

1

Python 2, 219 byte

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)

Accetta input come

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

stampe:

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

Ho sempre trovato divertente come scrivere un programma completo in Python sia quasi sempre meno byte che scrivere una funzione perché il rientro è una parte obbligatoria della sintassi.
Patrick Roberts,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.