【问题标题】:What is the proper way to make comparisons between nested values in this nested list situation?在这种嵌套列表情况下,比较嵌套值的正确方法是什么?
【发布时间】:2019-08-08 09:12:07
【问题描述】:

在我们的工程师周中,我的学校举办了代码挑战赛。您不能使用解决大部分问题的库。这是我的问题。

[>][ ][<]
[ ][^][ ]
[ ][<][ ]

给定一个任意大小、任意数量的飞机、任意步骤的机场的 ASCII 艺术,解析文本文件并做三件事。

1) 给定一个步骤,找出哪架飞机会相撞,用'x'标记飞机

2) 给定一个步骤,找出哪架飞机会飞离网格而不会相互碰撞,用“o”表示。例如,[ ][ ][&lt;] 将在步长为 3 的情况下飞离。

3) 给定一个步骤,如果飞机没有飞离网格并且没有坠毁,则在下一个着陆点替换它

我写了一些东西,可以把上面的文本文件变成一个嵌套列表,还可以获取所有水平面的当前和未来坐标。

我目前正在开发一个名为updated_airfield 的函数,我可以在其中用“x”或“o”标记飞机或将它们移动到另一个位置。这个谜题的逻辑部分让我很生气。下面是我的 update_airfield 函数在给定步长为 2 后基于上述 ASCII 机场的输入。

# ROW 1 [>][ ][<] or ('>', 0, 0)(' ', 0, 1)('<', 0, 2)
# AFTER adding the step and formatting the output

[('>', 2), ('<', 0)]

# I took the 2nd element because its blank and I also removed the x_axis 
# because we only need to go along the horizontal line. 

然后我可以做的下一步是在编号的位置值之间进行数学比较。如果结果 >= 0,那么我知道他们要么都降落在同一个地方,要么他们互相穿过,所以他们坠毁了。然后我可以将'>'和'

这是我被困在试图以任何给定步骤补偿任何规模、任何数量的飞机的机场的地方。那么你如何开始解决这样的问题呢?标准 python 中是否有数据结构可以帮助我跟踪哪架飞机会相互碰撞?对于在垂直方向上下移动的飞机,我也必须做同样的事情。我正在考虑使用有序字典映射所有内容,但不知道如何进行。任何帮助是极大的赞赏。我希望我已经足够清楚了。

【问题讨论】:

    标签: python string list indexing nested


    【解决方案1】:

    您实际上不必比较数组。除非您有大量的步骤或字段,否则最简单的方法是通过播放指示来模拟每个步骤。顺便说一句,哪个符号表示向下?

    Initial state
    [>][ ][<]
    [ ][^][ ]
    [ ][<][ ]
    
    Step +1
    [ ][X][ ]
    [ ][ ][ ]
    [<][ ][ ]
    
    Step +2
    [ ][X][ ]
    [ ][ ][ ]
    [L][ ][ ]
    

    等等。您必须小心不要在一个步骤中移动同一平面。为了避免这种情况并保持事情相对简单,您可以创建一个结构来保存飞机状态,并创建一个数组来保存位置以检查碰撞(这只是一种优化)。

    我会使用伪代码。

    你的飞机类可以包含:

     originalX; 
     originalY;
     currentX; 
     currentY;
     state # on the field, left, collided
     stepNoLeft;
     stepNoCollided;
     ListcollidedWith  - optional
    

    将飞机放在一个列表中,该列表将用作队列。 创建一个二维数组来保存当前位置(只是为了回顾你碰撞过的飞机)。如果该字段非常稀疏(数千个单元格和几架飞机,您可能会考虑使用不同的结构。可能是列表映射或多映射,在这种情况下,您将拥有的唯一数组将是飞机列表,以及他们与谁发生了碰撞。所以该字段可以是一个多映射(列表的映射),其中键是 x/y 位置。让我们使用一个多映射,因为这样会更通用。

    清理字段映射(用于下一步) 遍历飞机列表并将飞机放在地图中的“现场”/上。第一步你不应该有坐标碰撞。 如果飞机发生碰撞,它可能不应该移动或飞走。你可以跳过已经飞走的平原(它们不会改变方向,所以一旦离开田野就安全了。地图仍然可以追踪那些,但我们不必这样做) 请注意,以下情况可能是有效的:平面在一个文件中相互跟随:

    step 0 [ ][<][<][ ]
    step 1 [<][<][ ][ ]
    

    更新当前的 X,Y 并将其放入多重映射中,或者如果它正在离开场,则将其标记为场外。 (此时您可以检查目标单元格是否被占用,但可以等待步骤结束) 在该步骤结束时,迭代地图并标记具有多架飞机的单元格以进行碰撞。

    冲洗并重复

    示例:

     For the Initial state
    [>][ ][<]
    [ ][^][ ]
    [ ][<][ ]
    

    看起来像这样:

    tuple: (x,y,direction,id)
    step 0: airplanes( (0,0,'>', 'A') , (0,2,'<', 'B') , (1,1,'^', 'C') ,(2,1,'<', 'D')
    step 1: airplanes( (0,1,'>', 'A') , (0,1,'<', 'B') , (0,1,'^', 'C') ,(2,0,'<', 'D')
    
    map step1:
    key: 0-1 : A,B,C – collided at step1
    key:2-0: D
    

    第 2 步:飞机( (0,1,'>', 'A') , (0,1,'

    airplanse A,B,C don't move  (let's assume that once there was a collision they don't move)
    airplane D – has left the field
    
    map step1:
    key: 0-1 : A,B,C – collided at step1
     D is not in the map
    

    由于 python 有很好的内置列表和地图,您不需要任何库。

    【讨论】:

    • 谢谢。我刚刚为我的飞机课写完“未来展望”方法。然后,我尝试通过检查“>”是否总是小于“
    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2011-03-26
    相关资源
    最近更新 更多