From 86fa8955ddc9966df805117b413b79ad2e083392 Mon Sep 17 00:00:00 2001 From: Walt Mankowski Date: Sat, 18 Jul 2020 17:45:26 -0400 Subject: combine switch() and rev() into a single function This lets me do the mapping in-place and avoids the mallocs and extra copies. --- challenge-069/walt-mankowski/c/ch-2.c | 29 +++++++---------------------- 1 file 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; } -- cgit