Problems › JavaScript › text
Wrap text to a label width
A shipping label printer takes a fixed number of characters per line, and a description has to be broken across lines without splitting words.
- Fill each line greedily: keep adding words while they still fit.
- Words are separated by whitespace and joined back with a single space.
- A word longer than the whole width goes on a line of its own, unbroken.
- A width of zero or less, or text with no words, gives an empty list.
wordWrap(text: string, width: int) → list<string>
Where you start
function wordWrap(text, width) {
}
Worked examples
| Call | Result |
|---|---|
wordWrap("the quick brown fox", 10) | ["the quick","brown fox"] |
wordWrap("a bb ccc", 3) | ["a","bb","ccc"] |
wordWrap("supercalifragilistic is long", 5) | ["supercalifragilistic","is","long"] |
wordWrap("one two", 20) | ["one two"] |
Hint
Track the current line as a string. Before adding a word, check whether the line plus a space plus the word still fits.
Reference solution in JavaScript
function wordWrap(text, width) {
if (width <= 0) return [];
const words = text.split(/\s+/).filter((w) => w.length > 0);
const lines = [];
let line = '';
for (const w of words) {
if (line === '') line = w;
else if (line.length + 1 + w.length <= width) line += ' ' + w;
else { lines.push(line); line = w; }
}
if (line !== '') lines.push(line);
return lines;
}