`swf`

is dead, a closed-source project shut down by its owner (Adobe) a few years ago.Kazerad, best known as the artist-author of the web comic Prequel Adventure, wrote a touching eulogy for it on twitter here. ]]>

What’s the limit as

The right insight makes it work out rather elegantly, but suppose your math muse is AWOL cavorting in Cancun today — is there a more systematic way to approach these kinds of problems? It turns out that the tools of Robinson’s hyperreal analysis are very good at attacking this stuff.

Since we’re looking at a limit as *n* approaches infinity, the first thing to do is to simply set *n* to infinity — or rather, to an arbitrary infinite hyperreal (all the positive infinite hyperreals are indistinguishable in a deep sense). The second step is to write everything in terms of infinitesimals, so we introduce the infinitesimal *m* = 1/*n* and our expression becomes *x*⋅((^{x}√*x*)^{m} – 1)/*m*.

Now we want to get everything expressed as polynomials of infinitesimals (here just *m*) of as low an order as lets things work out, so we expand the Maclaurin series of all the not-ploynomial-in-*m* stuff. Here that’s only *f* (*m*) ≝ (^{x}√*x*)^{m}, which expands to *f* (0) + *f ’* (0)⋅*m* + *o*(*m*²) = 1 + (ln ^{x}√*x*)⋅*m* + *o*(*m*²) because *f ’ *(*m*) = (ln ^{x}√*x*)⋅(^{x}√*x*)^{m}.

Plugging this back into *x*⋅((^{x}√*x*)^{m} – 1)/*m* gives *x*⋅((ln ^{x}√*x*)⋅*m* + *o*(*m*²))/*m* = *x*⋅((ln ^{x}√*x*) + *o*(*m*)) = *x*⋅(ln ^{x}√*x*) + *x*⋅*o*(*m*). Now, *x*⋅(ln ^{x}√*x*) = ln (^{x}√*x*)^{x} = ln *x*. Also, *x*⋅*o*(*m*) = *o*(*m*) since *x* is finite. So *nx*⋅(^{nx}√*x* – 1) simplifies into ln *x* + *o*(*m*).

Since *m* is infinitesimal, *o*(*m*) disappears when we transfer back into ordinary reals and make *n* a limit index variable once again, and we have lim_{n→∞} *nx*⋅(^{nx}√*x* – 1) = ln *x*. Now, this is certainly more work than substituting in *w* ≝ 1/*nx* and applying l’Hôpital’s rule, but the general technique works on all kinds of limit calculations where *a-ha!* moments become few and far between.

The game supports “achievements”, where whenever your gameplay meets the condition of some challenge (some very easy, some nightmarishly hard, most of medium difficulty), it records this in a log file. Of course, met achievements aren’t all that the log file contains, but it’s nice enough to start each “met achievement conditions” record with “`ACHIEVEMENT`

” and a marginally-descriptive achievement name, followed by other relevant information. Unfortunately, you can’t get a list of your fulfilled achievements merely by running `grep '^ACHIEVEMENT ' hyperrogue.log`

because the game logs when you fulfill an achievement’s conditions separately for every run, not just the first run to fulfill it. So, to extract the records of each achievement’s first fulfillment, we ignore any record with an achievement name we’ve seen before and print out the line otherwise (*ie*, if we haven’t seen it before), which is nigh-trivial in `awk`

[link]:

```
/^ACHIEVEMENT / {
if (!($2 in ach)) {
ach[$2] = 1;
print;
}
}
```

At 86 characters, it’s the fifth example from me of “twitcode” (programs under 140 bytes). And being in `awk`

, it’s the fifth language I’ve twitcoded as well.

“Where are you going from here?”

“I’ll be staying here in London for the next five days.”

“You’re lodging in London?”

“Yes.”

“Why are you coming here?”

“Primarily to visit my family.”

“You’re visiting family, who live in London?”

“Yeah.”

“And when are you leaving?”

“I fly back home on July 1^{st}.”

“You’re flying back to the US on the 1^{st}of July?”

“Yep.”

“And how are you getting to London?”

“I bought a ticket for a National Express bus.” [The “Tube” was shut down due to a labor strike.]

“You’re taking a National Express bus to London?”

“Yup.”

[Dropping the skeptical act] “Very good, welcome to the UK.”

Maybe the idea is somebody fabricating their answers will feel a need to elaborate instead of simply confirming? Whatever. The odder bit was the trip back, where each security officer asked me a strange question.

“Where is your journey starting from?”

“Uh, what?”

“Where is your flight leaving?”

[Borrowing the tone of his countryman] “You want to know the airport my flight departs from?”

“Yes.”

“From this airport, London Heathrow.”

“Very good.”

And then, from ICE:

]]>“What’s in London?”

“Uh, what?”

“You said you flew in from London, what’s there?”

“Well, there are alotof things in London: Parliament, and a stretch of the River Thames, and several bridges over the river, and millions of people, one of whom is a first cousin, and his wife, and —” [at this point, the agent cuts me off, and I don’t even get a “very good”. I guess that’s a British thing.]

The dynamics of the corner and edge cubies are pretty different in this regard, which is probably expected by everybody who’s played around with the Rubik’s Cube that much — edge and corner cubies have very distinct characters in general. As is usual with the Rubik’s Cube, the corner cubies are easier to think about. (I think this is mostly because there are only 8 of them, while there are 12 edge cubies.) So, let’s do them first.

As is often the case, the first thing to do is to simplify the problem. You’ll notice that for any pair of opposite-face colors, every corner cubie will have exactly one face with a member of that pair. We can exploit that fact by “re-coloring” our Cube so that two opposing faces are black and the other four are white. (Two colors are *much* easier to reason about than six!) This results in each corner cubie having one black face and two white ones, which makes for an obvious way to define orientations numerically: A black cubie face on a black Cube face is rotated by 0°, otherwise it’s considered rotated by 120° or −120° as seen around the axis running through the cubie’s corner. This simplification is “valid” because any time a corner cubie is in its home position on the six-colored Cube, it’s oriented exactly the same way it is on the two-colored Cube.

If we rotate one of the Cube’s black faces, we observe that the orientations of all four affected corner cubies have the same values after the rotation as they did before it. If we rotate one of the Cube’s white faces, we see that two of the corner cubies have been rotated by 120° by this definition of orientation, and the other two by −120°. In either case, the sum-total of the cubie orientations is unchanged.

The edge cubies are trickier. We want to define them as either “flipped” or “unflipped”, but our two-color Cube has four edge cubies whose faces are both white, so we can’t stick with the simplicity of having everything black and white anymore. We need to add a third color, gray, which we assign to opposing faces so our Cube has a pair of opposite faces in each color. The 12 edge cubies of this Cube consist of four black/white cubies, four black/gray cubies, and four gray/white cubies.

How do we define “(un)flipped”? Most temping (at least to me) was to have the cubie be unflipped if one (or both) of its faces matched the Cube face it was on. This produces a “valid” convention: flipping a flipped cubie makes it unflipped and vice-versa, and in the home position it’s flipped or not exactly as it is on the six-color Cube. But when we rotate a white face, we have a problem. Consider the case where the face’s two gray/white edge positions are filled by unflipped gray/white cubies and one of the black/white positions is filled by an unflipped black/white cubie, but the other black/white position is occupied by a black/gray cubie with gray facing the black side and black facing the white side. That fourth cubie will be considered “flipped” per the proposed convention, but after rotating the white face its status changes to unflipped, as now its gray side is facing one of the Cube’s gray faces. But the other three edge cubies on the face still have their white sides facing the white face, so all three remain unflipped, so total orientation was not preserved. So while this convention is *valid*, it’s sadly not *useful* for our purpose, and we need to choose a different convention.

What if we say an edge cubie is unflipped if its darker side faces the darker of the two Cube faces it’s between? That passes the validity checks: flipping reverses the “(un)flipped” status and when it’s in the home position it matches the six-color Cube’s orientation. If we rotate a black face, then no edge cubies change their (un)flipped status: each one that had its darker side face the black face was and remains unflipped, and each one that had its lighter side face it remains flipped. Similarly for rotating white faces: edge cubies that do (or don’t) have their lighter sides facing the white face before the move, each still will (or won’t) after the rotation. Well now, for the “flipped” status to not be vacuous, we need something to change it — have we been analyzing a re-coloring that’s valid only because it’s trivial? No, because rotating a gray face “flips” all four of its edge cubies! Each cubie that was between gray and black (so gray was the lighter side) is now between gray and white (so gray is the darker side), and vice-versa.

Flipping groups of four changes the number of flipped cubies by 0, ±2, or ±4 only, so under the darker-faces-darker^{*} convention, the number of flipped (equivalently, 180°-rotated) edge cubies is always even. Hence the sum-total of the edge cubies’ orientations is always zero (under the typical convention that orientations are equivalent mod 360°). And since the sum-total of all corner cubies’ orientations is also always zero, the intuition in “Rotating only one cubie” is indeed justified. (Though it was many years after I developed that intuition before I realized that by re-coloring the Cube I could justify it logically.)

^{*} This “darker” business is why I chose the black/gray/white color scheme. Upon first working this stuff out, I used the “colors” primary/secondary/tertiary, with secondary being “effectively primary” when it was paired with tertiary. Once I knew what I needed to know, thinking about it as darker and lighter shades is easier and clearer than as primary/effectively-primary, but it’s the destination that’s important, the journey can be relegated to footnotes.

`A Mos-Ukr`

A Sev S A Mos-Ukr

A Ukr Holds

A War S A Ukr

A Gal S A Ukr

A Rum S A Ukr

As long as I’m being silly here, note that Ukraine must not attack, as it’d lose the support necessary to hold off Moscow’s attack, and that even if Moscow convinced one of the regions supporting Ukraine to switch to supporting their attack, it’d still fail to overcome the Ukrainian defense.

]]>• All personnel fully vaccinated? Check. ☑

• Frequent testing? Check. ☑

• Quarantined over the incubation period? Check. ☑

• Covid-19 outbreak anyway? Check. ☹

We can’t stop this.

]]>This kind of thing is how humans break computers in that world. Here in reality, it’s how computers break us humans.

]]>