Comma quibbling: Difference between revisions

From Rosetta Code
Content added Content deleted
No edit summary
No edit summary
Line 86: Line 86:


{{out}}
{{out}}
<pre>{}
<pre>
{ABC}
{ABC}
{ABC and DEF}
{ABC and DEF}

Revision as of 10:31, 6 October 2013

Comma quibbling is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

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: for this task assume words are non-empty strings.

D

<lang d>import std.stdio, std.string;

string quibbler(in string[] seq) pure /*nothrow*/ {

   if (seq.length <= 1)
       return format("{%-(%s, %)}", seq);
   else
       return format("{%-(%s, %) and %s}", seq[0 .. $-1], seq[$-1]);

}

void main() {

   //foreach (immutable test; [[],
   foreach (const test; [[],
                         ["ABC"],
                         ["ABC", "DEF"],
                         ["ABC", "DEF", "G", "H"]])
       test.quibbler.writeln;

}</lang>

Output:
{}
{ABC}
{ABC and DEF}
{ABC, DEF, G and H}

Perl 6

<lang perl6>sub comma-quibbling(@A) {

   "\{$_\}" given 
   @A < 3 ?? @A.join(' and ') !!
   @A[0..*-2].join(',') ~ ' and ' ~ @A[*-1]

}

say comma-quibbling($_) for ((), (<ABC>,), (<ABC DEF>), (<ABC DEF G H>)).tree;</lang>

Output:
{}
{ABC}
{ABC and DEF}
{ABC,DEF,G and H}

Python

<lang python>>>> def strcat(sequence): # replace(..) can only replace the first X occurrences not the last # Hence the replace is done on the reverse of the intermediate string # then reversed back. return '{%s}' % ', '.join(sequence)[::-1].replace(',', 'dna ', 1)[::-1]

>>> for seq in ([], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]): print('Input: %-24r -> Output: %r' % (seq, strcat(seq)))


Input: [] -> Output: '{}' Input: ['ABC'] -> Output: '{ABC}' Input: ['ABC', 'DEF'] -> Output: '{ABC and DEF}' Input: ['ABC', 'DEF', 'G', 'H'] -> Output: '{ABC, DEF, G and H}' >>> </lang>

Rexx

<lang Rexx> say quibbling('ABC') say quibbling('ABC DEF') say quibbling('ABC DEF G H') exit

quibbling: procedure

   parse arg list
   if words(list) < 2 then return list
   return translate(strip(subword(list,1,words(list)-1)),',',' ') 'and' word(list,words(list))

</lang>

Output:
{ABC}
{ABC and DEF}
{ABC,DEF,G and H}