refactor vs old code (small amount of input data)

Benchmark created on


Test runner

Ready to run.

Testing in
TestOps/sec
old code
const items = {"torit": 30, "gorot": 100};

const fruitName = /(?<=\:).+?(?=\:)/g;

/** 
  * Обработчик ошибок
  @param {string} args - Входные данные
  @returns {Array} Массив ошибок, которые записываються с новой строки
*/
function handleErrors(args) {
  const numOfArgs = args.length;
  let errors = [], wrongWords = [];

  for (let i = 0; i < numOfArgs; i++) {
    // Проверка наличия элемента в JSON-файле
    if (args[i].indexOf("👉") < 0) {
      const matchResult = args[i].match(fruitName);
      if (matchResult && matchResult.length > 0) {
        const itemName = matchResult[0];
        if (!items[itemName]) 
          wrongWords.push(`<${args[i]}>`);
      }
    }
  }

  if(wrongWords.length)
    errors.push("Items not found: " + wrongWords.join(", "));
  
  return errors.join("\n");
}

function inputDataProcess(args) {
  const fruitName = /(?<=\:).+?(?=\:)/g; // регулярное выражения для получения названия предмета из эмодзи
  let numOfArgs = args.length, posOfSeparator = 0, itemsBeforeSeparator = [], itemsAfterSeparator = [];
  let trading = "", lf = "";

  // обрабатываем ошибки и в случае их наявности завершаем програму
  if(handleErrors(args).length)
    throw new Error(handleErrors(args));

  // ищем разделитель
  while(1) {
    if(args[posOfSeparator].indexOf("👉") >= 0) 
      break;
    else
      posOfSeparator++;
  }

  let l = 0;
  // записываем предметы до разделителя и после разделителя
  for(l; l < posOfSeparator; l++) {
    itemsBeforeSeparator.push(args[l].match(fruitName)[0]);
    trading += `<${args[l]}>` + " ";
  };
  l++ // инкрементируем счетчик, чтобы не записался разделитель в массив
  
  for(l; l < numOfArgs; l++) {
    itemsAfterSeparator.push(args[l].match(fruitName)[0]);
    lf += `<${args[l]}>` + " ";
  }

  return {
    itemsBeforeSeparator, 
    itemsAfterSeparator,
    tradeResult: trading,
    lfResult: lf,
  };
}  


function profitCalculate(itemsBeforeSeparator, itemsAfterSeparator) {
  let sumBefore = 0, sumAfter = 0, tradeStatus = "";

  // считаем суму предметов до и после разделителя
  for(let i = 0; i < itemsBeforeSeparator.length; i++) 
    sumBefore += items[itemsBeforeSeparator[i]];
  
  for(let i = 0; i < itemsAfterSeparator.length; i++) 
    sumAfter += items[itemsAfterSeparator[i]];
  
  // считаем profit от сделки
  const profit = ((sumAfter - sumBefore) * 100) / sumAfter;
  profit < 0 ? (tradeStatus = "невыгодная", embedColor = "#ED4245") : (tradeStatus = "выгодная", embedColor = "#57F287");

  // находим большее и меньшее число
  let biggest = sumBefore > sumAfter ? sumBefore : sumAfter;
  let smaller = sumBefore < sumAfter ? sumBefore : sumAfter;

  // проверяем если обмен равноценный
  if(biggest - smaller <= 20) // заместо 20 можно написать число, которое будет давать "границу" FAIRY-трейду
    tradeStatus = "равноценная", embedColor = "Blue";

  return { sumBefore, sumAfter, profit, embedColor, tradeStatus };
}

function main(args) {
  try {
    const { tradeResult, lfResult, itemsBeforeSeparator, itemsAfterSeparator } = inputDataProcess(args);
    const { sumBefore, sumAfter, profit, embedColor, tradeStatus } = profitCalculate(itemsBeforeSeparator, itemsAfterSeparator);
    
    const formattedProfit = Math.abs(profit).toFixed(2);
    let statusString;

    if (tradeStatus === "выгодная")
      statusString = `Вы получили ${formattedProfit}% из этой сделки`;
    else if (tradeStatus === "невыгодная")
      statusString = `Вы потеряли ${formattedProfit}% из этой сделки`;
    else
      statusString = `В этой сделки вы ничего не потеряли и не получили`;
    
    console.log(statusString);
  } catch(err) {
    console.error(err.message);
  }
}

