Voici un petit défi du lundi matin ...
Écrivez une fonction ou un programme dans le moins d'octets qui:
- Prend en entrée une liste de
[x,y]
coordonnées - Prend en entrée une liste des
[x,y]
masses respectives des coordonnées - Sort le centre de masse calculé sous la forme de
[xBar,yBar]
.
Remarque:
- L'entrée peut être prise sous n'importe quelle forme, tant qu'un tableau est utilisé.
Le centre de masse peut être calculé par la formule suivante:
En anglais simple ...
- Pour trouver
xBar
, multipliez chaque masse par sa coordonnée x respective, additionnez la liste résultante et divisez-la par la somme de toutes les masses. - Pour trouver
yBar
, multipliez chaque masse par sa coordonnée y respective, additionnez la liste résultante et divisez-la par la somme de toutes les masses.
Exemple 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]
Cas de test:
> 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]
Il s'agit de code-golf, donc le moins d'octets gagne!
code-golf
arithmetic
array-manipulation
Mr Public
la source
la source
[x,y,m],[x,y,m]...
:?[(x1,y1,m1), (x2,y2,m2)]
exemple d'une liste de tuples? Ou importe peu que les arguments soient des tuples, des listes ou des tableaux? Qu'en est-il de trois listes / tableaux?Réponses:
MATL ,
65 octetsLe format d'entrée est un vecteur ligne avec les masses, puis une matrice à deux colonnes avec les coordonnées (dans lesquelles les espaces ou virgules sont facultatifs).
Premier exemple:
Deuxième exemple:
Essayez-le en ligne!
Explication
Soit
m
le vecteur des masses (première entrée) etc
la matrice des coordonnées (deuxième entrée).la source
y
est assez utile !! +1Mathematica, 10 octets
Exemple:
la source
Dot
. Mais je le ferai après avoir vu votre utilisation ci-dessus!Mathcad, 19 "octets"
Comme Mathcad utilise un "tableau blanc" 2D et des opérateurs spéciaux (par exemple, opérateur de sommation, opérateur intégral) et enregistre au format XML, une feuille de calcul réelle peut contenir plusieurs centaines (ou plus) de caractères. Aux fins de Code Golf, j'ai pris un "nombre d'octets" Mathcad comme étant le nombre de caractères ou d'opérateurs que l'utilisateur doit entrer pour créer la feuille de calcul.
La première version (du programme) du défi prend 19 "octets" en utilisant cette définition et la version de la fonction prend 41 "octets".
la source
MATLAB / Octave,
1816 octetsMerci à l'utilisateur bécher et Don Muesli pour avoir supprimé 2 octets!
Étant donné que les coordonnées sont dans une
N x 2
matricex
où la première colonne est la coordonnée X et la deuxième colonne est la coordonnée Y, et les masses sont dans une1 x N
matricey
(ou un vecteur ligne):L'explication de ce code est assez simple. Il s'agit d'une fonction anonyme qui prend les deux entrées
x
ety
. Nous effectuons la sommation pondérée (l'expression du numérateur de chaque coordonnée) dans une approche d'algèbre linéaire en utilisant la multiplication matrice-vecteur. En prenant le vecteury
des masses et en le multipliant par la matrice des coordonnéesx
par multiplication matrice-vecteur, vous calculeriez la somme pondérée des deux coordonnées individuellement, puis nous diviserions chacune de ces coordonnées par la somme des masses, trouvant ainsi le centre souhaité de masse renvoyée comme vecteur de ligne 1 x 2 pour chaque coordonnée respectivement.Exemple d'exécutions
Essayez-le en ligne!
https://ideone.com/BzbQ3e
la source
;
, et aussi'
en choisissant correctement le format d'entrée (x
comme vecteur de ligne)Gelée, 6 octets
ou
L'entrée se fait via deux arguments de ligne de commande, les masses d'abord, les coordonnées ensuite.
Essayez-le en ligne!
Explication
ou
la source
Julia,
2517 octetsManqué l'approche évidente: / Appelez comme
f([3 1;0 0;1 4], [2 4 1])
.la source
CJam, 14 octets
Une fonction sans nom attend la liste des paires de coordonnées et la liste des masses sur la pile (dans cet ordre) et laisse le centre de masse à leur place.
Testez-le ici.
Explication
la source
Perl 6,
363330 octetsla source
Sérieusement, 16 octets
Prend les entrées en tant que
[x-coords]\n[y-coords]\n[masses]
et les sorties en tant quexbar\nybar
Essayez-le en ligne!
Explication:
la source
Haskell,
5550 octetsCeci définit une fonction binaire
f
, utilisée comme suit:Voir réussir les deux cas de test.
Explication
Haskell n'est pas bien adapté au traitement de listes multidimensionnelles, donc je saute dans certains cerceaux ici. La première ligne définit un alias court pour
zipWith
, dont nous avons besoin deux fois. Fondamentalement,f
est une fonction qui prend la liste des poidsa
et produitf a
, une fonction qui prend la liste des positions et produit le centre de masse.f a
est une composition de trois fonctions:la source
JavaScript (ES6), 60 octets
Accepte un tableau de (x, y, masse) "triples" et renvoie un "tuple".
la source
[x,y,m]
nécessaires? iirc, ils ne sont pas requis s'il n'y a qu'un seul argument d'entrée pour la fonction flèche.R,
3225 octetséditer -7 octets en passant à l'algèbre matricielle (merci @ réponse Sp3000 Julia)
passer un tableau (matrice à 2 colonnes, x, y) comme coordonnées et vecteur
m
de poids, retourne un tableau avec les coordonnées requisesla source
PHP, 142 octets
Vue éclatée Entrée requise RevenirArray: [ xbar, ybar ]
La
p()
fonction est une carte de base, multipliant chaque[m]
valeur par la valeur[x]
ou correspondante[y]
. Lac()
fonction prend leArray[Array]
, présente les fonctionsarray_sum
etarray_map
pour l'espace, puis calculeΣmx/Σm
etΣmy/Σm
.Il pourrait être possible de transformer le calcul lui-même en fonction de l'espace, verra.
la source
Mathcad, 8 "octets"
Je ne sais pas à quoi je ne pensais pas dans ma réponse précédente. Voici un moyen plus court d'utiliser correctement la multiplication matricielle. La variable p contient les données - si le réglage de la variable compte pour le total, ajoutez ensuite 2 "octets" supplémentaires (création de la table d'entrée = 1 octet, nom de la variable = 1 octet).
la source
Python 3, 63 octets
Les opérations vectorielles sur les listes sont longues: /
Il s'agit d'une fonction lambda anonyme - donnez-lui un nom et appelez comme
f([[0,2],[3,4],[0,1],[1,1]],[2,6,2,10])
.la source
Python 3,
959088 octetsSolution
Résultats
grâce à @Zgarb économisant 2 octets
Une solution récursive pour le plaisir (95 octets)
Résultats
la source
*([c]+[m])
pourrait être raccourci*[c,m]
.Axiome, 158 octets
le défouler
résultats
la source
k, 13 octets
Essayez-le en ligne!
la source