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( |
<lang d>int bestShuffle(char[] s1) { |
||
int countSamePositions( |
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 = |
const len = s1.length; |
||
char[] s2 = s1.dup; |
|||
throw new Exception("input string cannot have zero length"); |
|||
⚫ | |||
if (len < 3) { |
|||
s2.reverse; |
|||
⚫ | |||
s2.sort; |
|||
auto problemChar = sort!("a[1] > b[1]")(array(group( |
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 ( |
if (s2[i] == problemChar[0]) { |
||
s2[i] = '-'; |
|||
j++; |
j++; |
||
} |
|||
} |
} |
||
} |
} |
||
do { |
|||
for (int i = len; i > 1; i--) { |
|||
⚫ | |||
swap(s2[i-1], s2[uniform(0, i)]); |
|||
} |
|||
⚫ | |||
char pc = cast(char)problemChar[0]; |
|||
for (int i; i < len; i++) { |
|||
if (s2[i] == '-') { |
|||
s2[i] = pc; |
|||
} |
|||
} |
} |
||
} |
|||
⚫ | |||
string result = replace(to!string(ch), "-", to!string(problemChar[0])); |
|||
⚫ | |||
⚫ | |||
writefln("%s %s (%s)", |
writefln("%s %s (%s)", s1, s2, samePos); |
||
return samePos; |
return samePos; |
||
}</lang> |
}</lang> |
||
output:<pre>abracadabra |
output:<pre>abracadabra caararbdaab (0) |
||
seesaw |
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> |
||