aboutsummaryrefslogtreecommitdiffstats
path: root/src/17/part2
blob: a0801b88148f474a1aac3f6c75298b8c30971ed0 (plain) (blame)
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
--- Part Two ---

Now for the tricky part: notifying all the other robots about the solar flare.  The vacuum robot can
do this automatically if it gets into range of a robot. However, you can't see the other robots on
the camera, so you need to be thorough instead: you need to make the vacuum robot visit every part
of the scaffold at least once.

The vacuum robot normally wanders randomly, but there isn't time for that today.  Instead, you can
override its movement logic with new rules.

Force the vacuum robot to wake up by changing the value in your ASCII program at address 0 from 1 to
2. When you do this, you will be automatically prompted for the new movement rules that the vacuum
robot should use. The ASCII program will use input instructions to receive them, but they need to be
provided as ASCII code; end each line of logic with a single newline, ASCII code 10.

First, you will be prompted for the main movement routine.  The main routine may only call the
movement functions: A, B, or C. Supply the movement functions to use as ASCII text, separating them
with commas (,, ASCII code 44), and ending the list with a newline (ASCII code 10). For example, to
call A twice, then alternate between B and C three times, provide the string A,A,B,C,B,C,B,C and
then a newline.

Then, you will be prompted for each movement function. Movement functions may use L to turn
left, R to turn right, or a number to move forward that many units.  Movement functions may not call
other movement functions.  Again, separate the actions with commas and end the list with a newline. 
For example, to move forward 10 units, turn left, move forward 8 units, turn right, and finally move
forward 6 units, provide the string 10,L,8,R,6 and then a newline.

Finally, you will be asked whether you want to see a continuous video feed; provide either y or n
and a newline.  Enabling the continuous video feed can help you see what's going on, but it also
requires a significant amount of processing power, and may even cause your Intcode computer to
overheat.

Due to the limited amount of memory in the vacuum robot, the ASCII definitions of the main routine
and the movement functions may each contain at most 20 characters, not counting the newline.

For example, consider the following camera feed:

#######...#####
#.....#...#...#
#.....#...#...#
......#...#...#
......#...###.#
......#.....#.#
^########...#.#
......#.#...#.#
......#########
........#...#..
....#########..
....#...#......
....#...#......
....#...#......
....#####......

In order for the vacuum robot to visit every part of the scaffold at least once, one path it could
take is:

R,8,R,8,R,4,R,4,R,8,L,6,L,2,R,4,R,4,R,8,R,8,R,8,L,6,L,2
Without the memory limit, you could just supply this whole string to function A and have the main
routine call A once.  However, you'll need to split it into smaller parts.

One approach is:


 - Main routine: A,B,C,B,A,C(ASCII input: 65, 44, 66, 44, 67, 44, 66, 44, 65, 44, 67, 10)

 - Function A:   R,8,R,8(ASCII input: 82, 44, 56, 44, 82, 44, 56, 10)

 - Function B:   R,4,R,4,R,8(ASCII input: 82, 44, 52, 44, 82, 44, 52, 44, 82, 44, 56, 10)

 - Function C:   L,6,L,2(ASCII input: 76, 44, 54, 44, 76, 44, 50, 10)


Visually, this would break the desired path into the following parts:

A,        B,            C,        B,            A,        C
R,8,R,8,  R,4,R,4,R,8,  L,6,L,2,  R,4,R,4,R,8,  R,8,R,8,  L,6,L,2

CCCCCCA...BBBBB
C.....A...B...B
C.....A...B...B
......A...B...B
......A...CCC.B
......A.....C.B
^AAAAAAAA...C.B
......A.A...C.B
......AAAAAA#AB
........A...C..
....BBBB#BBBB..
....B...A......
....B...A......
....B...A......
....BBBBA......

Of course, the scaffolding outside your ship is much more complex.

As the vacuum robot finds other robots and notifies them of the impending solar flare, it also can't
help but leave them squeaky clean, collecting any space dust it finds. Once it finishes the
programmed set of movements, assuming it hasn't drifted off into space, the cleaning robot will
return to its docking station and report the amount of space dust it collected as a large, non-ASCII
value in a single output instruction.

After visiting every part of the scaffold at least once, how much dust does the vacuum robot report
it has collected?