【问题标题】:Foobar Bringing a Gun to a Guard Fight OptimizationFoobar 将枪带入警卫战斗优化
【发布时间】:2020-08-25 15:34:39
【问题描述】:

我正在考虑挑战"Bringing a Gun to a Guard Fight" by Google Foobar(为方便起见,也在问题底部定义)。

我在链接的文章中得出了相同的结论,最好通过反映房间来解决问题。然而,文章建议我们首先生成一个镜像房间框,其中高度和宽度由我们可以在枪距离内向上和横向镜像房间的最大次数定义 (ceil((player_position + laser distance) / room_size))。然后,我们将删除所有对角线在框外的部分

但是,这很容易导致效率低下,因为我们必须生成比枪距离允许的更多的点。随着火炮距离的增加,这种低效率会增加。

但是,我无法找到解决此问题的任何方法。为问题生成分数的最佳方法是什么?

=================================

呃-哦 - 你被一名指挥官 Lambdas 精英守卫逼到了墙角! 幸运的是,你从一个废弃的哨所里抓到了一把光束武器 当你跑过车站时,你有机会 争取你的出路。但光束武器对 你和精英守卫一样:它的光束反射墙壁, 这意味着您必须非常小心地射击以避免 向自己弹射!

幸运的是,光束在之前只能行进一定的最大距离 变得太弱而无法造成伤害。你也知道,如果光束击中 拐角处,它会以完全相同的方向弹回。和的 当然,如果光束击中你或守卫,它会停止 立即(尽管很痛苦)。

写一个函数解(dimensions, your_position, guard_position, distance),它给出了一个由 2 个整数组成的数组,其宽度和高度为 房间,你的 x 和 y 坐标的 2 个整数数组 房间,一个由 2 个整数组成的数组,其中包含守卫的 x 和 y 坐标 房间,并返回一个整数的不同方向的数量, 考虑到最大距离,你可以开火击中精英守卫 光束可以传播。

房间的尺寸为整数 [1

例如,如果你和精英守卫被安置在一个房间里, 尺寸 [3, 2]、your_position [1, 1]、guard_position [2, 1] 和 最大拍摄距离为 4,您可以拍摄七种不同的 击中精英守卫的方向(作为来自您的矢量方位) 位置):[1, 0], [1, 2], [1, -2], [3, 2], [3, -2], [-3, 2] 和 [-3, -2]。作为具体例子,方位[1, 0]处的炮弹是距离为1的直线水平炮弹,方位角[-3,-2]处的炮弹 在击中前先从左壁反弹,然后从底壁反弹 精英后卫,总射门距离为 sqrt(13),射门为 轴承 [1, 2] 在击中精英之前仅从顶壁反弹 总射门距离为 sqrt(5) 的后卫。

测试用例 ========== 您的代码应通过以下测试用例。请注意,它也可能针对此处未显示的隐藏测试用例运行。

Python 案例

输入:solution.solution([3,2], [1,1], [2,1], 4) 输出:7

输入:solution.solution([300,275], [150,150], [185,100], 500) 输出: 9

【问题讨论】:

    标签: algorithm optimization


    【解决方案1】:

    生成下一个房间只是将其镜像到选定的方向。然后我们有两个新点,一个给后卫,一个给我们自己。我们可以将其作为一个迭代,一个房间一个房间地进行,具有恒定的空间和时间。一种对我有用的方法,虽然对代码来说并不简单,但是对线进行哈希处理(从 origin-us 到新镜像的守卫),因为我们需要能够确定新点是否在我们已经触发并命中的线上一个守卫,以及其他一些检查。

    此外,由于我们逐个房间遍历,因此我们可以在距离太远时停下来,而不会产生额外的房间。

    至少有一个已发布的代码看起来比我建议的要紧凑得多,但我不明白。看起来它正在概括转换,但我无法遵循它。

    【讨论】:

    • 你能提供一个代码示例吗?我不确定我是否理解散列线的帮助
    • @nii75435eoopy 对于 foobar,我宁愿不提供代码。如果我们向后卫射击,则有两个点,即原点,即为我们站立的输入提供的位置。第二点,警卫站在那里,当我们穿过时,每个镜像房间里都有一个。原点是一样的。两点组成一条线,我们可以散列谁的方程参数。
    • @nii75435eoopy 很明显,如果我们在同一条线上射击,我们只能击中那条线上最近的后卫实例。
    • 啊,我明白了。我认为优化不止于此。我已经在我的最终提交中实现了这一点。不过谢谢。
    【解决方案2】:

    ceil((player_position + laser distance) / room_size) 还不够

    对于以下情况:

    solution([20, 20], [2, 2], [2, 4], 5)
    

    您仍然需要为左侧创建反射

    我发现这个公式效果更好:

    x_reflect = max(int(float(your_position[0] + distance) / dimensions[0]), abs(int(floor(float(your_position[0] - distance) / dimensions[0]))))
    y_reflect = max(int(float(your_position[1] + distance) / dimensions[1]), abs(int(floor(float(your_position[1] - distance) / dimensions[1]))))
    

    我会写它作为评论,但我没有足够的积分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2015-09-27
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 2012-12-24
      相关资源
      最近更新 更多