zwesty
Write-ups / Day 6 / Warmups
Day 6 · Tue, Oct 6 · Warmups

Eight Is Enough

Prey slaughtered

Octal · telling octal from decimal · scoring decodes when a word is split across lines · checking a fix against every past 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-06 (+ /time_trial, /mastery)
Solved
2026-10-07, all three modes, in 4 min 18 s from the first start (15:41:34 → 15:45:53 UTC); Mastery on its second attempt
Player
Zwesty (solo), with Claude Code (Opus 5.5)

The challenge

Someone counted on eight fingers. Again.

The question, word for word Days 1–5: decode the blob completely and submit the slug its final non-empty line names. Answer format: word-word-word-NN, trimmed. Mastery: 28 blobs.

Reading the prompt: what it said we'd need

Clue What it pointed to What I did about it
"Counted on eight fingers" Base 8, octal Nothing new: the Day 4 solver had an octal decoder added two days early
"Again" A callback to Day 3's Hex Appeal ("sixteen fingers") —
"Eight Is Enough" (the title) The same —
Mastery gains a line each day Six lines this time, the last one octal Test a six-line blob, including an octal line that also reads as valid decimal

What was in the files

116 151 143 145 040 167 157 162 153 040 …

Nice work decoding this warmup! To solve, submit this exact answer to the Game Master: hearty-raven-clover-39

How to read octal by eye: three digits, each 0–7. 040 is a space, 141–172 are a–z, 101–132 are A–Z, and 055 is a hyphen. An 8 or a 9 anywhere means it isn't octal.

The trap between octal and decimal: lowercase letters in octal (141–172) are over 127 as decimal, so reading them as decimal fails. But digits and hyphens don't: 055 064 062 ("-42" in octal) is "7@>" in decimal, which is perfectly printable. A slug's ending can be read both ways. The solver has a test for exactly that.

Mode Delivered as Raw format
Single Solve blob.txt, 435 B The sentence as space-separated octal
Time Trial blob.txt, 431 B The same
Mastery One zip of blob-01..28.txt (13,926 B) Six labelled lines: Base64, ROT13, hex, binary, decimal, octal

Single Solve: CORRECT in 26 seconds

Started at 15:41:34 UTC. The solver read it in one octal layer: hearty-raven-clover-39. CORRECT at 15:42:00, flag 255c2910…9d1b. The solver just loads Day 4's by path; 4 tests passed before the timed runs.

Time Trial: 1.83 s of a 6-second clock

started_at 2026-10-07T15:42:05.156Z  deadline 2026-10-07T15:42:11.156Z
  artifact blob.txt 431 bytes sha256 49b4b24c7acf4841… (checked)
  message: tidy-castle-clover-76
  start         758 ms
  artifact      333 ms
  solve           1 ms
  submit        740 ms
  TOTAL        1832 ms
result CORRECT  flag ca8c8391…4b46

Mastery: one wrong answer, then CORRECT

Attempt 1: 27 of 28 right, so the submit was incorrect

started_at 2026-10-07T15:42:14.303Z  deadline 2026-10-07T15:42:21.303Z
  start        4559 ms      <- usually about 500 ms
  artifact      778 ms
  solve          24 ms
  submit       1160 ms
  TOTAL        6521 ms      <- under 0.5 s to spare
result incorrect

The wrong answer was blob-16's. Its slug, dashing-puzzle-badger-25, was split across the last two lines:

Line Encoding Decodes to
05 Decimal "Game Master: dashi"
06 Octal "ng-puzzle-badger-25"

The per-line decoder ranks each line's candidates by how many common English words they contain. For line 6:

Candidate Common words Picked?
octal → ng-puzzle-badger-25 (right) none no
octal + ROT13 → at-chmmyr-onqtre-25 "at" yes

"at" was a fragment at the edge of the line that happened to be a real word. Together with line 5, the solver produced dashiat-chmmyr-onqtre-25: slug-shaped, so nothing stopped it. It was the first wrong answer any warmup solver had sent. Day 4's failures had stopped before submitting.

The fix, and how it was checked

A word that touches the very start or end of a chunk no longer counts, because it may be part of a word split across lines. With "at" ignored, the two candidates tie on words, tie on readability, and the one with fewer layers (octal alone) wins.

Checked before the retry: - All 108 real Mastery blobs from Days 2–6 re-decoded. The 62 with answers the Game Master had accepted (all of Days 2–5) matched exactly. Blob-16 now gives dashing-puzzle-badger-25. - Every warmup's tests pass, plus blob-16 as a new regression test. - An honest note: my first regression check reported "0 regressions" but had compared nothing. The answers it looked for aren't stored where it looked. I caught the empty comparison and redid it against the Game Master request log, which records every submitted answer.

Attempt 2 (retry): CORRECT

started_at 2026-10-07T15:45:51.114Z  deadline 2026-10-07T15:45:58.114Z
  retry        3440 ms
  start         464 ms
  artifact     1372 ms
  solve          30 ms
  submit        676 ms
  TOTAL        5982 ms
result CORRECT  flag b204eab1…2390

The server was slow both times (a 4.6 s start, then a 3.4 s retry). The solve itself took 30 ms for 28 six-line blobs. The timing risk is now on the server's side.

Time to solve

All three modes were solved on 2026-10-07 by 15:45:53 UTC, 4 min 18 s after the first start. The Single Solve took 26 s and the Time Trial went through first time in 1.83 s; the first Mastery submit was incorrect (one wrong slug out of 28), and the retry passed after a 3-minute fix.

Takeaways

  • A slug-shaped answer isn't a proof. Every safety check passed on a wrong answer, because a split word plus ROT13 still made a valid-looking slug. Stops only catch what they test for.
  • Fragments lie. The edge of a split chunk can look like a real word ("at", "to", "in"). Score only whole tokens.
  • Check a fix against everything already known to be right. 62 accepted answers made the regression test meaningful, and make sure the comparison actually compares something.
  • The server is now the clock to watch. Start and retry calls ranged from 0.4 s to 4.6 s today. With a 7-second Mastery clock, that is most of the margin.