Every time you deposit a check by snapping a photo with your phone, you're relying on a quiet piece of technology most people never think about: Optical Character Recognition. April's C3 meetup brought that technology down to its essentials - and challenged participants to build it from scratch. Without AI.
That last part turned out to be the most memorable part of the night.
The Kata: Bank OCR
The session opened with a bit of history. Before OCR, banks used MICR - Magnetic Ink Character Recognition - a technology invented in the 1950s that's still printed on the bottom of paper checks today. MICR's angular E-13B font was designed specifically for machines, not human eyes, detecting the magnetic properties of ink rather than visual shapes. Reliable enough to survive a crumpled envelope, MICR allowed banks to process millions of checks daily that would otherwise require entirely manual sorting.
OCR came later, reading characters by their visual shape. No special ink required - but that means it can be fooled by smudged or ambiguous glyphs. Which is exactly where the kata's challenge lives.
Participants were handed a spec describing a scanner that outputs account numbers as ASCII art - pipes, underscores, and spaces arranged in 3×3 grids. The job: write a parser that turns those glyphs back into digits. Five stages, each adding a layer of complexity:
- Stage 1 - Recognize a single digit from its 3-row ASCII representation
- Stage 2 - Parse a full nine-digit account number
- Stage 3 - Validate the account number against a checksum formula
- Stage 4 - Handle illegible glyphs that don't match any known digit
- Stage 5 - Attempt single-segment correction on illegible digits, flagging ambiguous cases
Pairs worked in Java, C#, TypeScript, and Python - each language bringing its own idioms to the same underlying problem.
Use It or Lose It
Here's what nobody expected to be the biggest takeaway: solving problems without AI is a skill, and it atrophies.
This meetup ran intentionally AI-free. And for a room full of experienced developers, that felt different than it used to. Reaching for autocomplete or a chat window has quietly become reflexive - and when that option is off the table, the rustiness shows. Not incompetence. Just rust. The kind that reminds you that problem-solving instincts need exercise like anything else.
Is a Lookup Table "Brute Force"?
After the session, pairs compared notes - and nearly everyone had landed on the same general approach: enumerate the ten digit patterns and match against them. And nearly everyone felt a little sheepish about it. "That feels like brute force." "Shouldn't there be something more elegant?"
The implementations varied - some pairs built a dictionary or map keyed by the 3-row pattern string, others reached for a switch statement, and a few went with a straightforward if/else chain. Different syntax, same idea: here are the ten possibilities, find the one that matches. The switch and if/else approaches work fine for ten cases, but the map has an edge: in Stage 5, when you need to generate single-segment variations of an unknown glyph and check each one against the known patterns, having a data structure you can query directly makes that logic much cleaner than branching through ten conditions repeatedly.
It's worth pushing back on the "brute force" instinct regardless of which form the code took. Enumerating ten fixed, known patterns isn't a failure of creativity - it's the right tool for a finite, stable set. It's immediately readable, and it's honest about what the problem actually is. There are only ten digits. They don't change. A solution that says so explicitly isn't inelegant - it's accurate.
The feeling of "this should be smarter" is worth examining. Sometimes it points to a real improvement. And sometimes the straightforward solution is straightforward because it's correct.
Join the conversation
If you’re interested in conversations like this:
Join our Discord to stay connected between sessions and come to the next C3 meetup to build, question, and learn alongside the community!
We host C3 regularly at our new Blue Ash office, and new faces are always welcome.



