Quarrying with ComputerCraft Turtles

I just recently began playing with ComputerCraft, which is a very cool Minecraft mod that adds programmable computers.   There are also turtles, which are basically computers that can carry out tasks like mining, digging, attacking, etc.  Turtles are fully programmable using Lua and various APIs.  You can do lots of amazing things with turtles.

This is not something amazing, but just a simple modification I made to the turtle's excavate program that allows you to dig stepped quarries giving easier retrieval of the ores around the edges:

9x9 excavate:

excavate14x14x3 quarry:quarry

 Source. You can copy this script directly to your turtle using the turtle's pastebin program.

To dig a quarry, you specify the diameter d and the number of blocks to dig down at each diameter, h_d.

It's a fun exercise to work out some of the properties of the resulting quarries.  Given a d and h_d, you can dig a quarry that is h_t blocks deep, where h_t=floor(\frac{d}{2}h_d) if d is even and h_t=ceil(\frac{d}{2}h_d) if d is odd.  The total height of the quarry is related to the number of constant-diameter levels, N_l by N_l=\frac{h_t}{h_d}.

Given a d and h_d, the total number of blocks you mine in a quarry, N_b, is found by simply adding up all the blocks at a given level and then adding all the levels.  Noting that d decreases by two blocks each time you make the quarry square smaller,

N_b = h_d[d^2 + (d-2)^2 + (d-4)^2 + ... + (d-2\eta)^2]

where \eta is related to N_l.   Writing this in summation form,

N_b = \sum_{m=0}^{\eta}h_d(d-2m)^2

where \eta=ceil(N_l)-1.  Now, the summation bit is straightforward to see, but the upper limit \eta took some playing around in Mathematica for me to work it out.  This seems to work pretty well, but if anyone can derive this limit (or a better one) more "rigorously", please let me know!

The real goofy vs. regular: A look at skateboarders in the SPoT database

In board sports, riders are "goofy" stance if they lead with their right foot and "regular" stance if they lead with their left. These terms seem to imply that one way is more "correct" or common than the other. I'm goofy, so I'd like to know just how goofy it is to be goofy. It turns out, a little bit goofy.

I checked out the Skatepark of Tampa (SPoT) skateboarder database, which has been maintained for 12 years and is probably the most extensive and detailed online.  The database consists of professional and amateur skateboarders who've been to SPoT for some reason or another.  Given that SPoT has been host to two of the largest annual contests in skateboarding since the mid 90's (the Tampa Pro and the Tampa Am), you can bet that the best have been through the doors. Note that in skateboarding, the term amateur (or am) doesn't necessarily imply that the person is less skilled than a professional - it only implies that the person doesn't have their name on a product yet.

SPoT Database Statistics

