Какой тип математики или программирования это проблема - PullRequest
0 голосов
/ 05 января 2019

Я уже решил эту проблему (см. Код ниже), но у меня нет удовлетворительного имени для результирующей функции. Также я хотел бы изучить эту проблему более широко, но я не знаю, что я ищу. Я пробовал "круговую математику", "проблему с часами". Я даже помню, как монады использовались для решения этого принципа, но я не могу найти, где я это увидел.

ПРОБЛЕМА: Учитывая последовательный набор чисел, которые идут по кругу, как часы 1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4.. (или шкалу цветового оттенка в моем случае) и учитывая расстояние (в целых числах), я хочу вычислить результирующее число на этом круговая серия. Поэтому, если часы показывают 5, а я добавляю 9 часов, результат должен быть 2.

5+9=2 или 3-7=8

Вопрос в том, как мне это назвать. Вот решение в PHP:

function circularmath($strExpression = "2+2" , $top = 355 ){
$result = 0;
if(preg_match('/^\d+[+-]\d+$/',$strExpression)){
    list($n1,$op,$n2)=preg_split('/([+-])/',$strExpression, null, PREG_SPLIT_DELIM_CAPTURE);
    $result =($op==="+")? $n1+$n2:$n1-$n2;
    if($result < 0){
        $result=$top+$result;
    }elseif($result > $top){
        $result=$result-$top;
    }
  }
 return $result;
}

$foo = circularmath("352+4");
echo $foo;

1 Ответ

0 голосов
/ 05 января 2019

Спасибо Томасу Г и Ггорлену. Это на самом деле модульная арифметика, и это привело к лучшему коду:

        function mod($a, $n) {
            return ($a % $n) + ($a < 0 ? $n : 0);
        }
        function circularmath($strExpression = "2+2" , $top = 355 ){
            $result = null;
            if(preg_match('/^\d+[+-]\d+$/',$strExpression)){
                list($n1,$op,$n2)=preg_split('/([+-])/',$strExpression, null, PREG_SPLIT_DELIM_CAPTURE);
                $result =($op==="+")? $n1+$n2:$n1-$n2;
                $result = mod($result , $top) ;
            }
        return $result;
        }
        $foo = circularmath("352+4")."\n";
        echo "f:".$foo;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...