本文是关于 Advent Of Code 2022 的。
编程圣诞日历, 圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题, 用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入, 每个人的都不一样。

问题

按照指示解码文件, 然后找到精灵们的位置。

第一部分

猴子回来了! 你担心它们会再次试图偷你的东西,但看起来它们只是坚守阵地,对你发出各种猴子的声音。

最后,其中一只大象意识到你不会说猴子话,于是过来解释。原来,它们无意中听到你说要找到小树林;如果你回答它们的 谜语 ,它们可以告诉你一条捷径。

每只猴子都有一个工作:要么喊出一个特定的数字,要么喊出一个数学运算的结果。所有喊数字的猴子从一开始就知道自己的数字;但是,数学运算的猴子需要等待另外两只猴子喊出一个数字,而这两只猴子可能也在等待其他猴子

你的工作是在猴子们自己算出来之前,算出名为root的猴子将喊出的数字

比如说:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root: pppw + sjmn
dbpl: 5
cczh: sllz + lgvd
zczc: 2
ptdq: humn - dvpt
dvpt: 3
lfqf: 4
humn: 5
ljgn: 2
sjmn: drzm * dbpl
sllz: 4
pppw: cczh / lfqf
lgvd: ljgn * ptdq
drzm: hmdt - zczc
hmdt: 32

每一行都包含一只猴子的名字,一个冒号,然后是这只猴子的工作。

  • 一个单独的数字意味着这只猴子的工作就是喊出这个数字。
  • aaaa + bbbb这样的工作意味着猴子等待aaaabbbb分别喊出它们的数字;然后猴子喊出这两个数字的和。
  • aaaa - bbbb意味着猴子喊出aaaa的数字减去bbbb的数字。
  • 工作 aaaa * bbbb将喊出aaaa的数字乘以bbbb的数字。
  • 工作 aaaa / bbbb将喊出aaaa的数字除以bbbb的数字。

因此,在上面的例子中,猴子drzm必须等待猴子hmdtzczc喊出他们的号码。幸运的是,hmdtzczc的工作都是简单地喊出一个数字,所以他们马上就会这样做。322。猴子drzm可以通过找到32减去2来喊出它的数字: 30

然后,猴子sjmn有它的一个数字(30,来自猴子drzm),并且已经有它的另一个数字,5,来自dbpl。这使得它可以通过找到30乘以5来喊出自己的数字: 150

这个过程一直持续到root喊出一个数字: 152

然而,你的实际情况涉及相当多的猴子。名为root的猴子会喊出什么数字?

第二部分

由于某种猴子-大象-人类的错误翻译,你似乎误解了关于这个谜语的几个关键细节。

首先,你给名为 root 的猴子找错了工作;具体来说,你找错了数学运算。猴子 root 的正确操作应该是 = ,这意味着它仍然在监听两个数字(和以前一样来自两只猴子),但现在要检查这两个数字是否匹配

第二,你为以humn:开头的工作找错了猴子。这不是一只猴子–这是。事实上,你的工作也错了:你需要弄清楚你需要喊什么数字,以便root的检查通过。(在你的输入中出现在humn:后面的数字现在已经不重要了)。

在上面的例子中,你需要喊出的数字是 301 以通过root的检验。(这使得root从它的两只猴子那里得到相同的数字,150。)

你喊什么数字才能通过root的测试?

阅读全文 »

本文是关于 Advent Of Code 2022 的。
编程圣诞日历, 圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题, 用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入, 每个人的都不一样。

问题

按照指示解码文件, 然后找到精灵们的位置。

第一部分

终于到了与精灵们重逢的时候了。然而, 当你试图联系他们时, 你没有得到任何答复。也许你不在范围内?

你知道他们正在前往生长星星果实的小树林, 所以如果你能找出那是哪里, 你应该能和他们会合。

幸运的是, 你的手持设备上有一个文件(你的谜题输入), 其中包含了小树林的坐标。不幸的是, 这个文件是 加密的 –以防设备落入坏人手中。

也许你可以解密它?

当你还在营地的时候, 你无意中听到一些精灵在谈论坐标文件的加密。解密文件所涉及的主要操作被称为 混合

加密后的文件是一个数字的列表。为了 混合 文件, 将文件中的每个数字向前或向后移动一定数量的位置, 相当于被移动数字的值。这个列表是*圆形的, 所以将一个数字从列表的一端移到另一端, 就像两端相连一样。

例如, 在 “4, 5, 6, 1, 7, 8, 9” 这样的序列中移动 1, 1 向前移动一个位置:”4, 5, 6, 7, 1, 8, 9”。接下来移动 -2 的序列, “4, -2 , 5, 6, 7, 8, 9”, 2 向后移动两个位置, 并且从另一边回来:”4, 5, 6, 7, 8, -2, 9”。

这些数字应该 按照它们在加密文件中最初出现的顺序 移动。在混合过程中, 数字的移动不会改变数字的移动顺序。

考虑一下这个加密文件:

1
2
3
4
5
6
7
8
1
2
-3
3
-2
0
4

混合这个文件的过程如下:

1
2
3
4
5
6
7
8
1, 2, -3, 3, -2, 0, 4
2, 1, -3, 3, -2, 0, 4
1, -3, 2, 3, -2, 0, 4
1, 2, 3, -2, -3, 0, 4
1, 2, -2, -3, 0, 3, 4
1, 2, -3, 0, 3, 4, -2
1, 2, -3, 0, 3, 4, -2
1, 2, -3, 4, 0, 3, -2

然后, 通过查看数值 0 之后的第 100020003000 个数字, 必要时环绕列表, 就可以找到小树林的坐标。在上面的例子中, 0 之后的第1000个数字是 4 , 第2000个是 3 , 第3000个是 2 ;将这些数字相加产生 3

将你的加密文件正好混合一次。 构成小树林坐标的三个数字之和是多少?

第二部分

小树林的坐标值似乎毫无意义。当你思考精灵族加密的奥秘时, 你突然想起在营地时偷听到的解密程序的其余部分。

首先, 你需要应用 解密密钥 , 811589153。在你开始之前, 将每个数字乘以解密密钥;这将产生要混合的实际数字列表。

