Best shuffle: Difference between revisions
Content added Content deleted
m (→{{header|D}}) |
(→{{header|D}}: some improvements) |
||
Line 346: | Line 346: | ||
int bestShuffle(in dchar[] s1) { |
int bestShuffle(in dchar[] s1) { |
||
int countSamePositions(in dchar[] r1, dchar[] r2, |
int countSamePositions(in dchar[] r1, dchar[] r2, size_t len) { |
||
int count; |
int count; |
||
for ( |
for (size_t i; i < len; i++) |
||
if (r2[i] != '-' && r1[i] == r2[i]) { |
if (r2[i] != '-' && r1[i] == r2[i]) { |
||
count++; |
count++; |
||
} |
} |
||
} |
|||
return count; |
return count; |
||
} |
} |
||
const len = s1.length; |
const size_t len = s1.length; |
||
auto s2 = s1.dup; |
|||
if (len < 3) { |
if (len < 3) { |
||
s2.reverse; |
s2.reverse; |
||
} else { |
} else { |
||
auto problemChar = sort!("a[1] > b[1]")(array(group(s2.sort)))[0]; |
|||
if (problemChar[1] > len / 2) { |
|||
int j, numToRemove = problemChar[1] - (len - problemChar[1]); |
|||
foreach (ref c; s2) |
|||
if (c == problemChar[0]) { |
|||
c = '-'; |
|||
if (++j >= numToRemove) break; |
|||
j++; |
|||
} |
} |
||
} |
|||
} |
} |
||
do { |
do { |
||
for ( |
for (size_t i = len; i > 1; i--) |
||
swap(s2[i-1], s2[uniform(0, i)]); |
swap(s2[i - 1], s2[uniform(0, i)]); |
||
} |
|||
} while(countSamePositions(s1, s2, len) > 0); |
|||
} while (countSamePositions(s1, s2, len) > 0); |
|||
if (s2[i] == '-') { |
|||
foreach (ref c; s2) |
|||
if (c == '-') c = problemChar[0]; |
|||
} |
|||
} |
} |
||