Best shuffle: Difference between revisions

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