1ike/project-lvl1-s156

View on GitHub
src/Games/Balance.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace BrainGames\Games;

class Balance extends \BrainGames\Game
{

    private function align($remainder, $evenDigit, $inputLength, $output)
    {
        if ($inputLength == count($output)) {
            return $output;
        }

        $digit = $remainder > 0 ? $evenDigit + 1 : $evenDigit;

        return self::align($remainder - 1, $evenDigit, $inputLength, array_merge(array($digit), $output));
    }

    private function balance($num)
    {
        $str = (string) $num;

        $input = str_split($str);
        $inputLength = count($input);

        $inputDigit = array_map(function ($val) {
            return (int) $val;
        }, $input);

        $sum = array_reduce($inputDigit, function ($acc, $val) {
            return $acc + $val;
        });

        $evenDigit = floor($sum / $inputLength);
        $remainder = $sum % $inputLength;

        $output = self::align($remainder, $evenDigit, $inputLength, []);


        return (int) implode($output);
    }


    public static function run()
    {
        $rulesMessage = 'Balance the given number.';

        $getQuestionAnswerPair = function () {

            $limitMinNumber = 1;
            $limitMaxNumber = 1000;

            $num = rand($limitMinNumber, $limitMaxNumber);
            $question = $num;

            $correctAnswer = (string) self::balance($num);

            return [
                'question' => $question,
                'correctAnswer' => $correctAnswer
            ];
        };

        $game = new self($rulesMessage, $getQuestionAnswerPair);
        $game->start();
    }
}