Advent Of Code 2022 第十一天 - 猴子在中间
本文是关于 Advent Of Code 2022 的。
编程圣诞日历,圣诞节前每天一个编程问题。
有兴趣的朋友可以在官网答题,用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入,每个人的都不一样。
问题
第十一天终于有点难度了,第一第二部分都是模拟猴子的行为,但是要在第二部分注意怎么解决数值越来越大的问题。
第一部分
当你终于开始逆流而上时,你发现你的背包比你记得的要轻得多。就在这时,你背包中的一件物品从头顶飞过。猴子在和你丢失的东西玩Keep Away!
为了找回你的东西,你需要能够预测猴子会把你的东西扔到哪里。经过仔细观察,你发现猴子的操作是基于 你对每件物品的担心程度 。
你做了一些笔记(你的谜题输入),记录了每只猴子目前拥有的物品,你对这些物品的担心程度,以及猴子如何根据你的担心程度做出决定。比如说。
1 | Monkey 0: |
每只猴子都有几个属性。
Starting items
列出了你对猴子目前持有的每件物品的 担心程度 ,按照它们将被检查的顺序。Operation
显示了当猴子检查物品时,你的担心程度如何变化。(像new = old * 5
这样的操作意味着在猴子检查完物品后,你的担心程度是检查前担心程度的五倍。)Test
显示了猴子如何使用你的担心程度来决定下一个物品的位置。If true
显示了如果Test
是真的话,物品会发生什么。If false
显示了如果Test
是假的,物品会发生什么。
在每只猴子检查完一件物品后,但在测试你的担心程度之前,你对猴子的检查没有损坏物品的欣慰会使你的担心程度 除以3 ,并向下舍入到最近的整数。
猴子们轮流检查和投掷物品。在 一轮 中,它按照所列的顺序,一次检查并抛出它手中的所有物品。猴子 0
先来,然后是猴子 1
,以此类推,直到每只猴子都转了一圈。
当一只猴子把物品扔给另一只猴子时,该物品就会被放在接受物品的猴子列表的 末端 。一只猴子如果开始时没有物品,那么在轮到它的时候,它可能已经检查并抛出了许多物品。如果一只猴子在它的回合开始时没有持有任何物品,它的回合就结束了。
在上面的例子中,第一轮的进行情况如下:
1 | 猴子 0: |
第一轮结束后,猴子们持有的物品都有这些担心程度:
1 | Monkey 0: 20, 23, 27, 26 |
猴子2和3在这一轮结束时并没有拿着任何物品;它们都在这一轮中检查了物品,并在这一轮结束前把它们都扔了。
这个过程又持续了几轮。
同时追赶所有的猴子是不可能的;如果你想拿回你的东西,你必须集中精力对付 两只最活跃的猴子 。在20个回合中计算每只猴子检查物品的 总次数 。
1 | Monkey 0 inspected items 101 times. |
在这个例子中,两只最活跃的猴子检查了101和105次物品。在这种情况下, 猴子的业务水平 可以通过相乘这些来找到 10605
。
通过计算猴子在20个回合内检查了多少件物品来计算出要追赶的猴子。 在20轮抡东西之后,猴子的业务水平是多少?
第二部分
你担心你可能永远无法拿回你的物品。事实上,你非常担心,以至于你因为猴子的检查没有损坏物品 不再使你的担心程度被除以3 。
不幸的是,这种松了一口气的感觉让你的担心程度没有达到 可笑的程度 。你需要 找到另一种方法来保持你的担心程度可控 。
按照这个速度,你可能要忍受这些猴子 很长一段时间 —— 可能是 10000
个回合 !
有了这些新规则,你仍然可以在10000轮之后弄清猴子的事情。使用上述同样的例子:
1 | == 第 1 轮之后 == |
10000轮之后,两只最活跃的猴子检查了52166和52013次物品。把这些乘起来,这种情况下的 猴子业务水平 现在是 2713310158
。
在每件物品被检查后,担心程度不再被三除以;你需要找到另一种方法来保持你的担心程度可控。再从你的谜题输入中的初始状态开始, 10000轮后的猴子业务水平是多少?