Dawn and the train are both breaking
when Ethic and Hedge arrive in the woods.
The adventurers
have recovered the first artifact—
the Node of Power—
and have come to the 198forest
in search of the second.
Here they’re welcomed
by the director of the colony, Octavia.
She established this treehouse sanctuary
after the robots freed everyone
from having to work.
It was meant to be a haven
where people could follow their passions,
take up crafts, and find fulfillment.
Which they did… at first.
Some years ago everyone forgot the point.
They abandoned arts and crafts
and instead just painted and exhibited
pictures of themselves
over, and over, and over.
The location of the second artifact
is no secret;
it’s in a tower,
guarded by a garrison of bots,
a bottomless ravine,
and who knows what other traps.
As soon as the tower
went up with the node inside,
human communication
across the land went dark.
Octavia’s been after it for years,
but try as she might,
the defenses thwart her.
In order to even get to the tower,
the team will need a distraction.
Octavia has an idea:
stir up the people
through some well-intentioned vandalism.
The residents’ paintings are all squares
that come in different sizes,
all an odd number of pixels across.
Helper-bots
pick up the finished portraits
and hang them in public places
for everyone to admire.
There’s a slim margin of time
when Hedge can access the paintings.
If he were to deface each one with an X,
the people would blame the helper-bots,
creating just the distraction
the team needs.
If only it were so easy.
Hedge can’t just paint an X—
his painting processor
requires very specific instructions.
Treating the paintings as square grids,
he can fill in one pixel,
or little square, at a time.
He can move forwards
and make 90 degree turns over the canvas,
but can’t move diagonally.
How does Ethic program Hedge
to paint an X over each portrait?
Pause now to figure it out for yourself.
Here’s a hint.
Try drawing a square grid like this,
and simulating Hedge’s path over it.
What patterns can you find to guide him?
Pause now to figure it out for yourself.
The challenge here
is to craft a set of instructions
that will work for any square grid.
Fortunately,
one of the strengths of programming
is the flexibility
to solve not just one problem,
but a whole class of them all at once.
It often helps to start with one case,
and work towards the general.
Let’s say we had this square.
Hedge can measure the length of its sides
and store that number as a variable.
Now, what we need is a plan
for how Hedge will paint an X,
pixel by pixel.
There’s more than one right answer
for how to do this;
let’s look at two.
First, what if Hedge went row by row,
like a typewriter?
If it’s a 9 pixel by 9 pixel painting,
in the first row he’d paint,
skip 7, and then paint again.
In the second row he’d skip the first,
paint, skip 5, and paint.
And so on.
The pattern here is that for each row
the pixels skipped at the beginning
go up by one,
and the pixels skipped in the middle
go down by 2.
Things get more complicated
when Hedge reaches the center.
Here there’s a row
with just one pixel painted.
Then the whole thing reverses—
the number of pixels skipped
goes down by one each time on the left,
and up by two each time in the middle.
Instructing Hedge to do this
with a series of loops will work
and is a perfectly fine solution.
The main drawback is that
this requires quite a bit of logic—
knowing what to do in the middle,
when to reverse the process,
and exactly how to reverse it.
So how might we approach this
so that the logic remains consistent
from start to finish?
The key insight is to look at a grid
as a series of concentric squares.
Each square follows the same pattern—
painted pixels in the corners,
and unaltered pixels in between.
So if we can figure out a way
to paint one nested square,
transition to the next, and repeat,
we can paint them all.
Painting the outermost one is easy.
Start in a corner and paint that pixel.
If we call the length of the painting n,
fly forward n minus 1 spaces.
Paint another pixel, and turn right.
Now do the whole thing again… and again.
Now move forward one less space,
turn right, fly forward once,
and Hedge will be
in the next concentric square
and ready to repeat the whole process.
Each square is n minus 2 pixels smaller
than the last in length and width,
and we can follow this spiral pattern
all the way to the center
with a loop and a variable
that tracks how far Hedge should fly.
Is one of these methods
better than the other?
It really depends on what you value.
The strength of the spiral
is the simplicity of finding a pattern
and reusing the same logic
from start to finish.
The advantage of the typewriter approach
is that it’s a more generalized solution,
meaning it can be adapted
much more simply to fill in any pattern.
For Ethic’s sake,
either will do just fine.
So here’s what happens.
Hedge rapidly defaces
all of the portraits.
And within moments
cries of anguish
break out all over the forest.
The garrison guarding the tower
abandon their posts
to calm the agitated people,
and Ethic, Hedge,
and Octavia slip through—
and nearly slip
into the depths of the gorge
standing between them and the tower.