C++: Comma Quibbling

Bjarne-stroustrup
 

Comma quibbling is a task originally set by Eric Lippert in his blog.

The task is to write a function to generate a string output which is the concatenation of input words from a list/sequence where:

  1. An input of no words produces the output string of just the two brace characters “{}”.
  2. An input of just one word, e.g. [“ABC”], produces the output string of the word inside the two braces, e.g. “{ABC}”.
  3. An input of two words, e.g. [“ABC”, “DEF”], produces the output string of the two words inside the two braces with the words separated by the string ” and “, e.g. “{ABC and DEF}”.
  4. An input of three or more words, e.g. [“ABC”, “DEF”, “G”, “H”], produces the output string of all but the last word separated by “, ” with the last word separated by ” and ” and all within braces; e.g. “{ABC, DEF, G and H}”.

Test your function with the following series of inputs showing your output here on this page:

  • [] # (No input words).
  • [“ABC”]
  • [“ABC”, “DEF”]
  • [“ABC”, “DEF”, “G”, “H”]

Note: Assume words are non-empty strings of uppercase characters for this task.

#include <iostream>

template<class T>
void quibble(std::ostream& o, T i, T e) {
	o << "{";
	if (e != i) {
		T n = i++;
		const char* more = "";
		while (e != i) {
			o << more << *n;
			more = ", ";
			n = i++;
		}
		o << (*more?" and ":"") << *n;
	}
	o << "}";
}

int main(int argc, char** argv) {
	char const* a[] = {"ABC","DEF","G","H"};
	for (int i=0; i<5; i++) {
		quibble(std::cout, a, a+i);
		std::cout << std::endl;
	}
	return 0;
}
Output:
{}
{ABC}
{ABC and DEF}
{ABC, DEF and G}
{ABC, DEF, G and H}

SOURCE

Content is available under GNU Free Documentation License 1.2.