diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..40e958a --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,10 @@ +# pre-commit run --all-files +repos: +- repo: https://github.com/pre-commit/mirrors-autopep8 + rev: '' # Use the sha / tag you want to point at + hooks: + - id: autopep8 +- repo: https://github.com/pycqa/flake8 + rev: '' # pick a git hash / tag to point to + hooks: + - id: flake8 \ No newline at end of file diff --git a/README.md b/README.md index fa99518..d706936 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ y genera un Pull Request con tus cambios. 4. Un "X" significa que has adivinado correctamente un número en la posición correcta dentro de la secuencia. 5. Un "_" significa que has adivinado correctamente un número, pero en una posición incorrecta dentro de la secuencia. 6. Utilizando esta retroalimentación, deberás deducir la secuencia correcta. -Por ejemplo, si tu intento es "1234" y recibes una retroalimentación de "XX__",significa que has adivinado correctamente dos numero en posición y dos están el la posición incorrecta. +Por ejemplo, si tu intento es "1234" y recibes una retroalimentación de "XX__", significa que has adivinado correctamente dos números y están en la posición correcta y otros dos también fueron adivinados correctamente pero están en la posición incorrecta. 7. Con base en la retroalimentación recibida, realiza nuevos intentos ajustando tus suposiciones hasta que logres adivinar la secuencia correcta. 8. Continúa haciendo intentos y recibiendo retroalimentación hasta que logres descifrar la secuencia completa. diff --git a/codebreaker.py b/codebreaker.py index ae8aa27..7f0a85d 100644 --- a/codebreaker.py +++ b/codebreaker.py @@ -1,34 +1,51 @@ -trueNumber = "1010"; +""" + This module defines the Codebreaker class. It imports the + random Python module to generate digits randomly for the "right_number" + variable. +""" +import random + class Codebreaker: - - def adivinar(self, numero=None): - if trueNumber == '': - return 'Number is not defined' - - if numero is None or len(numero) != 4 or 'e' not in list(numero): - return "error" - - if numero == trueNumber: - return True - - resultadoX = '' - resultado_ = '' - arrayNumber = [] - - for x in len(numero): - if(arrayNumber[numero[x]] == True): - return 'error' - - arrayNumber[numero[x]] = True - - numero = list(numero) - - for index, x in numero: - if trueNumber[index] == numero[index]: - resultadoX+='X' - - elif x in trueNumber: - resultado_='_' - - return resultadoX+resultado_ + """ This class defines the Codebreaker object. """ + + def __init__(self): + """ + This method initializes the "right_number" variable to a string + converted from a 4 digit random number without repeated digits. + """ + self.right_number = str(''.join(random.sample("0123456789", 4))) + + def guess_opponent_number(self, number=None): + """ + This method takes two parameters, self and number (with a default + value of None). It will test if the "number" entered by the user + matches the class' "right_number" variable, and if not, return an + "X" for each digit guessed correctly and in the right position, + and "_" for each number order guessed correctly but in the wrong + position. + """ + + if number is None or len(number) != 4 or not number.isdecimal(): + raise TypeError + if number == self.right_number: + return True + + ok_number_ok_position = '' + ok_number_bad_position = '' + found_digits = [False for i in range(10)] + + for digit in number: + if found_digits[int(digit)]: + raise ValueError + found_digits[int(digit)] = True + + number = list(number) + + for index, digit in enumerate(number): + if self.right_number[index] == number[index]: + ok_number_ok_position += 'X' + elif digit in self.right_number: + ok_number_bad_position += '_' + + return ok_number_ok_position + ok_number_bad_position diff --git a/main.py b/main.py index a3e1ccd..b965520 100644 --- a/main.py +++ b/main.py @@ -1,18 +1,31 @@ +""" + This module will import the Codebreaker module and ask the user to enter a + 4 digit number. +""" + from codebreaker import Codebreaker -intentos_totales = 10 +# pylint: disable-msg=C0103 codebreaker = Codebreaker() +guess_number = 1 -intento = 0 - -print('Jugar Codebreaker!') - -while intento != intentos_totales: - number = input('Numero:'); - resolve = codebreaker.adivinar(number) - print(resolve) - if resolve == True: - print('You win!!') - break - +print('Let\'s play Codebreaker!') +while True: + number = input('Try to guess the 4 digit number (enter \'q\' to quit): ') + if number == 'q': + break + try: + result = codebreaker.guess_opponent_number(number) + except ValueError: + print("The number can't contain repeated digits!.") + except TypeError: + print("Please enter a 4 digit number!.") + else: + if not isinstance(result, str) and result: + print('You won! Number of guesses:', guess_number) + break + print(f'Incorrect! You\'ve guessed {guess_number} times.') + if len(result) > 0: + print(f'Hint: {result}') + guess_number += 1