Codingbat make_bricks在python中使用while循环超时

时间:2016-07-25 12:30:11

标签: python python-3.x

我的目标是: 我们想制作一排长达一英寸的砖块。我们有许多小砖(每块1英寸)和大砖(每块5英寸)。如果可以通过从给定的砖块中选择来实现目标,则返回True。

我的代码是:

def make_bricks(small, big, goal):
  if small + 5*big < goal:
    return False
  elif small + 5*big == goal:
    return True
  else:
    while small > 0:
      small -= 1
      goal -= 1
      if goal % 5 == 0 and big >= goal/5:
        return True
    return False

在我的IDLE中这很好用,但是编码导致了TimedOut。是不是因为大数while循环太慢了?我使用的是python 3.2.5。

编辑:

我尝试了另一个代码:

def make_bricks(small, big, goal):
  if small ==0:
    if goal % 5 == 0 and goal / 5 <= big:
      return True
    else:
      return False
  elif small + 5*big < goal:
    return False
  elif small + 5*big == goal:
    return True
  else:
    while small > 0:
      small -= 1
      goal -= 1
      if goal % 5 == 0 and big >= goal/5:
        return True
    return False

但同样的问题。

3 个答案:

答案 0 :(得分:0)

好的,我知道为什么它不起作用。你的代码会起作用。但是如果有loop大约~229500(我试图在codebat上找到限制值,但有时它会在此值超时,有时它不会。但是值为230k左右)正如你所说:一次性,每个值都会超时。总而言之,您的代码正常运行,但对于make_bricks(1000000, 1000, 1000100) → True测试,循环过大,Codebat崩溃。

因此,如果你想让它在Codebat上运行,你必须摆脱while语句:

def make_bricks(small, big, goal):
    if small>=5 :
        if (goal - (big + (small // 5 - 1)) * 5) <= (small % 5 + 5):
            return True
        else:
            return False
    else :
        if (goal - big * 5) % 5 <= (small % 5) : 
            return True
        else :
            return False

small//5返回whole division。 我认为这是有道理的。 (这应该是编辑对不起)

答案 1 :(得分:0)

我有类似的问题。我认为CodingBat不支持+=-=等。因此,如果更改包含该行的行,则不应获得超时。例如,small -= 1将变为small = small - 1。我对其进行了测试,并最终在CodingBat中工作了。

答案 2 :(得分:0)

只需根据大砖块累积大于或小于目标来对if语句进行分类。

def make_bricks(small, big, goal):
  if (5*big) >= goal:
    return (goal%5) <= small
  if (5*big) < goal:
    return (goal - 5*(big)) <= small
相关问题