Best shuffle: Difference between revisions

Content added Content deleted
mNo edit summary
Line 7:
=={{header|D}}==
{{works with|D|2}}
<lang d>int bestShuffle(stringchar[] ss1) {
 
int countSamePositions(Tchar[] r1, U)(Tchar[] s1r2, Uint s2len) {
int count;
return count!("a[0] == a[1] && a[0] != b")(zip(s1, s2), '-');
for (int i; i < len; i++) {
if (r2[i] != '-' && r1[i] == r2[i]) {
count++;
}
}
return count;
}
 
const len = ss1.length;
ifchar[] (lens2 == 0) {s1.dup;
throw new Exception("input string cannot have zero length");
}
 
char[]if ch(len =< s.dup.sort;3) {
s2.reverse;
do} else {
s2.sort;
 
auto problemChar = sort!("a[1] > b[1]")(array(group(chs2)))[0];
if ((problemChar[1] - len / 2) > 0) {
int numToRemove = problemChar[1] - (len - problemChar[1]);
for (int i, j; i < len && j < numToRemove; i++) {
if (chs2[i] == problemChar[0]) {
ch s2[i] = '-';
j++;
}
}
}
}
do {
 
for (int i = len; i > 1; i--) {
do {
for (int i = len; i > 1; swap(s2[i--)1], {s2[uniform(0, i)]);
swap(ch[i-1], ch[uniform(0, i)]);}
} while(countSamePositions(ss1, s2, chlen) > 0);
char pc = cast(char)problemChar[0];
for (int i; i < len; i++) {
if (s2[i] == '-') {
s2[i] = pc;
}
}
}
} while(countSamePositions(s, ch) > 0);
 
string result = replace(to!string(ch), "-", to!string(problemChar[0]));
int samePos = countSamePositions(s, result);
 
int samePos = countSamePositions(ss1, results2, len);
writefln("%s %s (%s)", ss1, results2, samePos);
 
return samePos;
}</lang>
 
output:<pre>abracadabra baadacbraarcaararbdaab (0)
seesaw easwesessawe (0)
elk lke (0)
grrrrrr rrrrrgr (5)
Line 54 ⟶ 67:
 
<lang d>unittest {
assert(bestShuffle("abracadabra".dup) == 0);
assert(bestShuffle("seesaw".dup) == 0);
assert(bestShuffle("elk".dup) == 0);
assert(bestShuffle("grrrrrr".dup) == 5);
assert(bestShuffle("up".dup) == 0);
assert(bestShuffle("a".dup) == 1);
}</lang>