diff options
| author | Walt Mankowski <waltman@pobox.com> | 2020-07-18 17:31:09 -0400 |
|---|---|---|
| committer | Walt Mankowski <waltman@pobox.com> | 2020-07-18 17:31:09 -0400 |
| commit | a32db1d8cbfeb24ad0b5ee1e49313cb6973defe2 (patch) | |
| tree | d35afa8caae508ebbc8295d7fb4ee7e07cf2d760 /challenge-069 | |
| parent | 45bd7b0e976c7e1f2b78b311a14703aed4b89ebf (diff) | |
| download | perlweeklychallenge-club-a32db1d8cbfeb24ad0b5ee1e49313cb6973defe2.tar.gz perlweeklychallenge-club-a32db1d8cbfeb24ad0b5ee1e49313cb6973defe2.tar.bz2 perlweeklychallenge-club-a32db1d8cbfeb24ad0b5ee1e49313cb6973defe2.zip | |
C code for challenge 69 task 2
Very slow for n>15 or so, so in need of some refactoring.
Diffstat (limited to 'challenge-069')
| -rw-r--r-- | challenge-069/walt-mankowski/c/ch-2.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/challenge-069/walt-mankowski/c/ch-2.c b/challenge-069/walt-mankowski/c/ch-2.c new file mode 100644 index 0000000000..36f1463e32 --- /dev/null +++ b/challenge-069/walt-mankowski/c/ch-2.c @@ -0,0 +1,53 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +const size_t min(const size_t a, const size_t b) { + return a <= b ? a : b; +} + +char *rev(const char *s) { + const size_t len = strlen(s); + char *t = malloc(len+1); + strcpy(t, s); + for (size_t i = 0; i < min(len/2+1, len); i++) { + const size_t j = len-1-i; + char tmp = t[i]; + t[i] = t[j]; + t[j] = tmp; + } + + return t; +} + +char *swtch(char *s) { + for (size_t i = 0; i < strlen(s); i++) + if (s[i] == '0') + s[i] = '1'; + else + s[i] = '0'; + + return s; +} + +char *S(const int n) { + const size_t len = (1 << n) - 1; + char *s = malloc(len); + s[0] = '\0'; + + for (int i = 1; i <= n; i++) { + char *rs = swtch(rev(s)); + const size_t eos = (1 << (i-1)) - 1; + s[eos] = '0'; + strcat(s+eos+1, rs); + free(rs); + } + return s; +} + +int main(int argc, char *argv[]) { + const int n = atoi(argv[1]); + puts(S(n)); + + return 0; +} |
