-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathguess_the_number.py
79 lines (66 loc) · 2.12 KB
/
guess_the_number.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# -*- coding: utf-8 -*-
# File: guess_the_number.py
"""
### Requirements:
```text
getch
```
### Usage:
```bash
python guess_the_number.py [-min MIN_VALUE] [-max MAX_VALUE] [-s SEED]
```
"""
import argparse
import random
import sys
import getch
def get_number(prompt: str = "") -> int:
print(prompt, end="", flush=True)
num = []
while True:
char = getch.getch()
if char.isdigit(): # Get digits only
num.append(char)
print(char, end="", flush=True)
elif char == "-" and len(num) == 0: # Minus sign
num.append(char)
print(char, end="", flush=True)
elif char in {"\b", "\x7F"} and len(num) > 0: # Delete previous character
num.pop()
print("\b \b", end="", flush=True)
elif char == "\x1B": # Exit
print(flush=True)
sys.exit()
elif char in {"\r", "\n", "\r\n"}: # Return
print(flush=True)
return int("".join(num))
def main(min_value: int = 1, max_value: int = 100) -> None:
answer = random.randint(min_value, max_value)
attempts = 1
bound_len = max(len(str(min_value)), len(str(max_value)))
while (guess := get_number(f"{min_value:{bound_len}d} <= x <= {max_value:{bound_len}d}: ")) != answer:
if not min_value <= guess <= max_value:
continue
attempts += 1
if guess < answer:
min_value = guess
elif guess > answer:
max_value = guess
print(f"BINGO! The answer is {answer}. You took {attempts} attempts.")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"-min", "--min_value", type=int, default=1,
help="Initial lower bound. Defaults to 1.",
)
parser.add_argument(
"-max", "--max_value", type=int, default=100,
help="Initial upper bound. Defaults to 100.",
)
parser.add_argument(
"-s", "--seed", type=int, default=None,
help="Seed for random number generator. Defaults to None.",
)
args = parser.parse_args()
random.seed(args.seed)
main(args.min_value, args.max_value)