2.7 KiB
2.7 KiB
title, id, challengeType, forumTopicId, localeTitle
title | id | challengeType | forumTopicId | localeTitle |
---|---|---|---|---|
Vector dot product | 594810f028c0303b75339ad3 | 5 | 302343 | Векторный точечный продукт |
Description
Вектор определяется как имеющий три измерения как представленный упорядоченным набором из трех чисел: (X, Y, Z).
Задача:
Write a function that takes any numbers of vectors (arrays) as input and computes their dot product.
Ваша функция должна возвращать значение null
на недопустимые входы (т. Е. Векторы разной длины).
Instructions
null
on invalid inputs such as vectors of different lengths.
Tests
tests:
- text: dotProduct must be a function
testString: assert.equal(typeof dotProduct, 'function');
- text: dotProduct() must return null
testString: assert.equal(dotProduct(), null);
- text: dotProduct([[1], [1]]) must return 1.
testString: assert.equal(dotProduct([1], [1]), 1);
- text: dotProduct([[1], [1, 2]]) must return null.
testString: assert.equal(dotProduct([1], [1, 2]), null);
- text: dotProduct([1, 3, -5], [4, -2, -1]) must return 3.
testString: assert.equal(dotProduct([1, 3, -5], [4, -2, -1]), 3);
- text: <code>dotProduct(...nVectors)</code> should return 156000
testString: assert.equal(dotProduct([ 0, 1, 2, 3, 4 ], [ 0, 2, 4, 6, 8 ], [ 0, 3, 6, 9, 12 ], [ 0, 4, 8, 12, 16 ], [ 0, 5, 10, 15, 20 ]), 156000);
Challenge Seed
function dotProduct(...vectors) {
// Good luck!
}
Solution
function dotProduct(...vectors) {
if (!vectors || !vectors.length) {
return null;
}
if (!vectors[0] || !vectors[0].length) {
return null;
}
const vectorLen = vectors[0].length;
const numVectors = vectors.length;
// If all vectors not same length, return null
for (let i = 0; i < numVectors; i++) {
if (vectors[i].length !== vectorLen) {
return null; // return undefined
}
}
let prod = 0;
let sum = 0;
let j = vectorLen;
let i = numVectors;
// Sum terms
while (j--) {
i = numVectors;
prod = 1;
while (i--) {
prod *= vectors[i][j];
}
sum += prod;
}
return sum;
}