finish 09 in suffer
This commit is contained in:
parent
febcd39546
commit
a14d1dd8c0
41
09/Makefile
Normal file
41
09/Makefile
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
CC := gcc
|
||||||
|
LD := $(CC)
|
||||||
|
LIBS := -lm
|
||||||
|
LDFLAGS :=
|
||||||
|
CFLAGS := -Wall -Wextra -Wno-override-init -std=c2x -include_.h
|
||||||
|
SRC := part1.c mylib.c
|
||||||
|
ifeq ($(PART),2)
|
||||||
|
SRC := part2.c mylib.c
|
||||||
|
endif
|
||||||
|
OBJ_DIR := build
|
||||||
|
OBJ := $(addprefix $(OBJ_DIR)/, $(patsubst %.c,%.o,$(SRC)))
|
||||||
|
DIR := .
|
||||||
|
RAW_NAME:= a.out
|
||||||
|
NAME := $(RAW_NAME)
|
||||||
|
|
||||||
|
ifeq ($(RELEASE),1)
|
||||||
|
CFLAGS += -O3
|
||||||
|
LDFLAGS += -O3 -s
|
||||||
|
else
|
||||||
|
CFLAGS += -O0 -g3
|
||||||
|
LDFLAGS += -O0 -g
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: $(NAME)
|
||||||
|
|
||||||
|
$(NAME): $(OBJ)
|
||||||
|
$(LD) $(LDFLAGS) -o $(DIR)/$(NAME) $(OBJ) $(LIBS)
|
||||||
|
|
||||||
|
$(OBJ_DIR)/%.o: %.c
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -rf $(OBJ_DIR)
|
||||||
|
@rm -rf $(RAW_NAME)
|
||||||
|
|
||||||
|
re:
|
||||||
|
@make --no-print clean
|
||||||
|
@make --no-print all
|
||||||
|
|
||||||
|
.PHONY: all clean re
|
27
09/_.h
Normal file
27
09/_.h
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
|
||||||
|
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
|
||||||
|
#define ABS(X) ((X) >= 0 ? (X) : -(X))
|
||||||
|
|
||||||
|
char** str_split(char* a_str, const char a_delim);
|
||||||
|
|
||||||
|
int str_index(char *str, char c);
|
||||||
|
|
||||||
|
int number_of_element(char *str, char c);
|
||||||
|
|
||||||
|
long gmc(long a, long b);
|
||||||
|
long lmc(long a, long b);
|
||||||
|
long lmcs(int array[], int n);
|
||||||
|
|
||||||
|
long strslen(char **strs);
|
1
09/main.txt
Normal file
1
09/main.txt
Normal file
File diff suppressed because one or more lines are too long
91
09/mylib.c
Normal file
91
09/mylib.c
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
#include "_.h"
|
||||||
|
|
||||||
|
// NOT MY CODE
|
||||||
|
// https://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c
|
||||||
|
char** str_split(char* str, const char a_delim)
|
||||||
|
{
|
||||||
|
char *a_str = strdup(str);
|
||||||
|
char** result = 0;
|
||||||
|
size_t count = 0;
|
||||||
|
char* tmp = a_str;
|
||||||
|
char* last_comma = 0;
|
||||||
|
char delim[2];
|
||||||
|
delim[0] = a_delim;
|
||||||
|
delim[1] = 0;
|
||||||
|
|
||||||
|
while (*tmp)
|
||||||
|
{
|
||||||
|
if (a_delim == *tmp)
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
last_comma = tmp;
|
||||||
|
}
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
|
||||||
|
count += last_comma < (a_str + strlen(a_str) - 1);
|
||||||
|
|
||||||
|
count++;
|
||||||
|
|
||||||
|
result = malloc(sizeof(char*) * count);
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
size_t idx = 0;
|
||||||
|
char* token = strtok(a_str, delim);
|
||||||
|
|
||||||
|
while (token)
|
||||||
|
{
|
||||||
|
//assert(idx < count);
|
||||||
|
*(result + idx++) = strdup(token);
|
||||||
|
token = strtok(0, delim);
|
||||||
|
}
|
||||||
|
//assert(idx == count - 1);
|
||||||
|
*(result + idx) = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(a_str);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int str_index(char *str, char c) {
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while (str[i])
|
||||||
|
if (str[i++] == c)
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int number_of_element(char *str, char c) {
|
||||||
|
int nbr = 0;
|
||||||
|
for (int i = 0; str[i] != '\0'; i++)
|
||||||
|
if (str[i] == c)
|
||||||
|
nbr++;
|
||||||
|
return nbr;
|
||||||
|
}
|
||||||
|
|
||||||
|
long gmc(long a, long b) {
|
||||||
|
if (b == 0)
|
||||||
|
return a;
|
||||||
|
return gmc(b, a % b);
|
||||||
|
}
|
||||||
|
|
||||||
|
long lmc(long a, long b) {
|
||||||
|
return (a / gmc(a, b)) * b;
|
||||||
|
}
|
||||||
|
|
||||||
|
long lmcs(int array[], int n) {
|
||||||
|
long result = array[0];
|
||||||
|
for (int i = 1; i < n; i++)
|
||||||
|
result = lmc(result, array[i]);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
long strslen(char **strs) {
|
||||||
|
long count = 0;
|
||||||
|
while (strs[count])
|
||||||
|
count++;
|
||||||
|
return count;
|
||||||
|
}
|
77
09/part1.c
Normal file
77
09/part1.c
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
#include "_.h"
|
||||||
|
|
||||||
|
void display(char **numbers) {
|
||||||
|
for (int i = 0; numbers[i] != NULL; i++) {
|
||||||
|
for (int j = 0; numbers[i][j] != '\0'; j++)
|
||||||
|
printf("%c", numbers[i][j]);
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
char **first_line(char *input) {
|
||||||
|
|
||||||
|
char **numbers = calloc(pow(strlen(input), 2) + 1, sizeof(char*));
|
||||||
|
int count = 0;
|
||||||
|
int id = 0;
|
||||||
|
for (int i = 0; input[i] != '\0'; i++) {
|
||||||
|
int nbr = atoi(strndup(&input[i], 1));
|
||||||
|
char *add = calloc(11, 1);
|
||||||
|
add[0] = '.';
|
||||||
|
if (i % 2 == 0)
|
||||||
|
sprintf(add, "%d", id++);
|
||||||
|
|
||||||
|
for (int j = 0; j < nbr; j++)
|
||||||
|
numbers[count++] = strdup(add);
|
||||||
|
}
|
||||||
|
|
||||||
|
//display(numbers);
|
||||||
|
|
||||||
|
return numbers;
|
||||||
|
}
|
||||||
|
|
||||||
|
char **finish(char **numbers) {
|
||||||
|
long i = 1;
|
||||||
|
long lens = strslen(numbers);
|
||||||
|
for (; i < lens; i++) {
|
||||||
|
char *to_place;
|
||||||
|
long j = lens - 1;
|
||||||
|
for (;numbers[j][0] == '.'; j--);
|
||||||
|
to_place = numbers[j];
|
||||||
|
|
||||||
|
for (long k = 0; k < lens; k++) {
|
||||||
|
if (numbers[k][0] == '.') {
|
||||||
|
for (int w = 0; w < strlen(numbers[j]); w++)
|
||||||
|
numbers[k][w] = to_place[w];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int k = 0; numbers[j][k] != '\0'; k++)
|
||||||
|
numbers[j][k] = '.';
|
||||||
|
}
|
||||||
|
//display(numbers);
|
||||||
|
|
||||||
|
return numbers;
|
||||||
|
}
|
||||||
|
|
||||||
|
long cal(char **numbers) {
|
||||||
|
long calc = 0;
|
||||||
|
int i = 0;
|
||||||
|
for (; numbers[i] != NULL && numbers[i][0] != '.'; i++)
|
||||||
|
calc += i * atol(numbers[i]);
|
||||||
|
return calc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
if (argc != 2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
char *input = argv[1];
|
||||||
|
char **numbers = first_line(input);
|
||||||
|
long result = cal(finish(numbers));
|
||||||
|
//display(numbers);
|
||||||
|
|
||||||
|
printf("result: %ld\n", result);
|
||||||
|
return 0;
|
||||||
|
}
|
93
09/part2.c
Normal file
93
09/part2.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
#include "_.h"
|
||||||
|
|
||||||
|
void display(char **numbers) {
|
||||||
|
for (int i = 0; numbers[i] != NULL; i++) {
|
||||||
|
for (int j = 0; numbers[i][j] != '\0'; j++)
|
||||||
|
printf("%c", numbers[i][j]);
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
char **first_line(char *input) {
|
||||||
|
|
||||||
|
char **numbers = calloc(pow(strlen(input), 2) + 1, sizeof(char*));
|
||||||
|
int count = 0;
|
||||||
|
int id = 0;
|
||||||
|
for (int i = 0; input[i] != '\0'; i++) {
|
||||||
|
int nbr = atoi(strndup(&input[i], 1));
|
||||||
|
char *add = calloc(255, 1);
|
||||||
|
add[0] = '.';
|
||||||
|
if (i % 2 == 0)
|
||||||
|
sprintf(add, "%d", id++);
|
||||||
|
|
||||||
|
for (int j = 0; j < nbr; j++)
|
||||||
|
numbers[count++] = strdup(add);
|
||||||
|
}
|
||||||
|
|
||||||
|
//display(numbers);
|
||||||
|
|
||||||
|
return numbers;
|
||||||
|
}
|
||||||
|
|
||||||
|
char **finish(char **numbers) {
|
||||||
|
long i = 0;
|
||||||
|
long lens = strslen(numbers);
|
||||||
|
for (; i < lens - 1;) {
|
||||||
|
char *to_place[10] = { [0 ... 9] = NULL };
|
||||||
|
long j = lens - 1 - i;
|
||||||
|
for (;numbers[j][0] == '.' && j > 0; j--);
|
||||||
|
i = lens - j - 1;
|
||||||
|
int w = 0;
|
||||||
|
for (; j - w > 0 && strcmp(numbers[j], numbers[j - w]) == 0; w++) {
|
||||||
|
to_place[w] = numbers[j - w];
|
||||||
|
}
|
||||||
|
|
||||||
|
int placed = 0;
|
||||||
|
for (long k = 0; k < lens && k < j; k++) {
|
||||||
|
if (numbers[k][0] == '.') {
|
||||||
|
int y = 0;
|
||||||
|
for (; numbers[k + y] != NULL && numbers[k + y][0] == '.'; y++);
|
||||||
|
if (y < w)
|
||||||
|
continue;
|
||||||
|
placed = 1;
|
||||||
|
for (int v = 0; to_place[v] != NULL; v++) {
|
||||||
|
for (int x = 0; to_place[v][x] != '\0'; x++) {
|
||||||
|
numbers[k + v][x] = to_place[v][x];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (placed)
|
||||||
|
for (int k = 0; to_place[k] != NULL; k++)
|
||||||
|
for (int l = 0; to_place[k][l] != '\0'; l++)
|
||||||
|
to_place[k][l] = '.';
|
||||||
|
i += strslen(to_place);
|
||||||
|
}
|
||||||
|
//display(numbers);
|
||||||
|
|
||||||
|
return numbers;
|
||||||
|
}
|
||||||
|
|
||||||
|
long cal(char **numbers) {
|
||||||
|
long calc = 0;
|
||||||
|
int i = 0;
|
||||||
|
for (; numbers[i] != NULL; i++)
|
||||||
|
calc += i * atol(numbers[i]);
|
||||||
|
return calc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
if (argc != 2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
char *input = argv[1];
|
||||||
|
char **numbers = first_line(input);
|
||||||
|
long result = cal(finish(numbers));
|
||||||
|
//display(numbers);
|
||||||
|
|
||||||
|
printf("result: %ld\n", result);
|
||||||
|
return 0;
|
||||||
|
}
|
1
09/test.txt
Normal file
1
09/test.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2333133121414131402
|
Loading…
Reference in a new issue