Здравствуйте, я выполняю следующее упражнение по программированию: Генератор чисел отряда . Утверждение таково:
В начале каждого сезона каждому игроку футбольной команды присваивается уникальный номер команды. Из-за суеверия или их истории некоторые числа более желательны, чем другие.
Напишите функцию 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
Мы прочитали: