The challenge
Create a function close_compare
that accepts 3 parameters: a
, b
, and an optional margin
. The function should return whether a
is lower than, close to, or higher than b
. a
is “close to” b
if margin
is higher than or equal to the difference between a
and b
.
When a
is lower than b
, return -1
.
When a
is higher than b
, return 1
.
When a
is close to b
, return ``.
If margin
is not given, treat it as zero.
Example: if a = 3
, b = 5
and the margin = 3
, since a
and b
are no more than 3 apart, close_compare
should return ``. Otherwise, if instead margin = 0
, a
is lower than b
and close_compare
should return -1
.
Assume: margin >= 0
Test cases
test.it("No margin")
test.assert_equals(close_compare(4, 5), -1)
test.assert_equals(close_compare(5, 5), 0)
test.assert_equals(close_compare(6, 5), 1)
test.it("With margin of 3")
test.assert_equals(close_compare(2, 5, 3), 0)
test.assert_equals(close_compare(5, 5, 3), 0)
test.assert_equals(close_compare(8, 5, 3), 0)
test.assert_equals(close_compare(8.1, 5, 3), 1)
test.assert_equals(close_compare(1.99, 5, 3), -1)
The solution in Python
Option 1:
def close_compare(a, b, margin = 0):
return 0 if abs(a - b) <= margin else -1 if b > a else 1
Option 2:
def close_compare(a, b, margin=0):
if a == b or abs(a - b) <= margin:
return 0
if a < b:
return -1
if a > b:
return 1
Option 3 (using numpy
):
from numpy import sign
def close_compare(a, b, margin=0):
return abs(a-b) > margin and sign(a-b)