第二, 你需要将数字列表混合 10次 。在混合过程中, 数字被混合的顺序不会改变;数字仍然按照它们在原始的、预先混合的列表中出现的顺序移动。(所以, 如果-3在原来的数字列表中出现在第四位, 那么-3将是每一轮混合中移动的第四个数字)。

用上述同样的例子:

1
2
3
4
5
6
7
8
9
10
11
811589153, 1623178306, -2434767459, 2434767459, -1623178306, 0, 3246356612
0, -2434767459, 3246356612, -1623178306, 2434767459, 1623178306, 811589153
0, 2434767459, 1623178306, 3246356612, -2434767459, -1623178306, 811589153
0, 811589153, 2434767459, 3246356612, 1623178306, -1623178306, -2434767459
0, 1623178306, -2434767459, 811589153, 2434767459, 3246356612, -1623178306
0, 811589153, -1623178306, 1623178306, -2434767459, 3246356612, 2434767459
0, 811589153, -1623178306, 3246356612, -2434767459, 1623178306, 2434767459
0, -2434767459, 2434767459, 1623178306, -1623178306, 811589153, 3246356612
0, 1623178306, 3246356612, 811589153, -2434767459, 2434767459, -1623178306
0, 811589153, 1623178306, -2434767459, 3246356612, 2434767459, -1623178306
0, -2434767459, 1623178306, 3246356612, -1623178306, 2434767459, 811589153

小树林的坐标仍然可以用同样的方法找到。这里, 0 之后的第1000个数字是 811589153 , 第2000个是 2434767459 , 第3000个是 1623178306 ;将这些数字相加得出 1623178306

应用解密密钥, 将你的加密文件混合10次。 构成小树林坐标的三个数字之和是多少?

阅读全文 »

本文是关于 Advent Of Code 2022 的。
编程圣诞日历,圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题,用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入,每个人的都不一样。

问题

优化你的机器人工厂,使它能够生产更多的机器人。

第一部分

你的扫描结果显示,熔岩确实形成了黑曜石!

风向已经改变,不再向你传送熔岩液滴,所以你和大象们离开了洞穴。当你这样做的时候,你注意到池塘周围有一系列的晶洞。也许你可以用黑曜石制造一些 晶洞破开机器人 ,然后把它们破开?

为了收集池塘底部的黑曜石,你需要防水的 黑曜石收集机器人 。幸运的是,附近有大量的粘土,你可以用它来使它们防水。

为了收获粘土,你需要特殊用途的 粘土收集机器人 。要制造任何类型的机器人,你都需要 矿石 ,它也很丰富,但与粘土的方向相反。

收集矿石需要有大钻头的 矿石收集机器人 。幸运的是, 你的背包里正好有一个收集矿石的机器人 ,你可以用它来启动整个行动。

每个机器人每分钟可以收集1种资源类型。机器人工厂(也是从你的背包里拿出来的)建造任何类型的机器人也需要1分钟,尽管它在开始建造时要消耗必要的资源。

机器人工厂有许多 蓝图 (你的谜题输入)可以选择,但一旦你用蓝图配置了它,你就不能改变它。你需要研究出哪种蓝图是最好的。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
Blueprint 1:
Each ore robot costs 4 ore.
Each clay robot costs 2 ore.
Each obsidian robot costs 3 ore and 14 clay.
Each geode robot costs 2 ore and 7 obsidian.

Blueprint 2:
Each ore robot costs 2 ore.
Each clay robot costs 3 ore.
Each obsidian robot costs 3 ore and 8 clay.
Each geode robot costs 3 ore and 12 obsidian.

(为了便于辨认,这里的蓝图都有换行。机器人工厂的实际蓝图种类是每行提供一个蓝图)。

大象开始看起来很饿了,所以你不应该花太长时间;你需要通过计算蓝图能在 24分钟 后最大打开晶洞的数量,即确定建造哪些机器人以及何时建造它们。

在上面的例子中使用蓝图1,你能在24分钟内打开的最大数量的晶洞是 9

然而,通过使用上述例子中的蓝图2,你可以做得更好:你在24分钟内可以打开晶洞的最大数量是 12

通过 将该蓝图的ID号 与使用该蓝图在 24分钟内可打开晶洞的最大数量 相乘来确定每个蓝图的 质量等级 。在这个例子中,第一个蓝图的ID是1,可以打开9个晶洞,所以它的质量等级是 9 。第二个蓝图的ID是2,可以打开12个晶洞,所以它的质量等级是 24 。最后,如果你把列表中所有蓝图的质量等级 加起来 ,你会得到 33

用它在24分钟内能生产的最大数量的晶洞来确定每个蓝图的质量等级。 如果你把列表中所有蓝图的质量水平加起来,你会得到什么?

第二部分

在你选择最佳蓝图的时候,大象自己找到了一些食物,所以你没有那么着急;你想,在风向再次改变之前,你大概有 32分钟 的时间,你需要离开火山爆发的范围。

不幸的是,其中一只大象 吃掉了你的大部分蓝图清单 !现在,你的清单中只有前三张蓝图是完整的。

在32分钟内,蓝图1(来自上面的例子)能打开的最大数量的晶洞是 56

然而,上面例子中的蓝图2仍然更好;使用它,你在32分钟内能打开的最大数量的晶洞是 62

不再有足够的蓝图来担心质量水平 。相反,对于前三个蓝图中的每一个,确定你能打开的最大数量的晶洞;然后,将这三个值相乘。

不要担心质量水平;相反,只要确定你能用前三个蓝图中的每一个打开的最大数量的晶洞。 如果你把这些数字相乘,你会得到什么?

阅读全文 »

本文是关于 Advent Of Code 2022 的。
编程圣诞日历,圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题,用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入,每个人的都不一样。

问题

计算立体物体的表面积。

第一部分

你和大象们终于到达了新鲜空气。你已经出现在一座大火山的底部附近,这座火山似乎正在积极地喷发! 幸运的是,熔岩似乎正在远离你,流向大海。

熔岩的碎片仍在向你喷出,所以你在洞穴出口处又躲了一会儿。在洞外,你可以看到熔岩落在一个池塘里,听到它凝固时发出的响亮嘶嘶声。

