¿Cuántos votos obtiene un estado?

9

Dada una lista de las poblaciones de cada estado, el resultado, de mayor a menor, es el número de votos que ese estado obtiene en el colegio electoral.

Entrada: El primer número representa el número total de votos para distribuir; es seguido por una lista de y poblaciones. En este ejemplo, se usan abreviaturas para estados, pero se puede usar cualquier nombre que contenga letras mayúsculas y minúsculas. Puede tomar esto en cualquier formato que desee, siempre que la única información contenida sea la abreviatura del estado y su población.

La entrada puede tomarse como argumentos para una función, o de la manera que desee.

Ejemplo de entrada (posible): 538 [[CA 38000000], [NH 1300000] etc.]

Salida: Salida, en algún formato, el número de votos que obtiene cada estado. Ordena los estados de mayor a menor. Si dos estados tienen el mismo número de votos, ordene por el nombre que aparezca primero en un diccionario (que aparece primero alfabéticamente).

Antes de encontrar el número de votos, primero verifique si hay un estado llamado DC en la lista de entradas, y si lo hay, otorgue al estado 3 votos, independientemente de su población. Luego, elimínelo de la lista y asigne el resto de los votos como si DC no existiera.

El número de votos en el colegio electoral se define como la suma del número de senadores y representantes. Cada estado tiene dos senadores, así que reste dos veces el número de estados del total (538, en la entrada de ejemplo) para obtener el número de representantes. Asigne a cada estado un representante para comenzar. Luego, realice el siguiente proceso:

  1. Asigne a cada estado un número, Adefinido para ser P/sqrt(2)dónde Pestá la población.

  2. Ordenar los estados según sus valores de A.

  3. Asigne el primer estado (el que tenga el más grande A) un representante más.

  4. Reasigne valores de A, como A = P/(sqrt(n)*sqrt(n + 1)), donde nes el número actual de representantes asignados al estado.

  5. Vuelva al paso 2. Repita hasta que todos los representantes se hayan agotado.

Ejemplo (posible) de salida: {CA: 518, NH: 20}. La salida no tiene que estar en este formato, pero debe contener la misma información.

Tenga en cuenta que si no es posible asignar votos legalmente porque hay menos de 3*(# of states)votos, imprima lo que quiera. Puede bloquearse, lanzar un error, etc.

Casos de prueba:

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
fuente
Después de verificar el resultado esperado y comparar mi código con él, el paso que dice "Reasignar valores de A, como A = P/(sqrt(n)*sqrt(n + 1)), donde nes el número actual de miembros asignados al estado". debe cambiarse a "Reasignar valores de A, como A = P/(sqrt(n)*sqrt(n + 1)), donde nes el número actual de representantes asignados al estado". Eso me echó.
Patrick Roberts el
¿Qué debería pasar si el número de estados es más de la mitad del número de votos?
msh210

Respuestas:

3

Limpio , 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)

Llamar como

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

Versión sin golf, programa 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)

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

Casos de prueba

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

¡Crédito a @Neil por ahorrar 5 bytes!

Patrick Roberts
fuente
.some((t,i)=>t.a=t.p/q(++t.r)/q(t.r+1))te ahorraría un byte si funciona.
Neil
@Neil Eso no hace lo mismo. El punto es que el índice 0 es el único cuyo atributo representativo rse incrementa cada vez.
Patrick Roberts el
Por eso solía .somey no .map.
Neil
Oh, sí, 5 bytes, porque ya no usas imás. ¡Agradable!
Neil
@Neil Me acabo de dar cuenta de que esto no funcionaría para un escenario en el que la población del estado es 0. Actualización a una solución alternativa con bytes equivalentes.
Patrick Roberts el
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)

Toma entrada como

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

Huellas dactilares:

[('M', 241), ('L', 140), ('K', 39)]
TFeld
fuente
Siempre me pareció curioso cómo escribir un programa completo en Python es casi siempre menos bytes que escribir una función debido a que la sangría es una parte obligatoria de la sintaxis.
Patrick Roberts