diff options
author | Tomasz Kramkowski <tk@the-tk.com> | 2015-04-04 20:42:29 +0200 |
---|---|---|
committer | Tomasz Kramkowski <tk@the-tk.com> | 2015-04-04 20:42:29 +0200 |
commit | b99f95ef777000743404902c76c9c8f0b207e5ba (patch) | |
tree | 52a9d86ec6855440e0508aa3479d81a9964f5452 | |
parent | 6aec103b134f3229e3b0329508c9bd5bd423e880 (diff) | |
download | c-stuff-b99f95ef777000743404902c76c9c8f0b207e5ba.tar.gz c-stuff-b99f95ef777000743404902c76c9c8f0b207e5ba.tar.xz c-stuff-b99f95ef777000743404902c76c9c8f0b207e5ba.zip |
shufflechars: Shuffle characters around.
-rw-r--r-- | shufflechars.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/shufflechars.c b/shufflechars.c new file mode 100644 index 0000000..84a2c55 --- /dev/null +++ b/shufflechars.c @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2015 Tomasz Kramkowski <tk@the-tk.com> + * + * This program is free software. It is licensed under version 3 of the + * GNU General Public License. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see [http://www.gnu.org/licenses/]. + */ +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <string.h> +#include <time.h> + +static inline unsigned rand_to_max(unsigned max) +{ + double random; + + while ((random = rand()) == (double)RAND_MAX); + + return random / (double)RAND_MAX * (double)max; +} + +int main(int argc, char **argv) +{ + size_t length; + char *text, *dest; + + srand(time(NULL)); + + if (argc != 2) { + fprintf(stderr, "Usage: %s <text>\a\n", argv[0]); + exit(EXIT_FAILURE); + } + + text = argv[1]; + length = strlen(text); + + bool relocated[length]; + + memset(relocated, 0, length); + dest = malloc(length + 1); + + for (size_t i = 0; i < length; i++) { + size_t index; + while (index = rand_to_max(length), relocated[index]) + ; + + dest[i] = text[index]; + relocated[index] = true; + } + + dest[length] = '\0'; + + printf("%s\n", dest); + + return EXIT_SUCCESS; +} |