Anonymous user
Best shuffle: Difference between revisions
→{{header|D}}: more tinkering
(→{{header|D}}: some improvements) |
(→{{header|D}}: more tinkering) |
||
Line 342:
=={{header|D}}==
<lang d>import std.stdio, std.random, std.algorithm, std.array, std.range;
int bestShuffle(in dchar[] s1) {
return
▲ }
return count;▼
}
const size_t len = s1.length;
auto s2 = s1.dup;
uint numToIgnore;
if (len
s2.reverse;▼
} else {▼
numToIgnore = numProbChars - (len - numProbChars);
▲ auto problemChar = sort!("a[1] > b[1]")(array(group(s2.sort)))[0];
▲ if (problemChar[1] > len / 2) {
}
do {
for (size_t i = len; i > 1; i--) {
swap(s2[i - 1], s2[uniform(0, i)]);
▲ } while (countSamePositions(s1, s2, len) > 0);
}</lang>
▲ writefln("%s %s (%s)", s1, s2, samePos);
<lang d>unittest {
assert(bestShuffle("immediately"d.dup) == 0);
assert(bestShuffle("seesaw"d.dup) == 0);
assert(bestShuffle("abracadabra"d.dup) == 0);
assert(bestShuffle("
assert(bestShuffle("a"d.dup) == 1);
assert(bestShuffle(""d.dup) == 0);
assert(bestShuffle("grrrrrr"d.dup) == 5);
}</lang>
|