[pyar] ayuda con un algoritmo, o algo.
John Rowland Lenton
john.lenton en canonical.com
Vie Feb 3 13:11:09 ART 2012
On Fri, 03 Feb 2012 14:27:32 +0000, John Rowland Lenton <john.lenton en canonical.com> wrote:
>
> al final, después de mirar las soluciones de darni y lucio, y habiendo
> podido mejorar en mi cabeza lo que necesitaba gracias a tener que
> explicárselos, lo que voy a hacer es
>
> def selector(lengths, weights):
> output = [l*w for (l, w) in zip(lengths, weights)]
> output = [int(ceil(i*10/sum(output))) for i in output]
> output.reverse()
> while sum(output) > 10:
> i = output.index(max(output))
> output[i] -= 1
> output.reverse()
> return output
>
> el doble reverse es opcional y esto haría lo que necesito sin eso; es un
> "tweak" extra que pueden ignorar si quieren (y que solamente sirve si
> los pesos están ordenados).
>
> Muchas gracias!
lucio me señaló que este tiene un bug, que si le das una entrada de [10,
1, 1] con pesos [.2, .4, .2] la salida es [6, 2, 2], es decir,
selecciona más elementos de los que tienen las listas de entrada.
Además, corriéndole pruebas, tiene un problema cuando la entrada es
todos ceros.
Esto se arregla como sigue:
def selector(lengths, weights):
if not any(lengths):
return lengths
output = [l*w for (l, w) in zip(lengths, weights)]
output = [min(int(ceil(i*10/sum(output))), l)
for (l, i) in zip(lengths, output)]
sl = sum(lengths)
so = sum(output)
if sl >= 10 or (so < sl < 10):
m = min(sl, 10)
while so < m:
d = [l-i for (l, i) in zip(lengths, output)]
output[d.index(max(d))] += 1
so = sum(output)
if so > 10:
output.reverse()
while sum(output) > 10:
output[output.index(max(output))] -= 1
output.reverse()
return output
hmm. Capaz un comentario en el código le venga bien, no?
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: application/pgp-signature
Size: 489 bytes
Desc: no disponible
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20120203/df21f966/attachment.sig>
More information about the pyar
mailing list