4

このCodingBat の問題を完了しています。

ゴール インチの長さのレンガの列を作りたいと考えています。小さなレンガ (それぞれ 1 インチ) と大きなレンガ (それぞれ 5 インチ) がいくつかあります。指定されたブロックから選択してゴールを作ることができる場合は True を返します。これは見た目よりも少し難しく、ループなしで実行できます。

make_bricks(3, 1, 8) → True
make_bricks(3, 1, 9) → False
make_bricks(3, 2, 10) → True

私が書いた:

if small + big * 5 >= goal: return True
else: return False

私のエラーは次のとおりです: make_bricks(3, 2, 9)False((2*5)+3=13 は 9 より大きいため、true とします。

make_bricks(2, 1000000, 100003) → False
make_bricks(1, 4, 12) → False

これらのテストに合格したよりも、この答えを見つけました:

if goal > small + big * 5:
  return False
else:
  return goal % 5 <= small

理由がよくわかりません、誰か説明してもらえますか?

4

22 に答える 22

1

5つすべてを使用する必要がない可能性があることを考慮していません。たとえば、コードは次の場合に失敗します。

def make_bricks(3, 2, 9)

ここでは、大きなレンガを 1 つしか使用できません。これにより、差を補うために 4 つの小さなブロックが 2 つだけ残ります。

それが、実際の例が機能する理由です。すべての 5 が使用できない可能性があることを考慮に入れます。

コーディングバットの良いところは、彼らが期待していたことと、試行中に得たものを教えてくれることです。失敗した値を使用してコードを確認し、失敗の理由を確認できます。鉛筆と紙はあなたの友達です。

于 2013-01-05T18:46:43.567 に答える
1
def make_bricks(small, big, goal):
  if (goal%5)<=small and (goal-(big*5))<=small:
    return True
  else:
    return False

試行錯誤した

于 2016-11-11T23:14:26.680 に答える
-1

問題は、ループなしで解決できると述べています。この解決策は私にとってはうまくいきますが、最も効率的ではないかもしれません:

def make_bricks(small, big, goal):
  if (big*5) + small == goal:
    return True
  elif (goal//5) >= goal:
    return True
  elif small >= goal:
    return True
  else:
    bn = goal//5
    sn = goal - (bn*5)

    if big>= bn and sn<=small:
      return True
    elif big < bn and goal<= (big*5) + small:
      return True
    else:
      return False
于 2016-11-24T12:48:02.263 に答える