main([
  ':torit:1068131428589645864',
  '👉',
  ':gorot:1068128925269643335',
]);
ready
refactor
const items = {"torit": 30, "gorot": 100};

const itemNameRegex = /(?<=\:).+?(?=\:)/g;

/** 
  * Обработчик ошибок
  @param {string} args - Входные данные
  @returns {Array} Массив ошибок, которые записываються с новой строки
*/
function handleErrors(args) {
  const numOfArgs = args.length;
  let errors = [], wrongWords = [];

  for(let i = 0; i < numOfArgs; i++) {
    const currentArg = args[i];
    const isInvalid = currentArg.indexOf("👉") >= 0 || !currentArg.match(itemNameRegex) || items[currentArg.match(itemNameRegex)];

    if(isInvalid) 
      continue;

    wrongWords.push(`<${args[i]}>`);
  }

  if(wrongWords.length)
    errors.push("Items not found: " + wrongWords.join(", "));
  
  return errors.join("\n");
}

function inputDataProcess(args) {
  const fruitName = /(?<=\:).+?(?=\:)/g; // регулярное выражения для получения названия предмета из эмодзи
  let itemsBeforeSeparator = [], itemsAfterSeparator = [];
  let trading = "", lf = "";

  if(handleErrors(args).length)
    throw new Error(handleErrors(args));

  let isSeparator = false;
  args.forEach((el) => {
    if(el.indexOf("👉") >= 0) {
      isSeparator = true;
      return;
    }

    if(!isSeparator) {
      itemsBeforeSeparator.push(el.match(fruitName)[0]);
      trading += `<${el}> `;
    } else {
      itemsAfterSeparator.push(el.match(fruitName)[0]);
      lf += `<${el}> `;
    }
  })
  
  return {
    itemsBeforeSeparator, 
    itemsAfterSeparator,
    trading,
    lf,
  };
}  


const equalValueBoundary = 20; // заместо 20 можно написать число, которое будет давать "границу" FAIRY-трейду

/** 
  * Считает процент выгодности на основе входных данных  
  * @param {Array} - Входные данные
  * @returns {{object}} Объект, который содержит суму предметов до разделителя и после,
  * процент выгодности
*/
function profitCalculate(itemsBeforeSeparator, itemsAfterSeparator) {
  let sumBefore = 0, sumAfter = 0, tradeStatus = "";

  for(let i = 0; i < itemsBeforeSeparator.length; i++) 
    sumBefore += items[itemsBeforeSeparator[i]];
  
  for(let i = 0; i < itemsAfterSeparator.length; i++) 
    sumAfter += items[itemsAfterSeparator[i]];
  
  const profit = ((sumAfter - sumBefore) * 100) / sumAfter;
  profit < 0 ? (tradeStatus = 0, embedColor = "#ED4245") : (tradeStatus = 1, embedColor = "#57F287");

  const biggest = sumBefore > sumAfter ? sumBefore : sumAfter;
  const smaller = sumBefore < sumAfter ? sumBefore : sumAfter;

  if(biggest - smaller <= equalValueBoundary)
    tradeStatus = -1, embedColor = "Blue";

  return { sumBefore, sumAfter, profit, embedColor, tradeStatus };
}

function main(args) {
  try {
    const { trading: tradeResult, lf: lfResult, itemsBeforeSeparator, itemsAfterSeparator } = inputDataProcess(args);
    const { sumBefore, sumAfter, profit, embedColor, tradeStatus } = profitCalculate(itemsBeforeSeparator, itemsAfterSeparator);
    
    const formattedProfit = Math.abs(profit).toFixed(2);
    let statusString;

    switch(tradeStatus) {
      case -1: {
        statusString = `**Это равноценная сделка** | В этой сделки вы ничего не потеряли и не получили`;
      };
      case 0: {
        statusString = `**Это невыгодная сделка** | Вы потеряли ${formattedProfit}% из этой сделки`;
      };
      case 1: {
        statusString = `**Это выгодная сделка** | Вы получили ${formattedProfit}% из этой сделки`;
      }
    }

    console.log(statusString);
  } catch(err) {
    console.error(err.message);
  }
}

main([
  ':torit:1068131428589645864',
  '👉',
  ':gorot:1068128925269643335',
]);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.