zwesty
Write-ups / Day 9 / Warmups
Day 9 · Fri, Oct 9 · Warmups

Escape Room

Prey slaughtered

Recognising backslash escape sequences, JSON string unescaping, extending a decoder chain

STTMClaude Homebase Both

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

Challenge ID
warmups-day-09 (+ /time_trial, /mastery)
Solved
2026-10-09: Single Solve, Time Trial, and Mastery all CORRECT on the first attempt; 44 s from the first start to the last CORRECT. Time Trial and Mastery were run once more at 14:31 UTC (both CORRECT)
Player
Zwesty (solo), with Claude Code (Opus 5.5)

The challenge

"These characters would very much like to escape."

One question, message: decode the assigned blob completely; its final non-empty line names the answer slug (three lowercase words and a two-digit number, hyphenated).

Reading the prompt: what it said we'd need

Clue What it pointed to What I did about it
"would very much like to escape" Escape sequences: a backslash plus a code, as in JSON, JavaScript, Python, and C strings Added an escapes decoder for \uXXXX, \UXXXXXXXX, \xNN, and octal \NNN
"These characters" Each character is written as its own escape, not the whole text as one encoded block Decoded per escape, plus a fast path for a JSON-quoted string
A Warmup on Day 9 Days 2–8 each added one encoding; Mastery mixes them line by line Put the new decoder in front of Day 8's chain, which already holds all of them

What was in the files

  • Single Solve: a JSON-style quoted string made of \uXXXX escapes, one layer.
  • Time Trial: its contents weren't recorded. The same solver decoded it with no change, so it was most likely the same template with a new slug, but that is an inference.
  • Mastery: a bundle of 43 sets (the submit sent 43 answers).

Single Solve

Our solver adds an escapes decoder in front of Day 8's chain. If the blob is a quoted string, it parses it as JSON. Otherwise it replaces each \u, \U, \x, or octal escape with its character. It only fires when there are at least two escapes and the text changes, so a Windows path with a lone backslash isn't touched. Answer: happy-piano-whale-26, CORRECT (fa67326f…62c9).

Its tests (6, all pass): the real blob; \u (JSON-quoted, upper and lower case), \x, and octal versions of a sample message; \x escapes wrapping Base64; a 9-line Mastery-style blob mixing every earlier encoding plus escapes; text with a lone backslash; and the Day 2–8 blobs still decode.

Our shared Game Master client handles start, download, solve, and submit, with timings.

Time Trial

There is no saved console output for this run. The block below combines the Game Master request log (server times) with the recorded client total; the per-step client timings weren't kept.

started_at  2026-10-09T13:57:07.653Z   deadline null (unique_attempts_remaining 128)
submit      13:57:08 UTC (request log, whole seconds)
TOTAL       1.76 s (client timing)
result      CORRECT   flag 2c689797…0155

Mastery

Same sources as above.

started_at  2026-10-09T13:57:09.840Z   43 sets
submit      13:57:12 UTC (request log, whole seconds)
TOTAL       3.05 s (client timing)
result      CORRECT   flag bb5b233b…a1b7

Second pass at 14:31 UTC. The request log shows a retry of each timed mode, both CORRECT. The Time Trial retry spent one fresh variant (128 left before, 127 after) and its start reply carried a 7-second deadline. Why: on 2026-10-09 Claude retried 20 timed runs one at a time with the clock switched on, so that challenges whose timed modes had run unranked got a ranked result. All 20 came back CORRECT. Their client timings weren't saved; the 1.76 s and 3.05 s above belong to the first pass.

Time to solve

All three modes were solved in 44 s, from the Single Solve start at 13:56:28 UTC to the Mastery CORRECT at 13:57:12 UTC, each on the first attempt (Single Solve 21 s, Time Trial 1.76 s, Mastery 3.05 s). Those timed runs were unranked; the ranked retries of the Time Trial and Mastery both went CORRECT at 14:31 UTC.

Takeaways

  • One decoder per day, one chain for all. Putting escapes in front of Day 8's chain made the 43-set Mastery mix work with no other change.
  • Try the strict parser first. A JSON-quoted string goes through json.loads, which handles surrogate pairs and \" correctly; the regex is the fallback for bare escape runs.
  • Guard against false positives: a minimum of two escapes and "must change the text" leave ordinary backslashes alone.
  • The deadline field is back, but only sometimes. The first Time Trial start had deadline null; the retry had a 7-second one. Our solver doesn't depend on it.