根据熔岩中的特定化合物和冷却速度,它可能正在形成黑曜石 !冷却速度应该基于熔岩液滴的表面积,所以当液滴从你身边飞过时,你要快速扫描它(你的谜题输入)。

由于熔岩的移动速度很快,扫描效果不是很好;它的分辨率相当低,因此,它用3D网格上的 1x1x1立方体 来近似熔岩液滴的形状,每个立方体的位置都是x,y,z

为了近似计算表面积,计算每个立方体中没有立即连接到另一个立方体的边的数量。因此,如果你的扫描只有两个相邻的立方体,如1,1,12,1,1,每个立方体将有一个侧面被覆盖,五个侧面暴露出来,总的表面积为 10 面。

这里有一个更大的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2,2,2
1,2,2
3,2,2
2,1,2
2,3,2
2,2,1
2,2,3
2,2,4
2,2,6
1,2,5
3,2,5
2,1,5
2,3,5

在上面的例子中,算上所有没有与另一个立方体相连的边,总表面积是 64

你所扫描的熔岩水滴的表面积是多少?

第二部分

你的计算似乎有些偏差。冷却速度取决于外部表面积,但你的计算还包括被困在熔岩液滴中的气穴的表面积。

只考虑熔岩液滴翻滚到池塘时,水和蒸汽可以到达的外部面。蒸汽会尽可能地膨胀到达,完全取代熔岩液滴外部的任何空气,但绝不会斜向膨胀。

在上面这个较大的例子中,正好有一个立方体的空气被困在熔岩液滴内(在2,2,5),所以熔岩液滴的外表面积是 58

你扫描的熔岩液滴的外表面积是多少?

阅读全文 »

本文是关于 Advent Of Code 2022 的。
编程圣诞日历,圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题,用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入,每个人的都不一样。

问题

模拟盗版俄罗斯方块。

第一部分

你的手持设备已经为你和大象找到了洞穴的另一个出口。地面现在几乎在不断地隆隆作响,但这个奇怪的阀门为你争取了一些时间。不过这里肯定越来越热了。

隧道最终打开,进入一个非常高大、狭窄的房间。巨大又形状怪异的石头从上面落入室内。如果你搞不清楚这些石头接下来会落在哪里,你可能会被压死!

五种类型的岩石有以下奇特的形状,其中#是岩石,.是空隙。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
####

.#.
###
.#.

..#
..#
###

#
#
#
#

##
##

石头按照上面显示的顺序落下:首先是-形状,然后是+形状,以此类推。一旦到了列表的末尾,同样的顺序会重复:-形状的石头会是第1个,第6个,第11个,第16个 etc 落下。

岩石不旋转,但它们确实被从墙壁中喷出的热气推来推去。快速浏览一下,就会发现热气喷流在石头下落时对它们的影响(你的谜题输入)。

例如,假设这是你洞穴中的喷射模式:

1
>>><<><>><<<>><>>><<<>>><<<><<<>><>><<>>

在喷射模式中,<表示向左推,而>表示向右推。上面的模式意味着热气将把落下的石头向右推,然后向右,然后向右,然后向左,然后向左,然后向右,如此循环。如果达到列表的末尾,就会重复。

高大的垂直室正好有 七个单位的宽度 。每块石头出现时,其左边的边缘离左边的墙有两个单位的距离,其底部的边缘比房间里最高的石头(如果没有,则是地板)高出三个单位。

在石头出现后,它交替出现在 被热气喷射 一个单位(往下一个符号所指示的方向),然后 往下掉一个单位 。如果任何运动会导致岩石的任何部分移动到墙壁、地板或停止的岩石中,运动不会发生。如果一个 向下的运动会导致下落的石头移动到地板或已经下落的石头上,那么下落的石头就会在原地停止 ,而一个新的石头会立即开始下落。

@画出下落的石头,#画出停止的石头,上面例子中的喷射模式表现如下。

可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
The first rock begins falling:
|..@@@@.|
|.......|
|.......|
|.......|
+-------+

Jet of gas pushes rock right:
|...@@@@|
|.......|
|.......|
|.......|
+-------+

Rock falls 1 unit:
|...@@@@|
|.......|
|.......|
+-------+

Jet of gas pushes rock right, but nothing happens:
|...@@@@|
|.......|
|.......|
+-------+

Rock falls 1 unit:
|...@@@@|
|.......|
+-------+

Jet of gas pushes rock right, but nothing happens:
|...@@@@|
|.......|
+-------+

Rock falls 1 unit:
|...@@@@|
+-------+

Jet of gas pushes rock left:
|..@@@@.|
+-------+

Rock falls 1 unit, causing it to come to rest:
|..####.|
+-------+

A new rock begins falling:
|...@...|
|..@@@..|
|...@...|
|.......|
|.......|
|.......|
|..####.|
+-------+

Jet of gas pushes rock left:
|..@....|
|.@@@...|
|..@....|
|.......|
|.......|
|.......|
|..####.|
+-------+

Rock falls 1 unit:
|..@....|
|.@@@...|
|..@....|
|.......|
|.......|
|..####.|
+-------+

Jet of gas pushes rock right:
|...@...|
|..@@@..|
|...@...|
|.......|
|.......|
|..####.|
+-------+

Rock falls 1 unit:
|...@...|
|..@@@..|
|...@...|
|.......|
|..####.|
+-------+

Jet of gas pushes rock left:
|..@....|
|.@@@...|
|..@....|
|.......|
|..####.|
+-------+

Rock falls 1 unit:
|..@....|
|.@@@...|
|..@....|
|..####.|
+-------+

Jet of gas pushes rock right:
|...@...|
|..@@@..|
|...@...|
|..####.|
+-------+

Rock falls 1 unit, causing it to come to rest:
|...#...|
|..###..|
|...#...|
|..####.|
+-------+

A new rock begins falling:
|....@..|
|....@..|
|..@@@..|
|.......|
|.......|
|.......|
|...#...|
|..###..|
|...#...|
|..####.|
+-------+

在接下来的每一块石头开始落下的时候,你会看到这样的形状:

