Karel捍卫民主


你的首要任务是解决 Karel 世界中一个简单的故事问题。

Karel捍卫民主

2000年美国总统大选中出现了“悬挂式碎片(hanging-chad)”问题。投票时,选民需要在纸质选票上戳穿一列小孔,但如果只戳了一半,这一列就会留下“悬挂碎片”,导致计票和重新计票时出现错误。

在Karel的世界里,一张选票由一系列可以“打孔”的列组成。Karel从选票最左侧出发,依次检查每一列。如果某一列的中间行有蜂鸣器,说明选民并不打算在这一列投票,Karel应直接前进到下一列。如果中间行没有蜂鸣器,Karel就要检查该列上下两个角落,确保没有“悬挂碎片”——也就是要把这两个角落的所有蜂鸣器都清理掉(每个角落可能有多个蜂鸣器)。最后,Karel需要在选票最右端、面朝东结束。

下图左侧是一个示例初始世界,右侧是Karel完成任务后应达到的最终世界状态(以左侧初始世界为输入)。

请注意以下关于世界的设定:
Karel 初始时面朝东,位于 (1, 2),背包中有无限个蜂鸣器。
Karel 必须在第2行(2nd street)最右端、面朝东结束。
世界由任意数量的高为3的列组成,Karel 可以沿中间一行自由前进,不会遇到墙。

请根据上述描述实现 Democracy Karel。建议使用辅助函数(helper functions),先思考“Karel 需要完成哪些高层步骤?”,并将这些步骤分别写成函数。你的程序应能适配所有满足上述条件的世界。

如果你在起始项目中编写代码,请在 DemocracyKarel.py 的 main() 函数中实现。测试时,在终端输入:
python3 DemocracyKarel.py(Windows 用户可用 pypython 替换 python3)。