Make_bricks из codingbat

#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, если одно из утверждений истинно