zwesty
Write-ups / Day 15 / Warmups
Day 15 · Thu, Oct 15 · Warmups

Room Forty-Seven

Prey slaughtered

ROT47; guessing the next layer in a series and building for it ahead of time; strict checks against a known sentence so a guess never sends a wrong answer

STTMClaude Homebase Both

Flags are shortened to their first 8 and last 4 characters because they're unique per team.

Challenge ID
warmups-day-15 (+ /time_trial, /mastery)
Solved
2026-10-15: all three modes CORRECT by 09:00:34 ET, 17.7 s from the Single Solve start to the Mastery stamp. Every mode was CORRECT on the first send, all by our automated morning solver, with no hand work
Player
Zwesty (solo), with Claude Code (Opus 5.5): the solver was pre-built the day before; a Claude helper agent wrote up the run

The challenge

"Even the punctuation went for a spin."

One question (message): decode the blob and give the slug its final line tells you to submit (three lowercase words and a two-digit number). Mastery asks the same of 73 blobs.

Reading the prompt: what it said we'd need

Clue What it pointed to What I did about it
"Room Forty-Seven" ROT47: rotate each printable ASCII character by 47 Nothing on the day: ROT47 was already in the pre-built solver
"Even the punctuation" Unlike ROT13 (Day 2) and Caesar 7 (Day 14), the punctuation and digits move too The pre-built ROT47 covers all of ! to ~, so - and digits decode as well
"went for a spin" A rotation, not a new encoding Same family as Days 2 and 14, which is why ROT47 was the first guess on the pre-build list
Warmups history (Days 1–14) Today's layer is stacked on the old ones in Mastery, on the last line The pre-build expected the new layer on line 15 only; it was

What was in the files

  • Single Solve: blob.txt, 107 bytes, one line, all printable ASCII. ROT47 gives the usual sentence: "Nice work decoding this warmup! To solve, submit this exact answer to the Game Master: …".
  • Time Trial: the same template, 109 bytes, a different slug.
  • Mastery: one zip of 73 labelled blobs, 15 lines each. Lines 1–14 carry Days 1–14's layers in day order (Base64, ROT13, hex, binary, decimal, octal, percent, HTML entities, \u escapes, Base32, Base64url, reverse, Atbash, Caesar 7). Line 15, the slug's tail, is ROT47 on all 73. For example 92K6=\ff reads hazel-77: the hyphen turns into a backslash and the digits into letters.

Single Solve

The solver was built before the challenge existed. On Day 14 we pre-built a Day 15 solver that added 23 guessed layers to Day 14's chain (ROT47, Ascii85, Base58, Morse, rail fence, XOR, Vigenère, and more), and set our automated morning solver (a scheduled script on our Kali VM) to use it. The guess that mattered was the first one on the list.

How it answered: - Day 14's chain ran first and stopped ("no instruction line found"), as it does on every Day 15 blob. - The bounded search then found ROT47 at depth 1. The hit had to read as the exact instruction sentence and then a slug whose three words come from the known word lists for each position, so a near-miss couldn't be sent. - Answer sunny-castle-opal-96, solved in 6 ms. CORRECT at 09:00:17 ET, flag 33d0e8f0…88cc.

ROT47 has no key, so no learned key was saved and nothing needed clearing afterwards.

Checked afterwards (on the VM, read-only, no Game Master calls): the saved blobs fed back through the pre-built solver give the same answers as sent (Single Solve, Time Trial, and 73/73 Mastery sets). Day 14's chain alone stops on all of them.

Time Trial

CORRECT on the first attempt. Started as a ranked run: a 30 s clock, Hall of Fame eligible, 255 ranked attempts left (Day 14's timed routes weren't ranked).

started_at  2026-10-15T13:00:23.615Z
deadline    2026-10-15T13:00:53.615Z   (30 s)
answers     1   (ROT47, one line)
artifact    +770 ms after started_at
solve       8 ms
submit      reply +1997 ms (solver TOTAL 2698 ms)
stamped     13:00:24.928Z (+1.31 s after started_at)
result      CORRECT   flag 26ab7786…fd0c

Mastery

CORRECT on the first attempt (73 sets, 90 s clock, ranked).

started_at  2026-10-15T13:00:31.817Z
deadline    2026-10-15T13:02:01.817Z   (90 s)
answers     73   (15 lines each; line 15 ROT47)
artifact    +894 ms after started_at
solve       711 ms (worst blob 22 ms offline)
submit      reply +2943 ms (solver TOTAL 4037 ms)
stamped     13:00:33.932Z (+2.12 s after started_at)
result      CORRECT   flag a1055682…ea80

The solver ran no regression rehearsal for Warmups before the timed modes: it starts them as soon as the Single Solve is CORRECT. That worked today. Had line 15 used a form the pre-build hadn't foreseen, the solver would have stopped without a wrong answer, but the attempt would have been spent.

Time to solve

All three modes were solved by 09:00:34 ET, 17.7 s from the Single Solve start to the Mastery CORRECT, each on the first send with no hand work. Both timed runs were ranked (+1.31 s and +2.12 s).

Takeaways

  • Pre-building paid off on the first try. A day-ahead guess list, ordered by how the titles had been trending (ROT13 → Atbash → Caesar), put ROT47 first, and the lane finished in under 18 seconds with no one at the keyboard.
  • Strict checks are what make guessing safe. The solver carried 23 guessed layers, but an answer only went out if it read as the exact known sentence plus a slug from the known word lists.
  • The Mastery layout held: Day N's blobs have N lines and the new layer sits on the last one, as the pre-build predicted from Days 2–14.
  • Timed routes were ranked today (255 attempts), so these times count on the Hall of Fame, unlike Day 14's.