【发布时间】:2017-03-20 18:55:41
【问题描述】:
我正在为 foo.bar 做一个练习,其基本思想是获取一个整数列表并对它做一些事情以导出该列表的特定子集,然后通过异或(用于校验和)这些值其中:
result = 0^1^2^3^4^6
等于 2
另一个例子:
result2 = 17^18^19^20^21^22^23^25^26^29
等于 14
我不太确定这里发生了什么以及这些值 (2, 14) 是如何得出的。
来自 Foo.Bar 的问题的实际描述
> 待办事项队列
您几乎已准备好采取行动摧毁 LAMBCHOP 世界末日设备,但保护 LAMBCHOP 底层系统的安全检查点将成为问题。您能够在不触发任何警报的情况下取下一个,这太棒了!除了作为指挥官 Lambda 的助手,你已经了解到检查点即将接受自动审查,这意味着你的破坏行为会被发现并且你的掩护会被揭穿——除非你能欺骗自动审查系统。
要欺骗系统,您需要编写一个程序来返回与警卫在检查所有工作人员后所拥有的相同的安全校验和。幸运的是,指挥官 Lambda 对效率的渴望不允许排长队,因此检查站守卫已经找到了加快通过率的方法。警卫没有检查每一个通过的工人,而是检查每个排队的人,同时记下他们的安全 ID,然后让队伍重新填满。一旦他们这样做了,他们就会再次越线,这次离开了最后一个工人。他们继续这样做,每次从生产线上多留一名工人,但记录他们检查的那些工人的安全 ID,直到他们跳过整条生产线,此时他们将他们记录的所有工人的 ID 异或到校验和中,然后然后起飞吃午饭。幸运的是,工人们的有序性使他们总是按数字顺序排列,没有任何间隙。
例如,如果队列中的第一个工作人员的 ID 为 0,而安全检查点线路包含三个工作人员,则流程如下所示:
0 1 2 /
3 4 / 5
6 / 7 8
其中守卫的 XOR (^) 校验和为 0^1^2^3^4^6 == 2。
同样,如果第一个工作人员的 ID 为 17,并且检查点有四个工作人员,则该过程如下所示:
17 18 19 20 /
21 22 23 / 24
25 26 / 27 28
29 / 30 31 32
产生校验和 17^18^19^20^21^22^23^25^26^29 == 14。
所有工作人员 ID(包括第一个工作人员)都在 0 到 2000000000 之间(含),检查点行将始终至少有 1 个工作人员。
利用这些信息,编写一个函数 answer(start, length) ,通过输出与守卫通常在午餐前提交的相同校验和来覆盖丢失的安全检查点。在自动审查发生之前,您有足够的时间找出要检查的第一个工人的 ID(开始)和行的长度(长度),因此您的程序必须仅使用这两个值生成正确的校验和。
测试用例
输入:
(int) start = 0
(int) length = 3
输出:
(int) 2
输入:
(int) start = 17
(int) length = 4
输出:
(int) 14
【问题讨论】:
标签: python python-3.x checksum xor