Задача на 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 шт):

Автор решения: Laukhin Andrey

Давайте посмотрим на задачу несколько шире. Рассмотрим случай взаимной котировки 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;
}

→ Ссылка