Best shuffle: Difference between revisions
Content added Content deleted
Line 287: | Line 287: | ||
, , (0) |
, , (0) |
||
xxxxx, xxxxx, (5)</pre> |
xxxxx, xxxxx, (5)</pre> |
||
===Version with random result=== |
|||
<lang C>#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
typedef struct letter_group_t { |
|||
char c; |
|||
int count; |
|||
} *letter_p; |
|||
struct letter_group_t all_letters[26]; |
|||
letter_p letters[26]; |
|||
int count_letters(char *s) |
|||
{ |
|||
int i, c; |
|||
for (i = 0; i < 26; i++) { |
|||
all_letters[i].count = 0; |
|||
all_letters[i].c = i + 'a'; |
|||
} |
|||
while (*s != '\0') { |
|||
i = *(s++); |
|||
/* don't want to deal with bad inputs */ |
|||
if (i < 'a' || i > 'z') { |
|||
fprintf(stderr, "Abort: Bad string %s\n", s); |
|||
exit(1); |
|||
} |
|||
all_letters[i - 'a'].count++; |
|||
} |
|||
for (i = 0, c = 0; i < 26; i++) |
|||
if (all_letters[i].count) |
|||
letters[c++] = all_letters + i; |
|||
return c; |
|||
} |
|||
int least_overlap, seq_no; |
|||
char out[100], orig[100], best[100]; |
|||
void permutate(int n_letters, int pos, int overlap) |
|||
{ |
|||
int i, ol; |
|||
if (pos < 0) { |
|||
// printf("%s: %d\n", out, overlap); |
|||
if (overlap < least_overlap) { |
|||
least_overlap = overlap; |
|||
seq_no = 0; |
|||
} |
|||
if ( (double)rand() / (RAND_MAX + 1.0) * ++seq_no <= 1) |
|||
strcpy(best, out); |
|||
return; |
|||
} |
|||
for (i = 0; i < n_letters; i++) { |
|||
if (!letters[i]->count) continue; |
|||
out[pos] = letters[i]->c; |
|||
letters[i]->count --; |
|||
ol = (letters[i]->c == orig[pos]) ? overlap + 1 : overlap; |
|||
if (ol <= least_overlap) |
|||
permutate(n_letters, pos - 1, ol); |
|||
letters[i]->count ++; |
|||
} |
|||
return; |
|||
} |
|||
void do_string(char *str) |
|||
{ |
|||
least_overlap = strlen(str); |
|||
strcpy(orig, str); |
|||
seq_no = 0; |
|||
out[least_overlap] = '\0'; |
|||
least_overlap ++; |
|||
permutate(count_letters(str), least_overlap - 2, 0); |
|||
printf("%s -> %s, overlap %d\n", str, best, least_overlap); |
|||
} |
|||
int main() |
|||
{ |
|||
srand(time(0)); |
|||
do_string("abracadebra"); |
|||
do_string("grrrrrr"); |
|||
do_string("elk"); |
|||
do_string("seesaw"); |
|||
do_string(""); |
|||
return 0; |
|||
}</lang>Output<lang>abracadebra -> edbcarabaar, overlap 0 |
|||
grrrrrr -> rrgrrrr, overlap 5 |
|||
elk -> kel, overlap 0 |
|||
seesaw -> ewsesa, overlap 0 |
|||
-> , overlap 0</lang> |
|||
=={{header|C sharp|C#}}== |
=={{header|C sharp|C#}}== |