Best shuffle: Difference between revisions
Content added Content deleted
(→{{header|D}}: some improvements) |
(→{{header|D}}: more tinkering) |
||
Line 342: | Line 342: | ||
=={{header|D}}== |
=={{header|D}}== |
||
<lang d>import std.stdio, std.random, std.algorithm, std.array; |
<lang d>import std.stdio, std.random, std.algorithm, std.array, std.range; |
||
int bestShuffle(in dchar[] s1) { |
int bestShuffle(in dchar[] s1) { |
||
⚫ | |||
bool hasSamePositions(in dchar[] r1, in dchar[] r2, uint ignore) { |
|||
foreach (r; zip(r1, r2)) { |
|||
if (r[0] == r[1] && ignore-- == 0) return true; |
|||
⚫ | |||
if (r2[i] != '-' && r1[i] == r2[i]) { |
|||
return false; |
|||
⚫ | |||
⚫ | |||
} |
} |
||
const size_t len = s1.length; |
const size_t len = s1.length; |
||
auto s2 = s1.dup; |
auto s2 = s1.dup; |
||
uint numToIgnore; |
|||
if (len |
if (len > 0) { |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
numToIgnore = numProbChars - (len - numProbChars); |
|||
⚫ | |||
⚫ | |||
int j, numToRemove = problemChar[1] - (len - problemChar[1]); |
|||
foreach (ref c; s2) |
|||
if (c == problemChar[0]) { |
|||
c = '-'; |
|||
if (++j >= numToRemove) break; |
|||
} |
|||
} |
} |
||
do { |
do { |
||
for (size_t i = len; i > 1; i--) |
for (size_t i = len; i > 1; i--) { |
||
swap(s2[i - 1], s2[uniform(0, i)]); |
swap(s2[i - 1], s2[uniform(0, i)]); |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
}</lang> |
|||
foreach (ref c; s2) |
|||
if (c == '-') c = problemChar[0]; |
|||
} |
|||
int samePos = countSamePositions(s1, s2, len); |
|||
⚫ | |||
return samePos; |
|||
} |
|||
unittest { |
<lang d>unittest { |
||
assert(bestShuffle("immediately"d.dup) == 0); |
assert(bestShuffle("immediately"d.dup) == 0); |
||
assert(bestShuffle("seesaw"d.dup) == 0); |
assert(bestShuffle("seesaw"d.dup) == 0); |
||
assert(bestShuffle("abracadabra"d.dup) == 0); |
assert(bestShuffle("abracadabra"d.dup) == 0); |
||
assert(bestShuffle(" |
assert(bestShuffle("pop"d.dup) == 1); |
||
assert(bestShuffle("a"d.dup) == 1); |
assert(bestShuffle("a"d.dup) == 1); |
||
assert(bestShuffle(""d.dup) == 0); |
|||
assert(bestShuffle("grrrrrr"d.dup) == 5); |
assert(bestShuffle("grrrrrr"d.dup) == 5); |
||
}</lang> |
}</lang> |