[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