可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|..@....|
|..@....|
|..@....|
|..@....|
|.......|
|.......|
|.......|
|..#....|
|..#....|
|####...|
|..###..|
|...#...|
|..####.|
+-------+

|..@@...|
|..@@...|
|.......|
|.......|
|.......|
|....#..|
|..#.#..|
|..#.#..|
|#####..|
|..###..|
|...#...|
|..####.|
+-------+

|..@@@@.|
|.......|
|.......|
|.......|
|....##.|
|....##.|
|....#..|
|..#.#..|
|..#.#..|
|#####..|
|..###..|
|...#...|
|..####.|
+-------+

|...@...|
|..@@@..|
|...@...|
|.......|
|.......|
|.......|
|.####..|
|....##.|
|....##.|
|....#..|
|..#.#..|
|..#.#..|
|#####..|
|..###..|
|...#...|
|..####.|
+-------+

|....@..|
|....@..|
|..@@@..|
|.......|
|.......|
|.......|
|..#....|
|.###...|
|..#....|
|.####..|
|....##.|
|....##.|
|....#..|
|..#.#..|
|..#.#..|
|#####..|
|..###..|
|...#...|
|..####.|
+-------+

|..@....|
|..@....|
|..@....|
|..@....|
|.......|
|.......|
|.......|
|.....#.|
|.....#.|
|..####.|
|.###...|
|..#....|
|.####..|
|....##.|
|....##.|
|....#..|
|..#.#..|
|..#.#..|
|#####..|
|..###..|
|...#...|
|..####.|
+-------+

|..@@...|
|..@@...|
|.......|
|.......|
|.......|
|....#..|
|....#..|
|....##.|
|....##.|
|..####.|
|.###...|
|..#....|
|.####..|
|....##.|
|....##.|
|....#..|
|..#.#..|
|..#.#..|
|#####..|
|..###..|
|...#...|
|..####.|
+-------+

|..@@@@.|
|.......|
|.......|
|.......|
|....#..|
|....#..|
|....##.|
|##..##.|
|######.|
|.###...|
|..#....|
|.####..|
|....##.|
|....##.|
|....#..|
|..#.#..|
|..#.#..|
|#####..|
|..###..|
|...#...|
|..####.|
+-------+

为了向大象证明你的模拟是准确的,他们想知道在 2022个岩石停止后(但在第2023个岩石开始下降前),塔会有多高。在这个例子中,石头塔将有 3068 个单位高。

在2022个石头停止掉落后,石塔会有多少个单位高?

第二部分

大象并不觉得你的模拟是正确的。它们要求知道,在 10000000000个岩石停止后 ,塔会有多高!只有这样,它们才会有足够的信心穿过洞穴。

在上面的例子中,塔会有 1514285714288 个单位高!

10000000000岩石停止后,塔会有多高?

阅读全文 »

本文是关于 Advent Of Code 2022 的。
编程圣诞日历,圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题,用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入,每个人的都不一样。

问题

优化结果问题。

第一部分

传感器将你引向了求救信号的源头:另一个手持设备,就像精灵们给你的那个。然而,你没有看到周围有任何精灵;相反,这个装置被大象包围了!他们一定是在这些隧道里迷路了。他们一定是在这些隧道里迷路了,而其中一头大象显然知道如何打开求救信号。

地面再次发出隆隆声,这次强烈得多。这到底是个什么样的山洞?你用你的手持设备扫描了这个洞穴;它报告说大部分是火成岩,一些灰烬,小块加压气体,岩浆……这不仅仅是一个洞穴,它是一座火山!你需要把大象弄出来。

你需要让大象离开这里,快点。你的设备估计,在火山爆发之前,你还有 30分钟 ,所以你没有时间从进来的路回去。

你扫视了一下山洞,寻找其他的选择,发现了一个管道和释放压力的 阀网络 。你不确定这样一个系统是如何进入火山的,但你没有时间抱怨;你的设备产生了一份报告(你的谜题输入),其中包括每个阀门如果它被打开的 流速 (以每分钟的压力计),以及你可以用来在阀门之间移动的隧道。

在你和大象目前所处的房间里,还有一个标有 AA 的阀门。你估计打开一个阀门需要1分钟,从一个阀门到另一个阀门的任何通道都需要1分钟。你能释放的最大压力是多少?

例如,假设你有以下的扫描输出:

1
2
3
4
5
6
7
8
9
10
Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
Valve BB has flow rate=13; tunnels lead to valves CC, AA
Valve CC has flow rate=2; tunnels lead to valves DD, BB
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
Valve EE has flow rate=3; tunnels lead to valves FF, DD
Valve FF has flow rate=0; tunnels lead to valves EE, GG
Valve GG has flow rate=0; tunnels lead to valves FF, HH
Valve HH has flow rate=22; tunnel leads to valve GG
Valve II has flow rate=0; tunnels lead to valves AA, JJ
Valve JJ has flow rate=21; tunnel leads to valve II

所有的阀门开始都是 关闭 的。你从AA阀开始,但它一定是损坏或卡住了或其他什么:它的流量是0,所以没有必要打开它。然而,你可以花一分钟时间移动到BB阀,再花一分钟时间打开它;这样做将在剩余的 28分钟 内释放压力,流量为13,最终的压力释放总量为 28*13=364 。然后,你可以用第三分钟移动到CC阀门,第四分钟打开它,以2的流量提供额外的 26分钟 的最终压力释放,CC阀门释放的总压力为 52

像这样穿过隧道,在30分钟过去时,你可能会打开许多或所有的阀门。然而,你需要尽可能多地释放压力,所以你需要有条不紊地进行。相反,可以考虑这种方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
== Minute 1 ==
No valves are open.
You move to valve DD.

== Minute 2 ==
No valves are open.
You open valve DD.

== Minute 3 ==
Valve DD is open, releasing 20 pressure.
You move to valve CC.

== Minute 4 ==
Valve DD is open, releasing 20 pressure.
You move to valve BB.

== Minute 5 ==
Valve DD is open, releasing 20 pressure.
You open valve BB.

== Minute 6 ==
Valves BB and DD are open, releasing 33 pressure.
You move to valve AA.

