Задача на js с валютами
помогите плиз решить задачку, реализовать необходимо на js
Создайте конвертер, чтобы производить конвертацию между любой валютной парой. Рассмотрим структуру данных, содержащую курсы обмена между несколькими валютами. Реализация поставщика для получения конвертированного значения из одной валюты в другую, обратите внимание, что курс конвертации для них может быть недоступен напрямую. Например,
AUD/USD 0.7754
USD/CAD 1.2330
CAD/CHF 0.9313
USD/DKK 6.6336
EUR/USD 1.1231
GBP/ CHF 1.5620
Например, получить конвертированное значение из AUD в CHF или CHF в AUD.
Пользователь в консоле задаёт пары валют и курс к ним. Соответственно надо придумать алгоритм и его реализовать, чтобы автоматически вычислялись дополнительные кросс-курсы. Например AUD/USD 1.5, USD/CAD 1.3. Вот я задал две пары кросс-курсов валют. Как найти курс AUD к CAD например? Явного курса нет, но его можно вычислить из заданных двух пар. Ну, и т.д. Сколько бы не задавал курсов, все дополнительные вычисляются автоматически и хранятся в памяти
Ответы (1 шт):
Давайте посмотрим на задачу несколько шире. Рассмотрим случай взаимной котировки n валют. Пронумеруем валюты от 1 до n и далее будем называть валюты по номерам. Тогда все котировки можно представить в виде квадратной матрицы n x n:
Например, котировку второй валюты к первой (R21) мы найдем на пересечении второй строки и первого столбца.
При добавлении котировки в матрицу нужно произвести две записи:

Соответственно, добавив пару в матрицу, можно сразу извлечь и обратный курс.
Чтобы рассчитать валютный кросскурс между валютами i и j, нужно найти дополнительную валюту k, котировки которой с искомой парой нам известны.
Номер дополнительной валюты k будет соответствовать номеру строки матрицы, для которой выполняется условие:

А формула для расчета валютного кросскурса:

Проверим теорию:
const createMatrix = (n) => [...Array(n)].map((e, i, a) => a.map(e => +!i--));
const L = {'USD': 0, 'EUR': 1, 'GBP': 2, 'JPY': 3, 'CHF': 4};
const N = Object.keys(L).length;
const R = createMatrix(N);
addPairRates('EUR', 'USD', 1.09);
addPairRates('CHF', 'USD', 1.0549);
console.log(
getPairRates('CHF', 'EUR'),
getPairRates('EUR', 'CHF')
);
/////
function addPairRates(c1, c2, rate) {
let i = L[c1], j = L[c2];
R[i][j] = rate;
R[j][i] = 1 / rate;
}
function getPairRates(c1, c2) {
let i = L[c1], j = L[c2];
let rate = R[i][j];
if (rate == 0) {
// Попытка рассчитать валютный кросскурс:
let k = R.findIndex(v => v[i] > 0 && v[j] > 0);
if (k >= 0) rate = R[i][k] / R[j][k];
}
return rate;
}
