Am Wed, 11 Dec 2013 07:19:41 +0100 schrieb "Volcz" <vo...@kth.se>:
> Are there any obvious difference between the three solutions I > have received? They all to work the same to me. I hope they all work the same! Depending on your background you just might prefer one style over the other. As an example take me. I like high efficiency so I look at the version with src.chunks(2).map!((a) { auto a1 = a.front(); a.popFront(); return format("%s%s", a.front(), a1); } ) and notice the format() function, which looks overkill to me for a task of swapping two bytes. Then there is chunks(), which will decode the UTF-8 string in src, which I don't need, since there are no multi-byte characters in src. The same is true for return range.chunks(2).map!( chunk => chunk.cycle.dropOne.takeExactly(2) ).joiner; and return s.chunks(2).map!( c => [cast(char)c.dropOne.front, cast(char)c.front] ).join; So I would use the second version offered by bearophile: auto result = new char[s.length]; foreach (immutable i, ref c; result) c = s[i + (i & 1 ? -1 : 1)]; return result; I can easily reason about it from looking at it. It makes one allocation "new char[s.length]" and does no UTF-8 decoding. -- Marco