== Minute 7 ==
Valves BB and DD are open, releasing 33 pressure.
You move to valve II.

== Minute 8 ==
Valves BB and DD are open, releasing 33 pressure.
You move to valve JJ.

== Minute 9 ==
Valves BB and DD are open, releasing 33 pressure.
You open valve JJ.

== Minute 10 ==
Valves BB, DD, and JJ are open, releasing 54 pressure.
You move to valve II.

== Minute 11 ==
Valves BB, DD, and JJ are open, releasing 54 pressure.
You move to valve AA.

== Minute 12 ==
Valves BB, DD, and JJ are open, releasing 54 pressure.
You move to valve DD.

== Minute 13 ==
Valves BB, DD, and JJ are open, releasing 54 pressure.
You move to valve EE.

== Minute 14 ==
Valves BB, DD, and JJ are open, releasing 54 pressure.
You move to valve FF.

== Minute 15 ==
Valves BB, DD, and JJ are open, releasing 54 pressure.
You move to valve GG.

== Minute 16 ==
Valves BB, DD, and JJ are open, releasing 54 pressure.
You move to valve HH.

== Minute 17 ==
Valves BB, DD, and JJ are open, releasing 54 pressure.
You open valve HH.

== Minute 18 ==
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
You move to valve GG.

== Minute 19 ==
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
You move to valve FF.

== Minute 20 ==
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
You move to valve EE.

== Minute 21 ==
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
You open valve EE.

== Minute 22 ==
Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure.
You move to valve DD.

== Minute 23 ==
Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure.
You move to valve CC.

== Minute 24 ==
Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure.
You open valve CC.

== Minute 25 ==
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.

== Minute 26 ==
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.

== Minute 27 ==
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.

== Minute 28 ==
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.

== Minute 29 ==
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.

== Minute 30 ==
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.

这种方法可以让你在30分钟内用这种阀门布局释放最大的压力, 1651

计算出在30分钟内释放最大压力的步骤。 你能释放的最大压力是多少?

第二部分

你担心即使采用最佳方法,释放的压力也是不够的。如果你让其中一头大象来帮助你呢?

你需要花4分钟来教一头大象如何按照正确的顺序打开正确的阀门,而你只有 26分钟 来真正执行你的计划。有两个人一起工作会不会更好,即使这意味着有更少的时间?(假设你先教大象,然后再自己打开任何阀门,那么你们两个人同样有整整26分钟的时间)。

在上面的例子中,你可以教大象来帮助你,如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
== Minute 1 ==
No valves are open.
You move to valve II.
The elephant moves to valve DD.

== Minute 2 ==
No valves are open.
You move to valve JJ.
The elephant opens valve DD.

== Minute 3 ==
Valve DD is open, releasing 20 pressure.
You open valve JJ.
The elephant moves to valve EE.

== Minute 4 ==
Valves DD and JJ are open, releasing 41 pressure.
You move to valve II.
The elephant moves to valve FF.

== Minute 5 ==
Valves DD and JJ are open, releasing 41 pressure.
You move to valve AA.
The elephant moves to valve GG.

== Minute 6 ==
Valves DD and JJ are open, releasing 41 pressure.
You move to valve BB.
The elephant moves to valve HH.

== Minute 7 ==
Valves DD and JJ are open, releasing 41 pressure.
You open valve BB.
The elephant opens valve HH.

== Minute 8 ==
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
You move to valve CC.
The elephant moves to valve GG.

== Minute 9 ==
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
You open valve CC.
The elephant moves to valve FF.

== Minute 10 ==
Valves BB, CC, DD, HH, and JJ are open, releasing 78 pressure.
The elephant moves to valve EE.

== Minute 11 ==
Valves BB, CC, DD, HH, and JJ are open, releasing 78 pressure.
The elephant opens valve EE.

(At this point, all valves are open.)

== Minute 12 ==
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.

...

== Minute 20 ==
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.

...

== Minute 26 ==
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.

在大象的帮助下,26分钟后,你能做的最好的事就是释放出总共 1707 的压力。

你和大象一起工作了26分钟,你能释放的最大压力是多少?

阅读全文 »

本文是关于 Advent Of Code 2022 的。
编程圣诞日历,圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题,用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入,每个人的都不一样。

问题

对于信标覆盖范围进行处理。

第一部分

当求救信号将你引向一个巨大的地下隧道网络时,你又感到了地面的隆隆声。你没有时间去搜索它们,但你不需要:你的背包里有一套可部署的 传感器 ,你想象这些传感器最初是为了定位迷失的精灵而建造的。

这些传感器不是很强大,但没关系;你的手持设备表明你离求救信号的来源足够近,可以使用它们。你从背包里拿出紧急感应系统,按下上面的大按钮,感应器就会在隧道里放大。

一旦传感器找到一个它认为会给它带来良好读数的地方,它就会把自己附在一个坚硬的表面上,开始监测最近的信号源 信标 。传感器和信标总是以整数坐标存在。每个传感器都知道自己的位置,并能 精确地确定信标的位置 ;然而,传感器只能锁定一个信标, 传感器距离曼哈顿距离测量。(永远不会出现两个信标与传感器的距离相同的情况)。

传感器很快就会报告他们的位置和最近的信标(你的谜题输入)。比如说:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sensor at x=2, y=18: closest beacon is at x=-2, y=15
Sensor at x=9, y=16: closest beacon is at x=10, y=16
Sensor at x=13, y=2: closest beacon is at x=15, y=3
Sensor at x=12, y=14: closest beacon is at x=10, y=16
Sensor at x=10, y=20: closest beacon is at x=10, y=16
Sensor at x=14, y=17: closest beacon is at x=10, y=16
Sensor at x=8, y=7: closest beacon is at x=2, y=10
Sensor at x=2, y=0: closest beacon is at x=2, y=10
Sensor at x=0, y=11: closest beacon is at x=2, y=10
Sensor at x=20, y=14: closest beacon is at x=25, y=17
Sensor at x=17, y=20: closest beacon is at x=21, y=22
Sensor at x=16, y=7: closest beacon is at x=15, y=3
Sensor at x=14, y=3: closest beacon is at x=15, y=3
Sensor at x=20, y=1: closest beacon is at x=15, y=3

