v-kolesnikov/js_l1_brain_games-s12

View on GitHub
src/games/balanced_numbers.js

Summary

Maintainability
A
0 mins
Test Coverage
// @flow

import brainGame from '..';
import * as Utils from '../utils';

const description = 'Balance the given number.';

const toDigits = n => n
  .toString()
  .split('')
  .map(x => parseInt(x, 10))
  .slice()
  .sort();

const balanced = (n) => {
  const digits = toDigits(n);

  const balancedDigits = digits.reduce((acc) => {
    const lastIdx = acc.length - 1;
    const diffVal = acc[lastIdx] - acc[0];

    if (diffVal <= 1) {
      return acc;
    }

    const halfOfDiff = diffVal % 2 === 0 ? diffVal / 2 : (diffVal - 1) / 2;

    const firstValue = acc[0] + halfOfDiff;
    const lastValue = acc[lastIdx] - halfOfDiff;
    const middleValues = acc.slice(1, lastIdx);

    return [firstValue, ...middleValues, lastValue].slice().sort();
  }, digits);

  return parseInt(balancedDigits.join(''), 10);
};

const nextQuestion = (): { question: string, answer: string } => {
  const number = Utils.getRandomNumber(10, 10000);
  const answer = String(balanced(number));
  const question = String(number);

  return { question, answer };
};

export default () => brainGame(description, nextQuestion);