Best shuffle: Difference between revisions

Content added Content deleted
(→‎{{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 len) {
int countSamePositions(in dchar[] r1, dchar[] r2, size_t len) {
int count;
int count;
for (int i; i < len; i++) {
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;
dchar[] s2 = s1.dup;
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];

auto problemChar = sort!("a[1] > b[1]")(array(group(s2)))[0];
if (problemChar[1] > len / 2) {
if ((problemChar[1] - len / 2) > 0) {
int j, numToRemove = problemChar[1] - (len - problemChar[1]);
int numToRemove = problemChar[1] - (len - problemChar[1]);
foreach (ref c; s2)
for (int i, j; i < len && j < numToRemove; i++) {
if (c == problemChar[0]) {
if (s2[i] == problemChar[0]) {
c = '-';
s2[i] = '-';
if (++j >= numToRemove) break;
j++;
}
}
}
}
}

do {
do {
for (int 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)]);
}
} while(countSamePositions(s1, s2, len) > 0);


for (int i; i < len; i++) {
} while (countSamePositions(s1, s2, len) > 0);

if (s2[i] == '-') {
s2[i] = problemChar[0];
foreach (ref c; s2)
}
if (c == '-') c = problemChar[0];
}
}
}