On Friday, 14 September 2018 at 20:43:45 UTC, SrMordred wrote:
On Friday, 14 September 2018 at 19:44:37 UTC, berni wrote:
a) I've got an int[] which contains only 0 und 1. And I want
to end with a string, containing 0 and 1. So [1,1,0,1,0,1]
should become "110101". Of course I can do this with a loop
and ~. But I think it should be doable with functional style,
which is something I would like to understand better. Can
anyone help me here? (I think a.map!(a=>to!char(a+'0')) does
the trick, but is this good style or is there a better way?)
Yes, that's fine. That gives you a range; if you want an array,
call array() with that expression. Also, since you know the
addition won't overflow, you can substitute the to!char call with
a cast (arr.map!(c => cast(char)(c + '0')).array).
Another option is to index a string literal: arr.map!(c =>
"01"[c]).array
auto a = [1,0,1,1,1,0,1,0,1,1,1,1,0];
a.map!(to!string)
.join("")
.chunks(4)
.map!(to!string) //donĀ“t know why the chunks are not
already strings at this point ;/
.writeln;
That's needlessly complicated and inefficient; this will allocate
one string per array element.
If you don't need the result to be actual arrays, this works:
auto res = [1,0,1,1,1,0,1,0,1,1,1,1,0]
.map!(c => "01"[c])
.chunks(4);
assert(equal!equal(res, ["1011","1010","1111","0"]));
If you need a real array of arrays:
auto arr = res
.map!array
.array;
assert(arr == ["1011","1010","1111","0"]);