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!
code-golf
arithmetic
array-manipulation
Mr Public
fonte
fonte
[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?Respostas:
MATL ,
65 bytesO formato de entrada é um vetor de linha com as massas e, em seguida, uma matriz de duas colunas com as coordenadas (nas quais espaços ou vírgulas são opcionais).
Primeiro exemplo:
Segundo exemplo:
Experimente online!
Explicação
Vamos
m
denotar o vetor de massas (primeira entrada) ec
a matriz de coordenadas (segunda entrada).fonte
y
é bastante útil !! +1Mathematica, 10 bytes
Exemplo:
fonte
Dot
. Mas depois de ver seu uso acima!Mathcad, 19 "bytes"
Como o Mathcad usa um "quadro branco" 2D e operadores especiais (por exemplo, operador de soma, operador integral) e salva em um formato XML, uma planilha real pode conter várias centenas (ou mais) de caracteres. Para os fins do Code Golf, consideramos uma "contagem de bytes" do Mathcad o número de caracteres ou operadores que o usuário deve inserir para criar a planilha.
A primeira versão (programa) do desafio ocupa 19 "bytes" usando esta definição e a versão da função ocupa 41 "bytes".
fonte
MATLAB / Oitava,
1816 bytesObrigado ao usuário beaker e Don Muesli por remover 2 bytes!
Dado que as coordenadas estão em uma
N x 2
matrizx
onde a primeira coluna é a coordenada X e a segunda coluna é a coordenada Y, e as massas estão em uma1 x N
matrizy
(ou um vetor de linha):A explicação desse código é bastante direta. Esta é uma função anônima que recebe as duas entradas
x
ey
. Realizamos a soma ponderada (a expressão numeradora de cada coordenada) em uma abordagem de álgebra linear usando a multiplicação de vetores matriciais. Ao pegar o vetory
de massas e multiplicá-lo pela matriz de coordenadasx
pela multiplicação de vetores de matriz, você calcularia a soma ponderada de ambas as coordenadas individualmente, depois dividimos cada uma dessas coordenadas pela soma das massas, encontrando o centro desejado de massa retornada como um vetor de 1 x 2 linhas para cada coordenada, respectivamente.Execuções de exemplo
Experimente online!
https://ideone.com/BzbQ3e
fonte
;
, e também'
escolhendo adequadamente formato de entrada (x
como vetor linha)Gelatina, 6 bytes
ou
A entrada é feita por meio de dois argumentos de linha de comando, massa primeiro, coordenada segundo.
Experimente online!
Explicação
ou
fonte
Julia,
2517 bytesPerdeu a abordagem óbvia: / Ligue como
f([3 1;0 0;1 4], [2 4 1])
.fonte
CJam, 14 bytes
Uma função sem nome com espera a lista de pares de coordenadas e a lista de massas na pilha (nessa ordem) e deixa o centro de massa em seu lugar.
Teste aqui.
Explicação
fonte
Perl 6,
363330 bytesfonte
Sério, 16 bytes
Toma entrada como
[x-coords]\n[y-coords]\n[masses]
e sai comoxbar\nybar
Experimente online!
Explicação:
fonte
Haskell,
5550 bytesIsso define uma função binária
f
, usada da seguinte maneira:Veja passar nos dois casos de teste.
Explicação
Haskell não é adequado para o processamento de listas multidimensionais, por isso estou pulando por aqui. A primeira linha define um alias curto para o
zipWith
qual precisamos duas vezes. Basicamente,f
é uma função que pega a lista de pesosa
e produzf a
, uma função que pega a lista de posições e produz o centro de massa.f a
é uma composição de três funções:fonte
JavaScript (ES6), 60 bytes
Aceita uma matriz de (x, y, massa) "triplica" e retorna uma "tupla".
fonte
[x,y,m]
necessários? iirc, eles não são necessários se houver apenas um argumento de entrada para a função de seta.R,
32bytes 25editar -7 bytes por mudar para álgebra matricial (obrigado @ Sp3000 resposta Julia)
passa uma matriz (matriz com 2 colunas, x, y) como coordenadas e vetor
m
de pesos, retorna uma matriz com as coordenadas necessáriasfonte
PHP, 142 bytes
Vista expandida Entrada necessária RetornaArray: [ xbar, ybar ]
A
p()
função é um mapa básico, multiplicando cada[m]
valor pelo valor[x]
ou correspondente[y]
. Ac()
função recebeArray[Array]
, apresenta as funçõesarray_sum
earray_map
para o espaço e depois calculaΣmx/Σm
eΣmy/Σm
.Pode ser possível transformar o próprio cálculo em uma função de espaço, verá.
fonte
Mathcad, 8 "bytes"
Não sei no que estava pensando na minha resposta anterior. Aqui está uma maneira mais curta de fazer uso adequado da multiplicação de matrizes. A variável p contém os dados - se a definição da variável for contabilizada no total, adicione mais 2 "bytes" (criação da tabela de entrada = 1 byte, nome da variável = 1 byte).
fonte
Python 3, 63 bytes
As operações de vetor nas listas são longas: /
Esta é uma função lambda anônima - dê um nome e chame como
f([[0,2],[3,4],[0,1],[1,1]],[2,6,2,10])
.fonte
Python 3,
959088 bytesSolução
Resultados
graças a @Zgarb economizando 2 bytes
Uma solução recursiva por diversão (95 bytes)
Resultados
fonte
*([c]+[m])
poderia ser reduzido para*[c,m]
.Axioma, 158 bytes
ungolf it
resultados
fonte
k, 13 bytes
Experimente online!
fonte