【问题标题】:longest time lazy flappy bird can survive - consecutive gap between 2 arrays最长时间懒惰的小鸟可以生存 - 2个阵列之间的连续间隙
【发布时间】:2017-04-08 23:48:08
【问题描述】:

给定两个数组:

import numpy as np
L1 = np.array([3, 1, 4, 2, 3, 1])
L2 = np.array([4, 8, 9, 5, 6, 7])

我想有效地找到存在的最长连续间隙。

例如,让i 成为两个数组的第 i 个索引。

    i = 0:  elements = (3,4) -> gap in range 3-4 -> longest path = 1
    i = 1: elements = (1,8)  -> 3-4 intersect 1-8 is 3-4 -> longest path = 2
    i = 2: elements = (4, 9) -> 3-4 intersect 4-9 is NULL -> longest path = 2

    ##this is what slows my approach down
    #now, we must return to i = 1

    i = 1: elements = (1,8) -> candidate interval is 1-8 -> path = 1, longest path = 2
    i = 2: elements = (4,9) -> 1-8 intersect 4-9 is 4-8 -> path = 2, longest path = 2
    i = 3: element = (2,5) -> 4-8 intersect 2-5 is 4-5 -> path = 3, longest path = 3
    ...

如果你试着想象它,它有点像flappy bird 游戏,所以我想找到的是这只鸟可以保持在同一水平而不死亡的最长时间

我想要一种不回溯的方法,以便我只遍历每个i 一次。有什么建议么?最好在python中

更新

我写了一些代码来可视化问题(注意我在这里假设最大行数是 10,但情况并非总是如此:

def get_flappy_matrix(ceiling, floor):
    '''
    given ceiling and floor heights
    returns matrix of 1s and 0s
    representing the tunnel
    '''
    ceil_heights = np.array(ceiling)
    floor_heights = np.array(floor)
    nmb_cols = len(ceil_heights)
    flappy_m = np.ones(shape=(10, nmb_cols), dtype=np.int)

    for col in range(nmb_cols):
        for row in range(ceil_heights[col], floor_heights[col]):
            flappy_m[row, col] = 0

    return flappy_m

N = 6
L1 = np.array([3, 1, 4, 2, 3, 1])
L2 = np.array([4, 8, 9, 5, 6, 7])


m = get_flappy_matrix(L1, L2)

plt.pcolor(m, cmap=plt.cm.OrRd)
plt.yticks(np.arange(0, 10, 1), range(0, 11))
plt.xticks(np.arange(0, N+1),range(0,N+1))
plt.title(str(max_zero_len))
plt.gca().invert_yaxis()
plt.gca().set_aspect('equal')
plt.show()

现在,来自另一个 answer,这是解决问题的一种方法(对于大量输入仍然很慢):

max_zero_len = max(sum(1 for z in g if z == 0) for l in m for k, g in itertools.groupby(l))
print(max_zero_len)
 # 5

【问题讨论】:

  • 你将不得不解释更多。 “直线间隙”或“连续间隙”是什么意思?例如,您是否试图找到可以水平射击的最多墙壁,两个阵列代表一系列墙壁中孔的上下边缘?或者你正在做一些完全不同的事情?你让我们在这里猜了很多。
  • 啊,很好,你给了我们更多的细节。
  • @user2357112 是的对不起,我知道它类似于游戏,但我不记得名字了哈哈
  • 对不起,我没有得到你的问题。你能解释更多,或者你能用你的两个数组给出你最终想要的输出吗?这会很有帮助。
  • @ChihebNexus 最后的编辑有帮助吗?

标签: python arrays performance numpy


【解决方案1】:

保持一个窗口鸟可以飞过的连续洞。一次将其在右侧延伸一个孔,并在必要时使用以下策略从左侧移除孔​​。当您到达终点时,您设法构建的最长窗口就是解决方案。

跟踪窗口中最低的上墙,以及该墙之后的最低上墙,以及该墙之后的最低上墙,直到窗口中的最后一个上墙。对较低的墙壁做类似的事情。例如,如果窗口从此处的 3 孔到 9 孔:

    | | | | | | | | upper wall sections
    | | | | | | |
    |   |   |   |
    |   |   |
    |   |   |
... | ------------- window
    | -------------
    |   |
      | | | |     |
    | | | | |   | | lower wall sections
    2 3 4 5 6 7 8 9
    wall numbers

那么上界墙是 6、8 和 9,下界墙是 4 和 9。(我们通过选择右侧的墙来打破平局。)

假设我们把窗户延伸到第十个洞,第十个洞是这样的:

    | | | | | | | | |upper wall sections
    | | | | | | |   |
    |   |   |   |   |
    |   |   |       |
    |   |   |
... | --------------- window
    | ---------------
    |   |
      | | | |     |
    | | | | |   | | | lower wall sections
    2 3 4 5 6 7 8 9 10
    wall numbers

上壁 10 低于上壁 9 和 8,因此 9 和 8 不再是上界。上限现在是 6 和 10,下限现在是 4、9 和 10。

另一方面,如果 10 号洞看起来像这样:

    | | | | | | | | | upper wall sections
    | | | | | | |
    |   |   |   |
    |   |   |
    |   |   |       |
... |               |
    |               |
    |   |           |
      | | | |     | |
    | | | | |   | | |
    2 3 4 5 6 7 8 9 10
    wall numbers

下墙 10 高于最低上限,因此我们需要从窗口左侧移除墙。我们将窗口从第 7 洞开始,移除所有直到旧的最低上限(墙 6),我们发现下一个上限,墙 8,足够高,可以生成一个有效的窗口:

    | | | | | | | | | upper wall sections
    | | | | | | |
    |   |   |   |
    |   |   | ------- window
    |   |   |       |
... |               |
    |               |
    |   |           |
      | | | |     | |
    | | | | |   | | |
    2 3 4 5 6 7 8 9 10
    wall numbers

如果上壁 8 仍然太低,我们会推进窗户从孔 9 开始,依此类推。

【讨论】:

  • 我不太明白你说的最低上墙是什么意思?为什么上界墙是 6、8、9 而不是 4、6、8?
  • @dimebucker91: 4 与 6 并列,所以 6 获胜,因为它在右边。 9 是 8 之后的最低墙,所以它是一个上限。这些是需要从窗户上拆除的墙壁,以便让鸟儿有空间飞得更高。
  • 我们以这种方式打破平局,因为移除 4 号墙之前的所有东西并不会让鸟飞得更高,因为 6 号墙仍在路上。
  • 所以在你的例子中,我们有列表(从第 2 列开始):L1 = [2, 5, 2, 5, 2, 3, 1], L2 = [8, 7, 8, 8, 10, 9, 8] 我仍然对这种方法很困惑,我会尝试围绕列表编写一些逻辑跨度>
  • 当你说跟踪漏洞时,你跟踪的是什么?元组列表?
猜你喜欢
  • 2015-03-26
  • 2017-08-26
  • 2015-11-14
  • 2017-04-12
  • 2016-11-29
  • 2018-07-22
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多