因此,考虑在2,18的传感器;离它最近的信标是在2,15。对于位于9,16的传感器,离它最近的信标是在10,16

将传感器画成S,信标画成B,上述传感器和信标的安排看起来像这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
               1    1    2    2
0 5 0 5 0 5
0 ....S.......................
1 ......................S.....
2 ...............S............
3 ................SB..........
4 ............................
5 ............................
6 ............................
7 ..........S.......S.........
8 ............................
9 ............................
10 ....B.......................
11 ..S.........................
12 ............................
13 ............................
14 ..............S.......S.....
15 B...........................
16 ...........SB...............
17 ................S..........B
18 ....S.......................
19 ............................
20 ............S......S........
21 ............................
22 .......................B....

不过,这并不一定是该地区所有信标的全面地图。因为每个传感器只识别其最近的信标,如果一个传感器检测到一个信标,你就知道没有其他信标离这个传感器那么近或更近。仍然有可能存在信标,只是恰好不是离任何传感器最近的信标。考虑一下位于8,7的传感器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
               1    1    2    2
0 5 0 5 0 5
-2 ..........#.................
-1 .........###................
0 ....S...#####...............
1 .......#######........S.....
2 ......#########S............
3 .....###########SB..........
4 ....#############...........
5 ...###############..........
6 ..#################.........
7 .#########S#######S#........
8 ..#################.........
9 ...###############..........
10 ....B############...........
11 ..S..###########............
12 ......#########.............
13 .......#######..............
14 ........#####.S.......S.....
15 B........###................
16 ..........#SB...............
17 ................S..........B
18 ....S.......................
19 ............................
20 ............S......S........
21 ............................
22 .......................B....

