From 45bd7b0e976c7e1f2b78b311a14703aed4b89ebf Mon Sep 17 00:00:00 2001 From: Walt Mankowski Date: Sat, 18 Jul 2020 17:31:04 -0400 Subject: C code for challenge 69 task 1 --- challenge-069/walt-mankowski/c/ch-1.c | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 challenge-069/walt-mankowski/c/ch-1.c diff --git a/challenge-069/walt-mankowski/c/ch-1.c b/challenge-069/walt-mankowski/c/ch-1.c new file mode 100644 index 0000000000..a5e15845c6 --- /dev/null +++ b/challenge-069/walt-mankowski/c/ch-1.c @@ -0,0 +1,52 @@ +#include +#include +#include + +const size_t min(const size_t a, const size_t b) { + return a <= b ? a : b; +} + +int is_strobogrammatic(const long long n) { + char s[20]; + sprintf(s, "%lld", n); + const size_t len = strlen(s); + for (size_t i = 0; i < min(len/2+1, len); i++) { + const size_t j = len-1-i; + switch (s[i]) { + case '0': + if (s[j] != '0') + return 0; + break; + case '1': + if (s[j] != '1') + return 0; + break; + case '6': + if (s[j] != '9') + return 0; + break; + case '8': + if (s[j] != '8') + return 0; + break; + case '9': + if (s[j] != '6') + return 0; + break; + default: + return 0; + } + } + return 1; +} + +int main(int argc, char *argv[]) { + const long long A = atoll(argv[1]); + const long long B = atoll(argv[2]); + + for (long long i = A; i <= B; i++) + if (is_strobogrammatic(i)) + printf("%lld\n", i); + + return 0; +} -- cgit From a32db1d8cbfeb24ad0b5ee1e49313cb6973defe2 Mon Sep 17 00:00:00 2001 From: Walt Mankowski Date: Sat, 18 Jul 2020 17:31:09 -0400 Subject: C code for challenge 69 task 2 Very slow for n>15 or so, so in need of some refactoring. --- challenge-069/walt-mankowski/c/ch-2.c | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 challenge-069/walt-mankowski/c/ch-2.c 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 +#include +#include + +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; +} -- cgit 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 From 3f085e087488fcd51e4441af309d98e44997a5e1 Mon Sep 17 00:00:00 2001 From: Walt Mankowski Date: Sat, 18 Jul 2020 17:46:19 -0400 Subject: ignore executables --- challenge-069/walt-mankowski/c/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 challenge-069/walt-mankowski/c/.gitignore diff --git a/challenge-069/walt-mankowski/c/.gitignore b/challenge-069/walt-mankowski/c/.gitignore new file mode 100644 index 0000000000..ac77297bfe --- /dev/null +++ b/challenge-069/walt-mankowski/c/.gitignore @@ -0,0 +1,2 @@ +ch-1 +ch-2 -- cgit From d1d66d3d78be7ce42d275f396461283e8196dbbb Mon Sep 17 00:00:00 2001 From: Walt Mankowski Date: Sat, 18 Jul 2020 17:46:49 -0400 Subject: Makefile for challenge 69 C code --- challenge-069/walt-mankowski/c/Makefile | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 challenge-069/walt-mankowski/c/Makefile diff --git a/challenge-069/walt-mankowski/c/Makefile b/challenge-069/walt-mankowski/c/Makefile new file mode 100644 index 0000000000..8694263018 --- /dev/null +++ b/challenge-069/walt-mankowski/c/Makefile @@ -0,0 +1,23 @@ +C = /usr/bin/cc +INCLDIRS = +LIBDIRS = +LIBS = +CFLAGS = -std=c18 -Wall -O3 $(INCLDIRS) +OBJECTS1 = ch-1.o +OBJECTS2 = ch-2.o + +all: ch-1 ch-2 + +%.o: %.c + $(C) $(CFLAGS) -c $< + +ch-1: $(OBJECTS1) + $(C) -o $@ $(OBJECTS1) $(LIBDIRS) $(LIBS) + +ch-2: $(OBJECTS2) + $(C) -o $@ $(OBJECTS2) $(LIBDIRS) $(LIBS) + +clean: + rm -f *~ + rm -f *.o + rm -f ch-1 ch-2 -- cgit