aboutsummaryrefslogtreecommitdiff
path: root/challenge-069
diff options
context:
space:
mode:
authorWalt Mankowski <waltman@pobox.com>2020-07-18 17:31:09 -0400
committerWalt Mankowski <waltman@pobox.com>2020-07-18 17:31:09 -0400
commita32db1d8cbfeb24ad0b5ee1e49313cb6973defe2 (patch)
treed35afa8caae508ebbc8295d7fb4ee7e07cf2d760 /challenge-069
parent45bd7b0e976c7e1f2b78b311a14703aed4b89ebf (diff)
downloadperlweeklychallenge-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.c53
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;
+}