Best shuffle: Difference between revisions

Content added Content deleted
mNo edit summary
Line 7: Line 7:
=={{header|D}}==
=={{header|D}}==
{{works with|D|2}}
{{works with|D|2}}
<lang d>int bestShuffle(string s) {
<lang d>int bestShuffle(char[] s1) {


int countSamePositions(T, U)(T s1, U s2) {
int countSamePositions(char[] r1, char[] r2, int len) {
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 = s.length;
const len = s1.length;
if (len == 0) {
char[] s2 = s1.dup;
throw new Exception("input string cannot have zero length");
}


char[] ch = s.dup.sort;
if (len < 3) {
s2.reverse;
} else {
s2.sort;


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

for (int i = len; i > 1; i--) {
do {
for (int i = len; i > 1; i--) {
swap(s2[i-1], s2[uniform(0, i)]);
swap(ch[i-1], ch[uniform(0, i)]);
}
} while(countSamePositions(s1, s2, len) > 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(s1, s2, len);
writefln("%s %s (%s)", s, result, samePos);
writefln("%s %s (%s)", s1, s2, samePos);


return samePos;
return samePos;
}</lang>
}</lang>


output:<pre>abracadabra baadacbraar (0)
output:<pre>abracadabra caararbdaab (0)
seesaw easwes (0)
seesaw essawe (0)
elk lke (0)
elk lke (0)
grrrrrr rrrrrgr (5)
grrrrrr rrrrrgr (5)
Line 54: Line 67:


<lang d>unittest {
<lang d>unittest {
assert(bestShuffle("abracadabra") == 0);
assert(bestShuffle("abracadabra".dup) == 0);
assert(bestShuffle("seesaw") == 0);
assert(bestShuffle("seesaw".dup) == 0);
assert(bestShuffle("elk") == 0);
assert(bestShuffle("elk".dup) == 0);
assert(bestShuffle("grrrrrr") == 5);
assert(bestShuffle("grrrrrr".dup) == 5);
assert(bestShuffle("up") == 0);
assert(bestShuffle("up".dup) == 0);
assert(bestShuffle("a") == 1);
assert(bestShuffle("a".dup) == 1);
}</lang>
}</lang>