Math Mod, содержащий номера - PullRequest
0 голосов
/ 11 июня 2010

Я хотел бы написать простую строку кода, не прибегая к операторам if, который бы оценивал, находится ли число в определенном диапазоне. я могу оценить от 0 - Макс, используя модуль.

30 % 90 = 30  //great

однако, если тестовое число больше максимального, использование модуля просто запустит его с 0 для остальных, где, как я хотел бы ограничить его до максимума, если оно превышает максимум

94 % 90 = 4  //i would like answer to be 90

В любом случае, мне становится еще сложнее, если я введу минимум для диапазона. например:

minimum = 10
maximum = 90

поэтому любое число, которое я оцениваю, должно быть либо в пределах диапазона, либо минимальным значением, если оно ниже диапазона, и максимальным значением, если оно выше диапазона

-76 should be 10
2 should be 10
30 should be 30
89 should be 89
98 should be 90
23553 should be 90

Можно ли оценить это одной строкой кода без использования операторов if?

Ответы [ 5 ]

3 голосов
/ 11 июня 2010

Вероятно, самый простой способ - использовать все доступные варианты max и min на вашем языке, например:

max(10, min(number, 90))

На некоторых языках, например Java, JavaScript и C # (и, возможно, другие) max и min являются статическими методами класса Math.

Я использовал функцию clip, чтобы упростить ее (это в JavaScript):

function clip(min, number, max) {
    return Math.max(min, Math.min(number, max));
}
3 голосов
/ 11 июня 2010

просто, но все еще ветвится, даже если if не используется:

r = ( x < minimum ) ? minimum : ( x > maximum ) ? maximum : x;

из битовых хадлинговых хаков , предполагая (2 <3) == 1: </p>

r = y ^ ((x ^ y) & -(x < y)); // min(x, y)
r = x ^ ((x ^ y) & -(x < y)); // max(x, y)

собирая его вместе, предполагая, что min

r = min^(((max^((x^max)&-(max<x)))^min)&-(x<min));

работает как x<y:

r = y ^ ((x ^ y) & -(x < y));
r = y ^ ((x ^ y) & -(1)); // x<y == 1
r = y ^ ((x ^ y) & ~0); // -1 == ~0
r = y ^  (x ^ y); // (x^y) & ~0 == (x^y)
r = y ^   x ^ y; // y^y == 0
r = x;

в противном случае:

r = y ^ ((x ^ y) & -(x < y));
r = y ^ ((x ^ y) & -(0)); // x<y == 0
r = y ^ ((x ^ y) & 0); // -0 == 0
r = y; // (x^y) & 0 == 0
1 голос
/ 11 июня 2010

Использование C / C ++:

value = min*(number < min) +
        max*(number > max) +
        (number <= max && number >= min)*number%max;

Ниже приводится краткое объяснение.Обратите внимание, что код зависит от 2 важных вопросов для правильной работы.Во-первых, в C / C ++ логическое выражение может быть преобразовано в целое число.Во-вторых, напоминание об отрицательном числе - это число само по себе.Таким образом, это не математическое определение остатка.Я не уверен, определено ли это стандартами C / C ++ или это оставлено для реализации.В основном:

if number < min then:
    value = min*1 +
            max*0 +
            0*number%max;
else if number  > max
    value = min*0 +
            max*1 +
            0*number%max;
else
    value = min*1 +
            max*1 +
            1*number%max;
1 голос
/ 11 июня 2010

Если вы используете язык с троичным оператором (например, C или Java), вы можете сделать это следующим образом:

t < lo ? lo : (t > hi ? hi : t)

где t - тестовая переменная, а lo и hi - пределы. Это удовлетворяет вашим ограничениям в том смысле, что оно не использует строго операторы if, но троичный оператор на самом деле является просто синтаксическим сахаром для оператора if.

0 голосов
/ 11 июня 2010

Не понимаю, как ты мог ...

(Х / 10) <1? 10: (X / 90> 1? 90: X)

Число, деленное на 10, меньше 1? установить на 10 еще Если число, разделенное на 90, больше 90, установите значение 90 еще установлен на X

Обратите внимание, что все еще скрыто, если. (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...