mid-kid
6 years ago
3 changed files with 121 additions and 0 deletions
@ -0,0 +1,8 @@ |
|||||
|
CFLAGS := -Wall -Wextra -std=c17 -D_GNU_SOURCE |
||||
|
|
||||
|
.PHONY: all |
||||
|
all: main |
||||
|
|
||||
|
.PHONY: clean |
||||
|
clean: |
||||
|
rm -f main |
File diff suppressed because one or more lines are too long
@ -0,0 +1,112 @@ |
|||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include <ctype.h> |
||||
|
|
||||
|
void *read_file_contents(const char *fname, size_t *len) |
||||
|
{ |
||||
|
FILE *f = fopen(fname, "r"); |
||||
|
if (!f) { |
||||
|
perror(fname); |
||||
|
return NULL; |
||||
|
} |
||||
|
fseek(f, 0, SEEK_END); |
||||
|
*len = ftell(f); |
||||
|
rewind(f); |
||||
|
void *contents = malloc(*len); |
||||
|
if (!contents) { |
||||
|
perror("malloc"); |
||||
|
fclose(f); |
||||
|
return NULL; |
||||
|
} |
||||
|
fread(contents, *len, 1, f); |
||||
|
fclose(f); |
||||
|
return contents; |
||||
|
} |
||||
|
|
||||
|
void remove_dupes(char *mem, size_t len) |
||||
|
{ |
||||
|
int found; |
||||
|
char last_char; |
||||
|
size_t last_char_pos; |
||||
|
|
||||
|
do { |
||||
|
found = 0; |
||||
|
last_char = '\0'; |
||||
|
last_char_pos = 0; |
||||
|
|
||||
|
for (size_t i = 0; i < len; i++) { |
||||
|
if (!mem[i]) continue; |
||||
|
|
||||
|
if (tolower(mem[i]) == tolower(last_char) && |
||||
|
mem[i] != last_char) { |
||||
|
mem[i] = mem[last_char_pos] = '\0'; |
||||
|
found = 1; |
||||
|
last_char_pos = 0; |
||||
|
last_char = '\0'; |
||||
|
} else { |
||||
|
last_char_pos = i; |
||||
|
last_char = mem[last_char_pos]; |
||||
|
} |
||||
|
} |
||||
|
} while (found); |
||||
|
} |
||||
|
|
||||
|
void remove_char(char *mem, size_t len, char c) |
||||
|
{ |
||||
|
for (char *i = mem; i < mem + len; i++) { |
||||
|
if (tolower(*i) == c) *i = '\0'; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
size_t strip_zeroes(char *mem, size_t len) |
||||
|
{ |
||||
|
size_t new_len = len; |
||||
|
|
||||
|
char *current = mem + len - 1; |
||||
|
while (len) { |
||||
|
while (len && *current) {len--; current--;} |
||||
|
if (!len) break; |
||||
|
|
||||
|
char *start = current; |
||||
|
while (len && !*current) {len--; current--;} |
||||
|
size_t diff = new_len - len - (start - current); |
||||
|
memmove(current + 1, start + 1, diff); |
||||
|
new_len = len + diff; |
||||
|
} |
||||
|
|
||||
|
return new_len; |
||||
|
} |
||||
|
|
||||
|
int main() |
||||
|
{ |
||||
|
size_t string_len; |
||||
|
char *string = read_file_contents("input", &string_len); |
||||
|
if (!string) return 1; |
||||
|
|
||||
|
while (isspace(string[string_len - 1])) string[--string_len] = '\0'; |
||||
|
|
||||
|
char *string_copy = malloc(string_len); |
||||
|
if (!string_copy) { |
||||
|
perror("malloc"); |
||||
|
free(string); |
||||
|
return 1; |
||||
|
} |
||||
|
size_t shortest = string_len; |
||||
|
|
||||
|
for (char x = 'a'; x <= 'z'; x++) { |
||||
|
printf("Attempting '%c'... ", x); |
||||
|
memcpy(string_copy, string, string_len); |
||||
|
remove_char(string_copy, string_len, x); |
||||
|
remove_dupes(string_copy, string_len); |
||||
|
size_t len = strip_zeroes(string_copy, string_len); |
||||
|
printf("%lu\n", len); |
||||
|
if (shortest > len) shortest = len; |
||||
|
} |
||||
|
|
||||
|
printf("Shortest: %lu\n", shortest); |
||||
|
|
||||
|
free(string_copy); |
||||
|
free(string); |
||||
|
return 0; |
||||
|
} |
Loading…
Reference in new issue