aboutsummaryrefslogtreecommitdiff
path: root/challenge-069
diff options
context:
space:
mode:
authorWalt Mankowski <waltman@pobox.com>2020-07-18 17:45:26 -0400
committerWalt Mankowski <waltman@pobox.com>2020-07-18 17:45:26 -0400
commit86fa8955ddc9966df805117b413b79ad2e083392 (patch)
tree9669bb3d0344e0044ac0b4b2866d9b43d418c94d /challenge-069
parenta32db1d8cbfeb24ad0b5ee1e49313cb6973defe2 (diff)
downloadperlweeklychallenge-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.c29
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;
}