Of the 6,047 profiles examined, 12.6% are pro.   4,030 of these profiles had stance data, of which only 44% are goofy.  I personally find this a bit surprising, as I assumed it would be closer to 50%.  To put it mathily, a chi-square test indicated that the difference from 50% is statistically significant, \chi^2(1, N=4030) = 57.65, p < .001 , V= .12  (where V is Cramer's V).

Age
Average 22.79
Median 23

Many of the database entries also included age, which is summarized in the table.  Now, this doesn't necessarily mean that the average age of a competing skateboarder is 23 (I think that may be a tad high). To speculate a bit, I'd guess that the database, which has been maintained for 12 years, adds skaters regularly without deleting older ones.  Assuming that most of the ages are updated over time, the database will accumulate ageing skateboarders who aren't actually active anymore.  For more information about skateboarder age, see this Nerdsday Thursday post.

Also, word clouds are really pretty to look at so, why not, here are the most common first and last names in the database:

SPoT DB Common First Names

SPoT_last_namesNothing surprising here, but it does confirm my previous suspicion about the importance of people named "Mike" in the skate industry.  (Or maybe it's just a common name? Who knows, it's a mystery that will never be solved.)

So there we have it, the archetype skateboarder from the SPoT database is Chris Smith, regular, am, 23.  A very interesting follow up would be to see if there is any link between skateboarding stance, footedness in other sports, and handedness.

If statistics gets you pumped up to go skate, you can leave now.  For the other all of you, here's my favorite winning run from the 2011 Tampa Pro, featuring the very goofy Dennis Busenitz:

Minecraft Calculus: River Crossing Escape

This is a classic introductory calculus problem, with a Minecraft theme.  This particular variation is inspired by example 4 in section 4.5 of Stewart's calculus.

I'll set the scene:  You're weaponless.  You have half a heart and you're being chased by a skeleton archer.  There's a river between you and your cabin.  You need to get to your cabin as quickly as possible!

In more "mathy" terms, you want to get from A to B.  There are three main ways you can do this:

  1. A to B directly, diagonally across the river
  2. A to C and then C to B
  3. At slight angle from A to D and then D to B

We know that swimming is slower than running, so option 1 isn't the best.  Option 2 involves the smallest time in the water, but also the longest distance traveled.

Option 3 is somewhere in between - you spend a bit more time in the water, but the total distance is decreased.  The travel time in this case depends on where exactly point D is.  To find the optimal path, we must find the position of D which minimizes the travel time.  This sounds like calculus!

Let x be the distance between points C and D.  In math terms, |CD|=x.

We first need an expression for the total time traveled in terms of x.  The basic equation for time traveled at constant speed is

t=\frac{distance}{speed}.

The first part of the trip is in the water where we travel from A to D.  We can use Pythagorean's theorem to get this distance as |AD|=\sqrt{x^2+w^2}.  Assuming that we can travel at a speed of v_w in the water, the time for this part is

t_w=\frac{\sqrt{x^2+w^2}}{v_w}.

The land part of the trip involves traveling what's left over of l after having already traveled x, so |DB|=l-x.  Traveling at v_l on land, the time for this part of the trip is

t_l=\frac{l-x}{v_l}.

The total trip time, T(x), is just the sum of these two.

T(x)=\frac{\sqrt{x^2+w^2}}{v_w}+\frac{l-x}{v_l}     (1)

To optimize this function with respect to x, we need to find where it is stationary and then verify that this point is a minimum.  This means we want to find a place where the function isn't changing with small changes in x.  In other words, we want to find a spot where the derivative is zero.

Taking the derivative gives:

T'(x)=\frac{x}{v_w\sqrt{x^2+w^2}}-\frac{1}{v_l}

Setting this equal to zero, we can solve for x:

x=\frac{v_ww}{\sqrt{v_l^2-v_w^2}}     (2)

Let's plug in some numbers!  In Minecraft, you can swim at about 2.2 m/s and sprint at 5.6 m/s.  Let's take the river width w to be 7 blocks (1 block = 1 meter).  Plugging in, we find that x=2.9.  At this point, though, we can't tell if this is a maximum or a minimum.  One way to find out is to examine the curvature of the function at this point by using the 2nd derivative:

T''(x)=\frac{1}{v_w\sqrt{x^2+w^2}}(1-\frac{x^2}{x^2+w^2})

Plugging in x=2.9, we see that T''(2.9)=0.04 which, being positive, means that x=2.9 is a minimum point for T(x).  Visually:

crossing

 

So if you want to get to your cabin as quickly as possible, the fastest route is to swim across the river to a point D that is 2.9 meters from point C and then run the rest of the way.

This is actually a general problem.  Try replacing the speeds I used with speeds for soul sand, crouching and walking, a boat, etc. and see what happens!  Particularly, what happens to (2) if you can travel more quickly in the water than on land?

 

Scratch Work

Finding T'(x):  First, rewrite the square root as a power,  T(x)=\frac{(x^2+w^2)^{\frac{1}{2}}}{v_w}+\frac{l-x}{v_l}

Differentiating, using the chain rule on the first term,  T'(x)=\frac{\frac{1}{2}(x^2+w^2)^{-\frac{1}{2}}(2x)}{v_w}-\frac{1}{v_l}=\frac{x}{v_w\sqrt{x^2+w^2}}-\frac{1}{v_l}

Finding T''(x):  Starting with T'(x)=\frac{(x^2+w^2)^{-\frac{1}{2}}x}{v_w}+\frac{1}{v_l}, we differentiate with respect to x.  Note that the derivative of \frac{1}{v_l} with respect to x is 0, so we only have to deal with the first term.  Using the product rule and chain rule:

T''(x)=\frac{-\frac{1}{2}(x^2+w^2)^{-\frac{3}{2}}(2x^2)}{v_w}+\frac{(x^2+w^2)^{-\frac{1}{2}}}{v_w}

Cleaning up with some algebra:

T''(x)=\frac{-x^2}{v_w(x^2+w^2)^{\frac{3}{2}}}+\frac{1}{v_w\sqrt{x^2+w^2}} =\frac{1}{v_w\sqrt{x^2+w^2}}(1-\frac{x^2}{x^2+w^2})