Решение на Да си приготвим нещо за хапване от Димитър Вачев

Обратно към всички решения

Към профила на Димитър Вачев

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 10 успешни тест(а)
  • 0 неуспешни тест(а)

Код

def prepare_meal(number):
answer = ''
if number == 0:
return answer
devide_by_five = False
if number % 5 == 0:
devide_by_five = True
number = number / 5
num_of_spam = 0
while number > 1:
if number % 3 == 0:
num_of_spam = num_of_spam + 1
number = number / 3
iter_spam = num_of_spam
while iter_spam >= 1:
answer = answer + 'spam '
iter_spam = iter_spam - 1
if num_of_spam == 0:
if devide_by_five == True:
answer = 'eggs'
else:
if devide_by_five == True:
answer = answer + 'and eggs'
if devide_by_five == False:
answer = answer[:-1]
return answer

Лог от изпълнението

..........
----------------------------------------------------------------------
Ran 10 tests in 0.001s

OK

История (1 версия и 5 коментара)

Димитър обнови решението на 07.03.2012 11:07 (преди почти 13 години)

+def prepare_meal(number):
+ answer = ''
+ if number == 0:
+ return answer
+ devide_by_five = False
+ if number % 5 == 0:
+ devide_by_five = True
+ number = number / 5
+ num_of_spam = 0
+ while number > 1:
+ if number % 3 == 0:
+ num_of_spam = num_of_spam + 1
+ number = number / 3
+ iter_spam = num_of_spam
+ while iter_spam >= 1:
+ answer = answer + 'spam '
+ iter_spam = iter_spam - 1
+ if num_of_spam == 0:
+ if devide_by_five == True:
+ answer = 'eggs'
+ else:
+ if devide_by_five == True:
+ answer = answer + 'and eggs'
+ if devide_by_five == False:
+ answer = answer[:-1]
+ return answer

Здравей,

  • Изрично е указано да прочетете PEP 8 и да го спазвате. Дори при 100% работещо решение няма да давами точки при грубо неспазване на стила :)

  • Първата проверка за това дали x <= 0 е напълно излишна. Освен това слагайки скоби, на return-а, връщаш tuple.

  • За разлика от други езици, ако кодът на всяка функция започва с 10 реда дефиниране на променливи с нулеви стойности, докато пишеш на python, то трябва да си оправиш логиката.

  • Функцията ти не връща нищо. print != return

  • 10 пъти сме казвали как променливи с имена a нямат място в езика :)

while number > 1:
    if number % 3 == 0:
        num_of_spam = num_of_spam + 1
    number = number / 3

Тук "прахосваш" процесорно време с безсмислени операции, поради факта, че ако number не се дели на 3 без остатък, то и number / 3 пак няма да се дели на 3 без остатък. Т.е. ако ти се подаде 3**20000 + 1 ще извършиш 20000 излишни операции, което не е много, когато става въпрос за обикновено делене, но е хубава практика да не правиш излишни неща, тъй като някой ден ще ти се наложи да извършваш доста по-сложни операции.

Има още някои детайли, които си можел да пипнеш, но те са по-скоро въпрос на имплементация (като например това, че ако числото ти не се дели на 3, но се дели на 5 не връщаш директно "eggs" а го присвояваш на answer и връщаш въпросната променлива малко по-нататък).

P.S. По-добра имплементация на първото би било: while number > 1: if number % 3: # Или number % 3 != 0, ако го намираш за по-четимо. break num_of_spam = num_of_spam + 1 number = number / 3

А може и number % 3 също да е условие на while-а.