这个传感器最近的信标在2,10,所以你知道没有那么近或更近的信标(在任何标有#的位置)。

求救信号并不是由任何一个目前被传感器捕捉到的信标发出,所以你需要通过计算求救信标在哪里 不可能出现 。现在,让事情变得简单些,计算一下信标不可能只出现在某一行的位置上。

所以,假设你有一个信标和传感器的排列,就像上面的例子一样,在y=10的那一行,你想计算信标不可能存在的位置的数量。该行附近的所有传感器的覆盖范围看起来像这样。

1
2
3
4
5
6
                 1    1    2    2
0 5 0 5 0 5
9 ...#########################...
10 ..####B######################..
11 .###S#############.###########.

在这个例子中,在y=10的那一行,有 26 个位置不能有信标。

请参考你刚刚部署的传感器的报告。 y=2000000的一行中,有多少位置不能包含信标?

第二部分

你的手持设备显示求救信号来自附近的一个信标。求救信标没有被任何传感器探测到,但求救信标的xy坐标必须各不低于0且不大于4000000

为了隔离遇险信标的信号,你需要确定它的 调谐频率 ,这可以通过将它的x坐标乘以4000000,然后加上它的y坐标来找到。

在上面的例子中,xy坐标每个最多可以是20。在这个缩小的搜索区域中,只有一个位置可以有一个信标:x=14,y=11。这个遇难信标的调谐频率是 56000011

找出该遇难信标的唯一可能位置。 它的调谐频率是多少?

阅读全文 »

本文是关于 Advent Of Code 2022 的。
编程圣诞日历,圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题,用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入,每个人的都不一样。

问题

对沙子物理进行模拟。

第一部分

求救信号将你引向一个巨大的瀑布! 实际上,等一下——信号似乎来自瀑布本身,这没有任何意义。然而,你确实注意到有一条小路通往瀑布的 后方

更正:求救信号把你引到了一个巨大的瀑布后面! 这里似乎有一个大的洞穴系统,而信号肯定是指向更里面的。

当你开始往地下深处走的时候,你感觉到地面有片刻的轰鸣。沙子开始涌入山洞!这时,你就会发现,山洞里的沙子越来越多。如果你不尽快弄清沙子的去向,你可能很快就会被困住!你要做的就是把它弄出来。

幸运的是,你对分析坠落物路径的熟悉程度在这里会派上用场。你扫描了你上方洞穴的一个二维垂直切片(你的谜题输入),发现它大部分是 空气 ,只有一些墙面是 岩石

你的扫描追踪了每个坚固的岩石结构的路径,并报告了形成路径形状的x,y坐标,其中x代表向右的距离,y代表向下的距离。每条路径在你的扫描中显示为一行文字。在每个路径的第一个点之后,每一个点都表示从上一个点开始的水平或垂直直线的终点。比如说

1
2
498,4 -> 498,6 -> 496,6
503,4 -> 502,4 -> 502,9 -> 494,9

这个扫描意味着有两条岩石的路径;第一条路径由两条直线组成,第二条路径由三条直线组成。(具体来说,第一条路径由一条从498,4498,6的岩石线和另一条从498,6496,6的岩石线组成)。

沙子从500,0点涌入山洞。

把岩石画成#,空气画成.,沙子的来源画成+,这就变成了。

1
2
3
4
5
6
7
8
9
10
11
12
13
  4     5  5
9 0 0
4 0 3
0 ......+...
1 ..........
2 ..........
3 ..........
4 ....#...##
5 ....#...#.
6 ..###...#.
7 ........#.
8 ........#.
9 #########.

沙子是一次生产 一个单位 的,下一个单位的沙子要等到前一个单位的沙子 停止之后 才会生产。一个单位的沙子大到足以填满你扫描中的一格空气。

如果可能的话,一个单位的沙子总是 下降一步 。如果紧挨着的那块被挡住了(被石头或沙子),沙子单位就会试图向 左下 对角线移动。如果这块牌被挡住了,沙子的单位就会尝试向 右下 对角线移动。只要沙子能够移动,它就一直移动,每一步都试图向下移动,然后向左移动,再向右移动。如果所有三个可能的目的地都被挡住了,那么沙子的单位就会 归于平静 ,不再移动,这时,下一个沙子单位就会在源头产生。

所以,把已经静止的沙子画成 o,第一个沙子单位就会直接落下,然后停止。

1
2
3
4
5
6
7
8
9
10
......+...
..........
..........
..........
....#...##
....#...#.
..###...#.
........#.
......o.#.
#########.

然后第二个单位的沙子直接落下,落在第一个单位的沙子上,然后在它的左边停住。

1
2
3
4
5
6
7
8
9
10
......+...
..........
..........
..........
....#...##
....#...#.
..###...#.
........#.
.....oo.#.
#########.

在总共22个单位的沙子之后:

1
2
3
4
5
6
7
8
9
10
......+...
..........
......o...
.....ooo..
....#ooo##
....#ooo#.
..###ooo#.
....oooo#.
...ooooo#.
#########.

最后,只有另外两个单位的沙子有可能落地:

1
2
3
4
5
6
7
8
9
10
......+...
..........
......o...
.....ooo..
....#ooo##
...o#ooo#.
..###ooo#.
....oooo#.
.o.ooooo#.
#########.

一旦上面显示的所有 24 单位的沙子都停了下来,所有进一步的沙子都会从底部流出,落入无尽的虚空。只是为了好玩,任何新的沙子在永远坠落之前的路径在这里用~表示。

1
2
3
4
5
6
7
8
9
10
11
12
13
.......+...
.......~...
......~o...
.....~ooo..
....~#ooo##
...~o#ooo#.
..~###ooo#.
..~..oooo#.
.~o.ooooo#.
~#########.
~..........
~..........
~..........

利用你的扫描,模拟沙子的下落。 在沙子开始流向下面的深渊之前,有多少单位的沙子会停下来?

第二部分

你意识到你看错了扫描结果。在扫描的底部并没有一个无尽的虚空,有个地板而你正站在上面!

你没有时间去扫描地板,所以假设地板是一条无限的水平线,其y坐标等于 2加上你扫描中任何一点的最高y坐标

在上面的例子中,任何一个点的最高y坐标是9,所以地板在y=11。(这就好像你的扫描包含了一个额外的岩石路径,如-infinity,11 -> infinity,11。) 由于增加了地板,上面的例子现在看起来像这样。

1
2
3
4
5
6
7
8
9
10
11
12
        ...........+........
....................
....................
....................
.........#...##.....
.........#...#......
.......###...#......
.............#......
.............#......
.....#########......
....................
<-- etc #################### etc -->

为了找到安全的地方,你需要模拟落沙,直到一个单位的沙子停在500,0处,完全堵住源头,阻止沙子流入洞穴。在上面的例子中,在 93 单位的沙子落地后,情况最终是这样的。

1
2
3
4
5
6
7
8
9
10
11
12
............o............
...........ooo...........
..........ooooo..........
.........ooooooo.........
........oo#ooo##o........
.......ooo#ooo#ooo.......
......oo###ooo#oooo......
.....oooo.oooo#ooooo.....
....oooooooooo#oooooo....
...ooo#########ooooooo...
..ooooo.......ooooooooo..
#########################

用你的扫描,模拟沙子的下落,直到沙子的来源被堵住。 有多少单位的沙子落到了地上?

阅读全文 »

本文是关于 Advent Of Code 2022 的。
编程圣诞日历,圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题,用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入,每个人的都不一样。

问题

对动态类型列表进行解析和处理。

第一部分

你爬上山头,再次尝试与精灵们联系。然而,你却收到了一个你意想不到的信号:一个 求救信号

你的手持设备肯定还是工作不正常;求救信号的数据包被乱序解码了。你需要对收到的数据包列表(你的谜题输入)重新排序,以解码该信息。

你的列表由成对的数据包组成;成对的数据包之间有一个空行。你需要确定 有多少对数据包的顺序是正确的

lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[1,1,3,1,1]
[1,1,5,1,1]

[[1],[2,3,4]]
[[1],4]

[9]
[[8,7,6]]

[[4,4],4,4]
[[4,4],4,4,4]

[7,7,7,7]
[7,7,7]

[]
[3]

[[[]]]
[[]]

[1,[2,[3,[4,[5,6,7]]]],8,9]
[1,[2,[3,[4,[5,6,0]]]],8,9]

包数据由列表和整数组成。每个列表以[开头,以]结尾,并包含零个或多个逗号分隔的值(整数或其他列表)。每个数据包总是一个列表,并出现在自己的行中。

当比较两个值时:

  • 如果 两个值都是整数 ,那么 低的整数 应该排在前面。如果左边的整数比右边的整数低,则输入的顺序是正确的。如果左边的整数比右边的整数高,输入的顺序就不对了。否则,输入是同一个整数;继续检查输入的下一个部分。
  • 如果 两个值都是列表 ,比较每个列表的第一个值,然后是第二个值,依次类推。如果左边的列表先用完了项目,那么输入的顺序是正确的。如果右边的列表中的项目先用完,则输入的顺序不对。如果列表的长度相同,并且没有比较来决定顺序,继续检查输入的下一部分。
  • 如果 正好有一个值是整数 ,就把这个整数转换成一个列表,其中包含这个整数作为它的唯一值,然后重试比较。例如,如果比较[0,0,0]2,将右边的值转换为[2](一个包含2的列表);然后改用比较[0,0,0][2]的方法找到结果。

使用这些规则,你可以确定例子中的哪些对的顺序是正确的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
== Pair 1 ==
- Compare [1,1,3,1,1] vs [1,1,5,1,1]
- Compare 1 vs 1
- Compare 1 vs 1
- Compare 3 vs 5
- Left side is smaller, so inputs are in the right order

== Pair 2 ==
- Compare [[1],[2,3,4]] vs [[1],4]
- Compare [1] vs [1]
- Compare 1 vs 1
- Compare [2,3,4] vs 4
- Mixed types; convert right to [4] and retry comparison
- Compare [2,3,4] vs [4]
- Compare 2 vs 4
- Left side is smaller, so inputs are in the right order

== Pair 3 ==
- Compare [9] vs [[8,7,6]]
- Compare 9 vs [8,7,6]
- Mixed types; convert left to [9] and retry comparison
- Compare [9] vs [8,7,6]
- Compare 9 vs 8
- Right side is smaller, so inputs are not in the right order

== Pair 4 ==
- Compare [[4,4],4,4] vs [[4,4],4,4,4]
- Compare [4,4] vs [4,4]
- Compare 4 vs 4
- Compare 4 vs 4
- Compare 4 vs 4
- Compare 4 vs 4
- Left side ran out of items, so inputs are in the right order

== Pair 5 ==
- Compare [7,7,7,7] vs [7,7,7]
- Compare 7 vs 7
- Compare 7 vs 7
- Compare 7 vs 7
- Right side ran out of items, so inputs are not in the right order

== Pair 6 ==
- Compare [] vs [3]
- Left side ran out of items, so inputs are in the right order

== Pair 7 ==
- Compare [[[]]] vs [[]]
- Compare [[]] vs []
- Right side ran out of items, so inputs are not in the right order

== Pair 8 ==
- Compare [1,[2,[3,[4,[5,6,7]]]],8,9] vs [1,[2,[3,[4,[5,6,0]]]],8,9]
- Compare 1 vs 1
- Compare [2,[3,[4,[5,6,7]]]] vs [2,[3,[4,[5,6,0]]]]
- Compare 2 vs 2
- Compare [3,[4,[5,6,7]]] vs [3,[4,[5,6,0]]]
- Compare 3 vs 3
- Compare [4,[5,6,7]] vs [4,[5,6,0]]
- Compare 4 vs 4
- Compare [5,6,7] vs [5,6,0]
- Compare 5 vs 5
- Compare 6 vs 6
- Compare 7 vs 0
- Right side is smaller, so inputs are not in the right order

已经 在正确顺序中 的一对的索引是多少?(第一对的索引是1,第二对的索引是2,以此类推。)在上面的例子中,正确顺序的一对是1,2,4和6;这些索引的总和是 13

确定哪些数据包对已经处于正确的顺序。 这些数据对的索引之和是多少?

第二部分

现在,你只需要把 所有 的数据包按正确的顺序排列。不考虑你的接收数据包列表中的空白行。

遇险信号协议还要求你包括两个额外的 分割器 数据包。

lines
1
2
[[2]]
[[6]]

使用与之前相同的规则,将所有数据包(在你的接收数据包列表中的数据包以及两个分隔数据包),整理成正确的顺序。

在上面的例子中,将数据包按正确顺序排列的结果是。

lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[]
[[]]
[[[]]]
[1,1,3,1,1]
[1,1,5,1,1]
[[1],[2,3,4]]
[1,[2,[3,[4,[5,6,0]]]],8,9]
[1,[2,[3,[4,[5,6,7]]]],8,9]
[[1],4]
[[2]]
[3]
[[4,4],4,4]
[[4,4],4,4,4]
[[6]]
[7,7,7]
[7,7,7,7]
[[8,7,6]]
[9]

之后,找到分割器数据包。为了找到这个求救信号的 解码器密钥 ,你需要确定两个分割器数据包的索引,然后将它们相乘。(第一个数据包的索引是1,第二个数据包的索引是2,以此类推。)在这个例子中,分割器数据包是第 10 个和第 14 个,因此解码器密钥是 140

将所有的数据包整理成正确的顺序。 求救信号的解码器密钥是什么?

阅读全文 »

本文是关于 Advent Of Code 2022 的。
编程圣诞日历,圣诞节前每天一个编程问题。

有兴趣的朋友可以在官网答题,用自己喜欢的编程方式去收集星星⭐️。在官网答题需要登陆并下载为你单独生成的谜题输入,每个人的都不一样。

问题

经典的寻路问题,需要找出最短路径。

第一部分

你试着用你的手持设备与精灵们联系,但是你所沿着的河流一定是太低了,无法得到一个像样的信号。

你要求设备提供周围地区的高度图(你的谜题输入)。高度图显示的是当地的网格,网格中每个方格的高度都由一个小写字母表示,其中a是最低的高度,b是次低的高度,以此类推,直到最高的高度z

高度图上还包括你的当前位置(S)和应该获得最佳信号的位置(E)的标记。你当前的位置(S)有海拔a,而应该获得最佳信号的位置(E)有海拔z

你想到达E,但为了节省能量,你应该以 最少的步骤 完成。在每一步中,你可以准确地向上、向下、向左或向右移动一格。为了避免需要拿出你的攀登工具,目标方格的高度最多可以比你当前方格的高度 高一级 ;也就是说,如果你当前的高度是m,你可以走到n的高度,但不能走到o的高度。(这也意味着目标方块的标高可以比你当前方块的标高低很多)。

例如:

1
2
3
4
5
Sabqponm
abcryxxl
accszExk
acctuvwj
abdefghi

在这里,你从左上角开始,你的目标在中间附近。你可以先向下或向右移动,但最终你需要走向底部的 e。从那里,你可以螺旋式地绕到目标。

1
2
3
4
5
v..v<<<<
>v.vv<<^
.>vv>E^^
..v>>>^^
..>>>>>^

在上图中,符号表示路径离开每个方格是向上(^)、向下(v)、向左(<)、还是向右(>)移动。应该得到最佳信号的位置仍然是E.标志着未访问的方格。

这条路径在 31 步内到达目标,是尽可能少的。

从你现在的位置到应该获得最佳信号的位置,所需的最少步骤是什么?

第二部分

当你走到山上时,你怀疑精灵们会想把这里变成一条徒步小道。不过,开始的地方风景不是很好;也许你可以找到一个更好的起点。

为了在徒步旅行时最大限度地锻炼身体,小路的起点应该尽可能低:海拔a。目标仍然是标有E的广场。然而,小路仍然应该是直接的,用最少的步骤来达到目标。因此,你需要找到从 任何海拔 a到标记E的广场的最短路径。

再次考虑上面的例子。

现在,有六个选择的起始位置(五个标有 a的方格,加上标有 S的方格,算作在海拔 a的位置)。如果你从左下角的方格开始,你可以最快速地到达目标。

1
2
3
4
5
...v<<<<
...vv<<^
...v>E^^
.>v>>>^^
>^>>>>>^

这条路径到达目标只需 29 步,是尽可能少的。

从任何海拔a开始移动到获得最佳信号的位置,所需的最少步骤是什么?

阅读全文 »
0%