"""
Guess

From: Basic Computer Games (1978)

 "In program Guess, the computer  chooses a random
  integer between 0 and any limit and any limit you
  set. You must then try to guess the number the
  computer has choosen using the clues provideed by
  the computer.
   You should be able to guess the number in one less
  than the number of digits needed to  represent the
  number in binary notation - i.e. in base 2. This ought
  to give you a clue as to the optimum search technique.
   Guess converted from the original program in FOCAL
  which appeared in the book "Computers in the Classroom"
  by Walt Koetke of Lexington High School, Lexington,
  Massaschusetts.
"""

# Altough the introduction says that the computer chooses
# a number between 0 and any limit, it actually chooses
# a number between 1 and any limit. This due to the fact that
# for computing the number of digits the limit has in binary
# representation, it has to use log.

from math import log
from random import random
from typing import Tuple


def insert_whitespaces() -> None:
    print("\n\n\n\n\n")


def limit_set() -> Tuple[int, int]:
    print("                   Guess")
    print("Creative Computing  Morristown, New Jersey")
    print("\n\n\n")
    print("This is a number guessing game. I'll think")
    print("of a number between 1 and any limit you want.\n")
    print("Then you have to guess what it is\n")
    print("What limit do you want?")

    limit = int(input())

    while limit <= 0:
        print("Please insert a number greater or equal to 1")
        limit = int(input())

    # limit_goal = Number of digits "limit" in binary has
    limit_goal = int((log(limit) / log(2)) + 1)

    return limit, limit_goal


def main() -> None:
    limit, limit_goal = limit_set()
    while True:
        guess_count = 1
        still_guessing = True
        won = False
        my_guess = int(limit * random() + 1)

        print(f"I'm thinking of a number between 1 and {limit}")
        print("Now you try to guess what it is.")

        while still_guessing:
            n = int(input())

            if n < 0:
                break

            insert_whitespaces()
            if n < my_guess:
                print("Too low. Try a bigger answer")
                guess_count += 1
            elif n > my_guess:
                print("Too high. Try a smaller answer")
                guess_count += 1
            else:
                print(f"That's it! You got it in {guess_count} tries")
                won = True
                still_guessing = False

        if won:
            if guess_count < limit_goal:
                print("Very good.")
            elif guess_count == limit_goal:
                print("Good.")
            else:
                print(f"You should have been able to get it in only {limit_goal}")
            insert_whitespaces()
        else:
            insert_whitespaces()
            limit, limit_goal = limit_set()


if __name__ == "__main__":
    main()
