mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 15:01:08 +00:00
Create guess_the_number_search.py (#7937)
This commit is contained in:
parent
61cfb43d2b
commit
a2783c6597
165
other/guess_the_number_search.py
Normal file
165
other/guess_the_number_search.py
Normal file
|
@ -0,0 +1,165 @@
|
|||
"""
|
||||
guess the number using lower,higher and the value to find or guess
|
||||
|
||||
solution works by dividing lower and higher of number guessed
|
||||
|
||||
suppose lower is 0, higher is 1000 and the number to guess is 355
|
||||
|
||||
>>> guess_the_number(10, 1000, 17)
|
||||
started...
|
||||
guess the number : 17
|
||||
details : [505, 257, 133, 71, 40, 25, 17]
|
||||
|
||||
"""
|
||||
|
||||
|
||||
def temp_input_value(
|
||||
min_val: int = 10, max_val: int = 1000, option: bool = True
|
||||
) -> int:
|
||||
"""
|
||||
Temporary input values for tests
|
||||
|
||||
>>> temp_input_value(option=True)
|
||||
10
|
||||
|
||||
>>> temp_input_value(option=False)
|
||||
1000
|
||||
|
||||
>>> temp_input_value(min_val=100, option=True)
|
||||
100
|
||||
|
||||
>>> temp_input_value(min_val=100, max_val=50)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValueError: Invalid value for min_val or max_val (min_value < max_value)
|
||||
|
||||
>>> temp_input_value("ten","fifty",1)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
AssertionError: Invalid type of value(s) specified to function!
|
||||
|
||||
>>> temp_input_value(min_val=-100, max_val=500)
|
||||
-100
|
||||
|
||||
>>> temp_input_value(min_val=-5100, max_val=-100)
|
||||
-5100
|
||||
"""
|
||||
assert (
|
||||
isinstance(min_val, int)
|
||||
and isinstance(max_val, int)
|
||||
and isinstance(option, bool)
|
||||
), "Invalid type of value(s) specified to function!"
|
||||
|
||||
if min_val > max_val:
|
||||
raise ValueError("Invalid value for min_val or max_val (min_value < max_value)")
|
||||
return min_val if option else max_val
|
||||
|
||||
|
||||
def get_avg(number_1: int, number_2: int) -> int:
|
||||
"""
|
||||
Return the mid-number(whole) of two integers a and b
|
||||
|
||||
>>> get_avg(10, 15)
|
||||
12
|
||||
|
||||
>>> get_avg(20, 300)
|
||||
160
|
||||
|
||||
>>> get_avg("abcd", 300)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: can only concatenate str (not "int") to str
|
||||
|
||||
>>> get_avg(10.5,50.25)
|
||||
30
|
||||
"""
|
||||
return int((number_1 + number_2) / 2)
|
||||
|
||||
|
||||
def guess_the_number(lower: int, higher: int, to_guess: int) -> None:
|
||||
"""
|
||||
The `guess_the_number` function that guess the number by some operations
|
||||
and using inner functions
|
||||
|
||||
>>> guess_the_number(10, 1000, 17)
|
||||
started...
|
||||
guess the number : 17
|
||||
details : [505, 257, 133, 71, 40, 25, 17]
|
||||
|
||||
>>> guess_the_number(-10000, 10000, 7)
|
||||
started...
|
||||
guess the number : 7
|
||||
details : [0, 5000, 2500, 1250, 625, 312, 156, 78, 39, 19, 9, 4, 6, 7]
|
||||
|
||||
>>> guess_the_number(10, 1000, "a")
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
AssertionError: argument values must be type of "int"
|
||||
|
||||
>>> guess_the_number(10, 1000, 5)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValueError: guess value must be within the range of lower and higher value
|
||||
|
||||
>>> guess_the_number(10000, 100, 5)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValueError: argument value for lower and higher must be(lower > higher)
|
||||
"""
|
||||
assert (
|
||||
isinstance(lower, int) and isinstance(higher, int) and isinstance(to_guess, int)
|
||||
), 'argument values must be type of "int"'
|
||||
|
||||
if lower > higher:
|
||||
raise ValueError("argument value for lower and higher must be(lower > higher)")
|
||||
|
||||
if not lower < to_guess < higher:
|
||||
raise ValueError(
|
||||
"guess value must be within the range of lower and higher value"
|
||||
)
|
||||
|
||||
def answer(number: int) -> str:
|
||||
"""
|
||||
Returns value by comparing with entered `to_guess` number
|
||||
"""
|
||||
if number > to_guess:
|
||||
return "high"
|
||||
elif number < to_guess:
|
||||
return "low"
|
||||
else:
|
||||
return "same"
|
||||
|
||||
print("started...")
|
||||
|
||||
last_lowest = lower
|
||||
last_highest = higher
|
||||
|
||||
last_numbers = []
|
||||
|
||||
while True:
|
||||
number = get_avg(last_lowest, last_highest)
|
||||
last_numbers.append(number)
|
||||
|
||||
if answer(number) == "low":
|
||||
last_lowest = number
|
||||
elif answer(number) == "high":
|
||||
last_highest = number
|
||||
else:
|
||||
break
|
||||
|
||||
print(f"guess the number : {last_numbers[-1]}")
|
||||
print(f"details : {str(last_numbers)}")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""
|
||||
starting point or function of script
|
||||
"""
|
||||
lower = int(input("Enter lower value : ").strip())
|
||||
higher = int(input("Enter high value : ").strip())
|
||||
guess = int(input("Enter value to guess : ").strip())
|
||||
guess_the_number(lower, higher, guess)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user