Aquí hay un desafío rápido el lunes por la mañana ...
Escriba una función o programa en el menor número de bytes que:
- Toma como entrada una lista de
[x,y]
coordenadas - Toma como entrada una lista de las
[x,y]
masas respectivas de las coordenadas. - Emite el centro de masa calculado en forma de
[xBar,yBar]
.
Nota:
- La entrada se puede tomar de cualquier forma, siempre que se use una matriz.
El centro de masa se puede calcular mediante la siguiente fórmula:
En inglés simple...
- Para encontrar
xBar
, multiplique cada masa por su respectiva coordenada x, sume la lista resultante y divídala por la suma de todas las masas. - Para encontrar
yBar
, multiplique cada masa por su respectiva coordenada y, sume la lista resultante y divídala por la suma de todas las masas.
Ejemplo trivial de 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 prueba:
> 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]
Este es el código de golf, por lo que gana el menor número de bytes.
code-golf
arithmetic
array-manipulation
Señor público
fuente
fuente
[x,y,m],[x,y,m]...
:?[(x1,y1,m1), (x2,y2,m2)]
, por ejemplo, una lista de tuplas? ¿O no importa si los argumentos son tuplas, listas o matrices? ¿Qué pasa con tres listas / matrices?Respuestas:
MATL ,
65 bytesEl formato de entrada es un vector de fila con las masas, luego una matriz de dos columnas con las coordenadas (en las que los espacios o comas son opcionales).
Primer ejemplo:
Segundo ejemplo
Pruébalo en línea!
Explicación
Deje
m
denotar el vector de masas (primera entrada) yc
la matriz de coordenadas (segunda entrada).fuente
y
es bastante util !! +1Mathematica, 10 bytes
Ejemplo:
fuente
Dot
. ¡Pero lo haré después de ver tu uso arriba!Mathcad, 19 "bytes"
Como Mathcad utiliza una "pizarra" 2D y operadores especiales (por ejemplo, operador de suma, operador integral) y guarda en un formato XML, una hoja de trabajo real puede contener varios cientos (o más) caracteres. Para los propósitos de Code Golf, he tomado un "conteo de bytes" de Mathcad para que sea el número de caracteres u operadores que el usuario debe ingresar para crear la hoja de trabajo.
La primera versión (programa) del desafío toma 19 "bytes" usando esta definición y la versión de la función toma 41 "bytes".
fuente
MATLAB / Octave,
1816 bytes¡Gracias al usuario beaker y Don Muesli por eliminar 2 bytes!
Dado que las coordenadas están en una
N x 2
matrizx
donde la primera columna es la coordenada X y la segunda columna es la coordenada Y, y las masas están en una1 x N
matrizy
(o un vector de fila):La explicación de este código es bastante sencilla. Esta es una función anónima que toma las dos entradas
x
yy
. Realizamos la suma ponderada (la expresión del numerador de cada coordenada) en un enfoque de álgebra lineal usando la multiplicación de matriz-vector. Al tomar el vectory
de masas y multiplicar esto con la matriz de coordenadasx
por la multiplicación de matriz-vector, calcularía la suma ponderada de ambas coordenadas individualmente, luego dividiremos cada una de estas coordenadas por la suma de las masas, encontrando así el centro deseado de masa devuelta como un vector de fila de 1 x 2 para cada coordenada, respectivamente.Ejecuciones de ejemplo
Pruébalo en línea!
https://ideone.com/BzbQ3e
fuente
;
, y también'
eligiendo correctamente el formato de entrada (x
como vector de fila)Jalea, 6 bytes
o
La entrada es a través de dos argumentos de línea de comando, masas primero, coordenadas segundo.
Pruébalo en línea!
Explicación
o
fuente
Julia,
2517 bytesPerdí el enfoque obvio: / Llamada como
f([3 1;0 0;1 4], [2 4 1])
.fuente
CJam, 14 bytes
Una función sin nombre espera la lista de pares de coordenadas y la lista de masas en la pila (en ese orden) y deja el centro de masa en su lugar.
Pruébalo aquí.
Explicación
fuente
Perl 6,
363330 bytesfuente
En serio, 16 bytes
Toma entradas como
[x-coords]\n[y-coords]\n[masses]
y salidas comoxbar\nybar
Pruébalo en línea!
Explicación:
fuente
Haskell,
5550 bytesEsto define una función binaria
f
, utilizada de la siguiente manera:Véalo pasar ambos casos de prueba.
Explicación
Haskell no es muy adecuado para procesar listas multidimensionales, por lo que estoy saltando algunos aros aquí. La primera línea define un alias corto para
zipWith
, que necesitamos dos veces. Básicamente,f
es una función que toma la lista de pesosa
y producef a
, una función que toma la lista de posiciones y produce el centro de masa.f a
es una composición de tres funciones:fuente
JavaScript (ES6), 60 bytes
Acepta una matriz de (x, y, masa) "triples" y devuelve una "tupla".
fuente
[x,y,m]
necesarios los paréntesis ? iirc, no son necesarios si solo hay un argumento de entrada para la función de flecha.R,
3225 byteseditar -7 bytes cambiando a álgebra matricial (gracias @ Sp3000 respuesta de Julia)
pasar una matriz (matriz con 2 columnas, x, y) como coordenadas y vector
m
de pesos, devuelve una matriz con las coordenadas requeridasfuente
PHP, 142 bytes
Vista en despiece ordenado Entrada requerida RegresoArray: [ xbar, ybar ]
La
p()
función es un mapa básico, multiplicando cada[m]
valor con el correspondiente[x]
o[y]
valor. Lac()
función tomaArray[Array]
, presenta las funcionesarray_sum
yarray_map
para el espacio, luego calculaΣmx/Σm
yΣmy/Σm
.Podría ser posible convertir el cálculo en sí mismo en una función para el espacio, verá.
fuente
Mathcad, 8 "bytes"
No sé en qué no estaba pensando en mi respuesta anterior. Aquí hay una forma más corta de hacer un uso adecuado de la multiplicación de matrices. La variable p contiene los datos: si la configuración de la variable cuenta hacia el total, agregue otros 2 "bytes" (creación de la tabla de entrada = 1 byte, nombre de la variable = 1 byte).
fuente
Python 3, 63 bytes
Las operaciones vectoriales en las listas son largas: /
Esta es una función lambda anónima: asígnele un nombre y llame como
f([[0,2],[3,4],[0,1],[1,1]],[2,6,2,10])
.fuente
Python 3,
959088 bytesSolución
Resultados
gracias a @Zgarb ahorrando 2 bytes
Una solución recursiva para la diversión (95 bytes)
Resultados
fuente
*([c]+[m])
podría acortarse*[c,m]
.Axioma, 158 bytes
deshacerse de él
resultados
fuente
k, 13 bytes
Pruébalo en línea!
fuente