#python
Вопрос:
Я новичок и ищу подсказку в make_bricks от codingbat (см. Здесь). Я написал кое-какой код, но не все работает должным образом. Может быть, кто-нибудь мог бы дать мне подсказку?
задача
Мы хотим сделать ряд кирпичей длиной 3 дюйма. У нас есть несколько маленьких кирпичей (по 1 дюйму каждый) и больших кирпичей (по 5 дюймов каждый). Вернитесь True
, если удастся достичь цели, выбрав один из заданных кирпичей. Это немного сложнее, чем кажется, и может быть сделано без каких-либо циклов.
Жук
У меня проблема с:
make_bricks(3, 1, 9) → False
— мой код таковTrue
make_bricks(3, 2, 9) → False
— мой код таковTrue
make_bricks(1, 4, 12) → False
— мой код таковTrue
Мой код:
def make_bricks(small, big, goal):
return small==goal or big==goal or goal%5==small or small*1 big*5==goal or
goal%5<=small or small big!=goal or goal-5!=small or goal-small*1==big*5
Комментарии:
1. Пожалуйста, просмотрите ответы людей — если что-то из этого полезно, вы можете проголосовать за это.
Ответ №1:
Когда вы приходите к неверным или иным результатам, чем вы могли бы ожидать, часто бывает полезно разбить шаги, чтобы определить, где что-то могло пойти не так. Например, вот ваш код, разбитый немного по-другому, чтобы вам было легче следовать логическому потоку.
# ======================================
# Your code written slightly differently
# ======================================
def make_bricks(small, big, goal):
if small==goal:
return 1
elif big==goal:
return 2
elif goal%5==small:
return 3
elif small*1 big*5==goal:
return 4
elif goal%5<=small:
return 5
elif small big!=goal:
return 6
elif goal-5!=small:
return 7
elif goal-small*1==big*5:
return 8
else:
return False
print(make_bricks(3, 1, 9))
print(make_bricks(3, 2, 9))
print(make_bricks(1, 4, 12))
Это дает вам подсказку о том, как вы можете определить, какая оценка может работать не совсем так, как вы ожидаете. Прежде чем раскрывать объяснение, посмотрите, сможете ли вы идентифицировать виновника.
Оценка #6 вашего кода возвращается
True
, когдаsmall big does not equal the goal
. Поскольку результат этой оценкиTrue
(он не равен цели), ваш сценарий возвращаетсяTrue
. Фактически, ваш код будет возвращатьсяTrue
для каждой проверяемой вами комбинации.Чтобы получить ожидаемые результаты, вам нужно будет исправить ошибочную оценку и немного переработать свой код, чтобы учесть это
False
условие.
Как только код будет работать так, как вам хотелось бы, вы всегда сможете консолидировать операции или иным образом провести рефакторинг, чтобы сделать код более экономичным и эффективным.
Комментарии:
1. Просто для того, чтобы добавить понимание к моему ответу, моя цель состояла не в том, чтобы решить проблему для ОП, а в том, чтобы дать подсказку , о чем просил ОП.
Ответ №2:
Это можно решить довольно просто, вот так:
def make_bricks(small, big, goal):
rem = goal - 5 * min( (goal//5), big )
if rem > small:
return False
return True
Выражение min( (goal//5), big )
вычисляет, сколько из предоставленных больших кирпичей поместится.
Ответ №3:
Если вы используете этот код :
def make_bricks(small, big, goal):
return small==goal or big==goal or goal%5==small or small*1 big*5==goal or
goal%5<=small or goal-small*1==big*5
этот код возвращает :
make_bricks(3, 1, 9) → False
make_bricks(3, 2, 9) → False
make_bricks(1, 4, 12) → False
но если использовать: goal-5!=small
для цели=9,маленький=3 :
print(9-5!=3) ---> True
or
Возвращает значение True, если одно из утверждений истинно