# -*- coding: utf-8 -*-
from __future__ import absolute_import
import random
import math
from ._compat import _range
[docs]def armstrongs_between(n1=None, n2=None):
"""Get all the armstrong numbers between :attr:`n1` and :attr:`n2`.
Args:
n1 (int): Number passed in by the user.
n2 (int): Number passed in by the user.
Returns:
list: List of all the armstrong numbers between :attr:`n1`, and
:attr:`n2`.
Example:
>>> armstrongs_between(0, 999)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407]
.. versionadded:: TODO
.. note:: When you pass in different digit numbers, this method doesn't
get the armstrong numbers compared to the highest digit number passed
in.
"""
n1 = 0 if not n1 else n1
n2 = 0 if not n2 else n2
max_value = max(n1, n2)
min_value = min(n1, n2)
return [num
for num in _range(min_value, max_value + 1)
if is_armstrong(num)]
[docs]def hex_(value, pad=None):
"""Converts a given number to hexi-decimal.
Args:
value (int): Value passed in by the user.
pad (int): Padding till the result can be restricted.
Returns:
hex: A hex value that corresponds to the given number.
Example:
>>> hex_(55)
'0x37'
>>> hex_(555)
'0x22b'
>>> hex_(555, 2)
'0x'
.. versionadded:: TODO
"""
return hex(value)[0:pad]
[docs]def is_armstrong(num):
"""Returns True if :attr:`num` is armstrong number.
Args:
num (int): Number passed in by the user.
Returns:
bool: True if the given :attr:`num` is armstrong number else False.
Example:
>>> is_armstrong(371)
True
>>> is_armstrong(8208)
True
>>> is_armstrong(51)
False
.. versionadded:: TODO
"""
total = 0
temp = num
digits = len(str(num))
while temp != 0:
remainder = temp % 10
total += math.pow(remainder, digits)
temp //= 10
if total == num:
result = True
else:
result = False
return result
[docs]def is_even(num):
"""Returns True if :attr:`num` is even.
Args:
num (int/float): Number passed in by the user.
Returns:
bool: True if :attr:`num` is even else False
Example:
>>> is_even(6)
True
>>> is_even(7)
False
.. versionadded:: TODO
"""
return num % 2 == 0
[docs]def is_multiple_of(value, num):
"""Returns true if the :attr:`value` is a multiple of :attr:`num`.
Args:
value (int/float): Value provided by the user.
num (int/float): Value provided by the user.
Returns:
bool: True if the :attr:`value` is a multiple of :attr:`num`.
Example:
>>> is_multiple_of(6, 2)
True
>>> is_multiple_of(5, 2)
False
>>> is_multiple_of(1.5, 3)
False
>>> is_multiple_of(1.5, 0.5)
True
.. versionadded:: TODO
"""
return value % num == 0
[docs]def is_odd(num):
"""Returns True if :attr:`num` is odd.
Args:
num (int/float): Number passed in by the user.
Returns:
bool: True if :attr:`num` is odd else False
Example:
>>> is_odd(6)
False
>>> is_odd(7)
True
.. versionadded:: TODO
"""
return num % 2 != 0
[docs]def is_prime(num):
"""Returns True if the give :attr:`num` is a prime number.
Args:
num (int/float): Number passed in by the user.
Returns:
bool: True if the given :attr:`num` is a prime number else False
Example:
>>> is_prime(5)
True
>>> is_prime(7)
True
>>> is_prime(4)
False
>>> is_prime(727021)
True
.. versionadded:: TODO
"""
count = 0
if num in [1, 2]:
return True
for i in _range(1, (int(math.ceil(math.sqrt(num))) + 1)):
if num % i == 0:
count += 1
if count <= 1:
result = True
else:
result = False
return result
[docs]def primes_between(n1=None, n2=None):
"""Get all the prime numbers between :attr:`n1` and :attr:`n2`.
Args:
n1 (int): Number passed in by the user.
n2 (int): Number passed in by the user.
Returns:
list: List of all the prime numbers between :attr:`n1`, and :attr:`n2`.
Example:
>>> primes_between(1, 20)
[1, 2, 3, 5, 7, 11, 13, 17, 19]
>>> primes_between(21, 40)
[23, 29, 31, 37]
.. versionadded:: TODO
"""
n1 = 0 if not n1 else n1
n2 = 0 if not n2 else n2
max_value = max(n1, n2)
min_value = min(n1, n2)
return [num for num in _range(min_value, max_value + 1) if is_prime(num)]
[docs]def random_(n1=None, n2=None):
"""Returns a random integer/float from :attr:`n1` to :attr:`n2` (both
inclusive)
Args:
n1 (int/float/str): Value given by the user.
n2 (int/float/str): Value given by the user.
Returns:
int/float: Random integer/float value between :attr:`n1` and
:attr:`n2`.
Example:
>>> result = random_(5, 6)
>>> assert 5 <= result <= 6
>>> result = random_(5)
>>> assert 0 <= result <= 5
.. versionadded:: TODO
"""
n1 = 0 if not n1 else n1
n2 = 0 if not n2 else n2
n1 = float(n1)
n2 = float(n2)
max_value = max(n1, n2)
min_value = min(n1, n2)
diff = max_value - min_value
result = (random.random() * diff) + min_value
if diff <= 1 or (diff > 1 and math.ceil(result) > max_value):
return round(result, 2)
else:
return math.ceil(result)