Word Wrap

Level: Intermediate 30–60 min

Concepts: Strings

Solutions: C# | TypeScript | Python


Create a program that wraps text at a specified column width.

Requirements

  1. Implement text wrapping rules:
    • Break text at word boundaries when possible
    • Break words only if they exceed the column width
    • Preserve whitespace between words
    • Handle multiple spaces and tabs
  2. Handle edge cases:
    • Empty input
    • Input shorter than column width
    • Words longer than column width
    • Multiple consecutive spaces
  3. Return appropriate results:
    • Wrapped text as a string
    • Error message for invalid inputs

Test Cases

InputColumn WidthExpected OutputNotes
”Hello”5”Hello”No wrapping needed
”Hello World”5”Hello\nWorld”Break at word boundary
”Hello World”7”Hello\nWorld”Break at word boundary
”Hello World”20”Hello World”No wrapping needed
”Supercalifragilisticexpialidocious”10”Supercalif\nragilisti\ncexpiali\ndocious”Break long word
”Hello World”5”Hello\nWorld”Handle multiple spaces

Edge Cases to Consider

  • Empty string
  • Null input
  • Zero or negative column width
  • Very long words
  • Multiple consecutive spaces or tabs
  • Text with line breaks

Tips

  • Start with simple cases (no wrapping needed)
  • Add word boundary breaking next
  • Then handle long words
  • Finally add whitespace handling
  • Consider using regular expressions for word boundaries

Reference Walkthrough

Reference implementations in C#, TypeScript, and Python live at tddbuddy-reference-katas/word-wrap. This is an F1 kata — twelve scenarios covering empty and whitespace-only input, single-word lines, greedy word-boundary packing, oversize-word hard splitting, oversize-remainder joining with the next word, and whitespace collapsing — shared across all three languages, each a single pure function wrap(text, width) returning a \n-joined string.

This kata ships in Agent Full-Bake mode at high gear: the rules land as one commit per language, with a brief walkthrough noting there are no builders because the inputs and outputs are the domain. A greedy line-packer tokenizes on runs of whitespace, accumulates words until the next word would push the line past width, splits any oversize word hard at the width-th character before letting its remainder begin the next line (where following words may still join it if they fit), and joins the resulting lines with \n — matching the classic Kent Beck kata shape that returns a single string rather than a list. See the repo’s Gears section for when high gear is the right call.