diff options
| author | Walt Mankowski <waltman@pobox.com> | 2020-07-18 17:45:26 -0400 |
|---|---|---|
| committer | Walt Mankowski <waltman@pobox.com> | 2020-07-18 17:45:26 -0400 |
| commit | 86fa8955ddc9966df805117b413b79ad2e083392 (patch) | |
| tree | 9669bb3d0344e0044ac0b4b2866d9b43d418c94d /challenge-069 | |
| parent | a32db1d8cbfeb24ad0b5ee1e49313cb6973defe2 (diff) | |
| download | perlweeklychallenge-club-86fa8955ddc9966df805117b413b79ad2e083392.tar.gz perlweeklychallenge-club-86fa8955ddc9966df805117b413b79ad2e083392.tar.bz2 perlweeklychallenge-club-86fa8955ddc9966df805117b413b79ad2e083392.zip | |
combine switch() and rev() into a single function
This lets me do the mapping in-place and avoids the mallocs and extra
copies.
Diffstat (limited to 'challenge-069')
| -rw-r--r-- | challenge-069/walt-mankowski/c/ch-2.c | 29 |
1 files changed, 7 insertions, 22 deletions
diff --git a/challenge-069/walt-mankowski/c/ch-2.c b/challenge-069/walt-mankowski/c/ch-2.c index 36f1463e32..21347722ce 100644 --- a/challenge-069/walt-mankowski/c/ch-2.c +++ b/challenge-069/walt-mankowski/c/ch-2.c @@ -6,41 +6,26 @@ const size_t min(const size_t a, const size_t b) { return a <= b ? a : b; } -char *rev(const char *s) { +void switch_rev(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; + const char tmp = s[i]; + s[i] = s[j] == '0' ? '1' : '0'; + s[j] = tmp == '0' ? '1' : '0'; } - - 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 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; + strcpy(s+eos+1, s); s[eos] = '0'; - strcat(s+eos+1, rs); - free(rs); + switch_rev(s+eos+1); } return s; } |
