Permutations of array (slice) ?
Kevin Bailey
keraba at yahoo.com
Tue Dec 12 16:21:46 UTC 2023
On Tuesday, 12 December 2023 at 15:20:23 UTC, Paul Backus wrote:
>
> Because of autodecoding [1], slices of char and wchar are
> treated by Phobos as bidirectional ranges of dchar. (They are
> not random-access ranges because UTF-8 and UTF-16 are
> variable-length encodings.)
>
> To work around this, use std.utf.byChar:
>
> import std.utf: byChar;
> foreach (perm; as.byChar.permutations)
> writeln(perm);
>
> [1]
> http://ddili.org/ders/d.en/ranges.html#ix_ranges.decoding,%20automatic
ah, many thanks, I never would have figured that out.
But unfortunately, the code shown now prints 120 lines of:
baaaa
120 being suspiciously equal to 5!. The documentation[2] seems to
imply that this should be:
baaaa
abaaa
...
When I replace the char[] with int[] [2, 1, 1, 1, 1], it produces
120 lines of random arrangements of the input, but mostly just
repeating the input.
Clearly it's doing permutations of a separate array of [0, 1, 2,
3, 4], and then replacing each index with the element at that
index (or the equivalent) but it's not even doing that right.
I'll play with nextPermutation. I suspect it would have to be
implemented the way that I'm expecting.
[2]
https://dlang.org/library/std/algorithm/iteration/permutations.html
More information about the Digitalmars-d-learn
mailing list