Создать номер не в массиве - PullRequest
1 голос
/ 18 марта 2020

Здравствуйте, я выполняю следующее упражнение по программированию: Генератор чисел отряда . Утверждение таково:

В начале каждого сезона каждому игроку футбольной команды присваивается уникальный номер команды. Из-за суеверия или их истории некоторые числа более желательны, чем другие.

Напишите функцию generateNumber (), которая принимает два аргумента: массив номеров текущих отрядов (отряд) и желаемый номер нового игрока (n) , Если желаемый номер нового игрока еще не занят, верните n, иначе, если желаемый номер может быть сформирован путем добавления двух цифр от 1 до 9, верните число, образованное путем объединения этих двух цифр вместе. Например, если взято 2, верните 11, потому что 1 + 1 = 2. В противном случае верните ноль.

Примечание. Часто бывает несколько разных способов сформировать номер замены. В этих случаях число с наименьшим первым ди git должно быть приоритетным. Например, если n = 15, но отряд уже содержит 15, верните 69, а не 78.

Мы хотели бы узнать, как можно улучшить следующий алгоритм:

def generate_number(squad, n): #☘️
    print("squad: ",squad)
    print("n: ",n)
    if n not in squad: return n
    firstDigit = n%9
    secondDigit = 9
    squadNumber = int(str(firstDigit)+str(secondDigit))
    while squadNumber <= 99 and squadNumber in squad:
        print("squadNumber: ",squadNumber)
        firstDigit+=1
        secondDigit-=1
        while(firstDigit+secondDigit != n):
            print("inside squadNumber: ",squadNumber)
            firstDigit+=1
            secondDigit-=1
            squadNumber = int(str(firstDigit)+str(secondDigit))
        squadNumber = int(str(firstDigit)+str(secondDigit))
    return squadNumber if squadNumber <= 99 else None

Возникает вопрос: как получить комбинацию из двух цифр, которая суммируется как n?

Например:

n = 11 -> 11%9 = 2 -> 2+9 = 11 -> 29
n = 16 -> 16%9 = 7 -> 7+9 = 16 -> 79
n = 10 -> 10%9 = 1 -> 1+9 = 10 -> 19

Однако что произойдет, если n равно 18, и в настоящее время оно находится в Сборная. Алгоритм должен вернуть следующий наименьший результат, который будет 99 ...

Но трассировка нашего кода будет:

squad:  [1, 2, 3, 4, 6, 9, 10, 11, 15, 18, 23, 69]
n:  18
squadNumber:  9
inside squadNumber:  9
inside squadNumber:  27
inside squadNumber:  36
inside squadNumber:  45
inside squadNumber:  54
inside squadNumber:  63
inside squadNumber:  72
inside squadNumber:  81
inside squadNumber:  90

Traceback (most recent call last):
  File "main.py", line 23, in <module>
    Test.assert_equals(generate_number([1, 2, 3, 4, 6, 9, 10, 11, 15, 18, 23, 69], 18), 99)
  File "/home/codewarrior/solution.py", line 16, in generate_number
    squadNumber = int(str(firstDigit)+str(secondDigit))
ValueError: invalid literal for int() with base 10: '10-1'

Таким образом, следующий тест не пройден:

Test.it("should return next lowest, two-digit combination, if n is already taken")

Test.assert_equals(generate_number([1, 2, 3, 4, 6, 9, 10, 11, 15, 18, 23, 69], 18), 99)

Мы подумали, что прямой подход: l oop от 11 до 99 и возвращает наименьшую из цифр сумму n:

def generate_number(squad, n):
    print("squad: ",squad)
    print("n: ",n)
    if n not in squad: return n
    for twoDigitsNumber in list(range(11,100)):
        if "0" in str(twoDigitsNumber): continue
        print("twoDigitsNumber: ",twoDigitsNumber)
        firstDigit=int(str(twoDigitsNumber)[0])
        secondDigit=int(str(twoDigitsNumber)[1])
        summed=firstDigit+secondDigit
        print("summed: ",summed)
        if twoDigitsNumber not in squad and summed==n: return twoDigitsNumber
    return None

Мы прочитали:

1 Ответ

0 голосов
/ 18 марта 2020

Ваше вычисление неверно. Посмотрите на ваш след:

n:  18
squadNumber:  9
inside squadNumber:  9
inside squadNumber:  27

Вам не удалось найти 99, потому что вы решили заменить желаемый номер отряда суммой его цифр; это противоречит спецификациям. Вы должны искать сумму 18, а не 9. Удалите эту замену из своего кода, и она должна работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...