Aqui está um rápido desafio de segunda-feira de manhã ...
Escreva uma função ou programa no menor número de bytes que:
- Toma como entrada uma lista de
[x,y]
coordenadas - Toma como entrada uma lista das
[x,y]
respectivas massas das coordenadas - Emite o centro de massa calculado na forma de
[xBar,yBar]
.
Nota:
- A entrada pode ser obtida de qualquer forma, desde que uma matriz seja usada.
O centro de massa pode ser calculado pela seguinte fórmula:
Em inglês simples...
- Para encontrar
xBar
, multiplique cada massa por sua respectiva coordenada x, some a lista resultante e divida-a pela soma de todas as massas. - Para encontrar
yBar
, multiplique cada massa pela respectiva coordenada y, some a lista resultante e divida-a pela soma de todas as massas.
Exemplo de Trivial Python 2.7:
def center(coord, mass):
sumMass = float(reduce(lambda a, b: a+b, mass))
momentX = reduce(lambda m, x: m+x, (a*b for a, b in zip(mass, zip(*coord)[0])))
momentY = reduce(lambda m, y: m+y, (a*b for a, b in zip(mass, zip(*coord)[1])))
xBar = momentX / sumMass
yBar = momentY / sumMass
return [xBar, yBar]
Casos de teste:
> center([[0, 2], [3, 4], [0, 1], [1, 1]], [2, 6, 2, 10])
[1.4, 2.0]
> center([[3, 1], [0, 0], [1, 4]], [2, 4, 1])
[1.0, 0.8571428571428571]
Isso é código-golfe, então o menor número de bytes vence!
[x,y,m],[x,y,m]...
:?
[(x1,y1,m1), (x2,y2,m2)]
, por exemplo, uma lista de tuplas? Ou não importa se os argumentos são tuplas, listas ou matrizes? Que tal três listas / matrizes?