فهرست منبع

[C] Adding Solution for Problem 0008

Vinicius Teshima 1 سال پیش
والد
کامیت
ba1c2ec1c2
5فایلهای تغییر یافته به همراه191 افزوده شده و 4 حذف شده
  1. 2 1
      c/.gitignore
  2. 89 0
      c/0008.c
  3. 8 3
      c/Makefile
  4. 6 0
      c/Project.ede
  5. 86 0
      c/da.h

+ 2 - 1
c/.gitignore

@@ -8,4 +8,5 @@
 0004
 0005
 0006
-0007
+0007
+0008

+ 89 - 0
c/0008.c

@@ -0,0 +1,89 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "da.h"
+
+
+DA_DEF_STRUCT(char, str);
+DA_DEF_STRUCT(uint64_t, prods);
+
+void str_append(struct str *str, const char *cstr);
+uint8_t char_to_u8(char c);
+
+int
+main(int argc, const char **argv)
+{
+	uint64_t res = 0;
+	uint64_t i = 0, j = 0;
+	uint64_t window_size = 13;
+	struct str str = {NULL, 0, 1024};
+	struct prods prods = {0};
+	DA_CREATE(prods, sizeof(*prods.items));
+
+	str.items = calloc(str.cap, sizeof(*str.items));
+
+	str_append(&str, "73167176531330624919225119674426574742355349194934");
+	str_append(&str, "96983520312774506326239578318016984801869478851843");
+	str_append(&str, "85861560789112949495459501737958331952853208805511");
+	str_append(&str, "12540698747158523863050715693290963295227443043557");
+	str_append(&str, "66896648950445244523161731856403098711121722383113");
+	str_append(&str, "62229893423380308135336276614282806444486645238749");
+	str_append(&str, "30358907296290491560440772390713810515859307960866");
+	str_append(&str, "70172427121883998797908792274921901699720888093776");
+	str_append(&str, "65727333001053367881220235421809751254540594752243");
+	str_append(&str, "52584907711670556013604839586446706324415722155397");
+	str_append(&str, "53697817977846174064955149290862569321978468622482");
+	str_append(&str, "83972241375657056057490261407972968652414535100474");
+	str_append(&str, "82166370484403199890008895243450658541227588666881");
+	str_append(&str, "16427171479924442928230863465674813919123162824586");
+	str_append(&str, "17866458359124566529476545682848912883142607690042");
+	str_append(&str, "24219022671055626321111109370544217506941658960408");
+	str_append(&str, "07198403850962455444362981230987879927244284909188");
+	str_append(&str, "84580156166097919133875499200524063689912560717606");
+	str_append(&str, "05886116467109405077541002256983155200055935729725");
+	str_append(&str, "71636269561882670428252483600823257530420752963450");
+
+	for ( i = 0; i < str.size - window_size; ++i ) {
+		uint64_t t = 1;
+		for ( j = 0; j < window_size; ++j ) {
+			t *= (uint64_t) char_to_u8(*(str.items + i + j));
+		}
+		DA_APPEND(prods, t);
+	}
+
+	for ( i = 0; i < prods.size; ++i ) {
+		if ( prods.items[i] > res ) {
+			res = prods.items[i];
+		}
+	}
+
+	printf("Result = %ld!\n", res);
+	free(str.items);
+	free(prods.items);
+	(void) argc; (void) argv;
+	return 0;
+}
+
+void
+str_append(struct str *str, const char *cstr)
+{
+	uint64_t cstr_lenght = strlen(cstr);
+	if ( (str->size + cstr_lenght) >= str->cap ) {
+		str->cap *= 2;
+		str->items = realloc(str->items, str->cap);
+	}
+
+	while ( *cstr != '\0' ) {
+		str->items[str->size++] = *cstr;
+		++cstr;
+	}
+}
+
+uint8_t
+char_to_u8(char c)
+{
+	return (uint8_t)(c - '0');
+}
+

+ 8 - 3
c/Makefile

@@ -29,13 +29,15 @@ C_LINK=$(CC) $(CFLAGS) $(LDFLAGS) -L.
 0006_OBJ= 0006.o
 0007_SOURCES=0007.c
 0007_OBJ= 0007.o
+0008_SOURCES=0008.c
+0008_OBJ= 0008.o
 VERSION=1.0
 DISTDIR=$(top)ProjectEuler_C-$(VERSION)
 top_builddir = 
 
-DEP_FILES=.deps/0001.P .deps/0002.P .deps/0003.P .deps/0004.P .deps/0005.P .deps/0006.P .deps/0007.P
+DEP_FILES=.deps/0001.P .deps/0002.P .deps/0003.P .deps/0004.P .deps/0005.P .deps/0006.P .deps/0007.P .deps/0008.P
 
-all: 0001 0002 0003 0004 0005 0006 0007
+all: 0001 0002 0003 0004 0005 0006 0007 0008
 
 DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
 -include $(DEP_FILES)
@@ -65,6 +67,9 @@ DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
 0007: $(0007_OBJ)
 	$(C_LINK) -o $@ $^ $(LDDEPS)
 
+0008: $(0008_OBJ)
+	$(C_LINK) -o $@ $^ $(LDDEPS)
+
 tags: 
 
 
@@ -75,7 +80,7 @@ clean:
 
 dist:
 	mkdir $(DISTDIR)
-	cp $(0001_SOURCES) $(0002_SOURCES) $(0003_SOURCES) $(0004_SOURCES) $(0005_SOURCES) $(0006_SOURCES) $(0007_SOURCES) $(ede_FILES) $(DISTDIR)
+	cp $(0001_SOURCES) $(0002_SOURCES) $(0003_SOURCES) $(0004_SOURCES) $(0005_SOURCES) $(0006_SOURCES) $(0007_SOURCES) $(0008_SOURCES) $(ede_FILES) $(DISTDIR)
 
 Makefile: Project.ede
 	@echo Makefile is out of date!  It needs to be regenerated by EDE.

+ 6 - 0
c/Project.ede

@@ -46,6 +46,12 @@
       :name "0007"
       :path ""
       :source '("0007.c")
+      :configuration-variables '("debug" ("CFLAGS" . "-g") ("LDFLAGS" . "-g")))
+    (ede-proj-target-makefile-program "0008"
+      :object-name "0008"
+      :name "0008"
+      :path ""
+      :source '("0008.c")
       :configuration-variables '("debug" ("CFLAGS" . "-g") ("LDFLAGS" . "-g"))))
   :configurations '("debug" "release")
   :object-name "ProjectEuler_C"

+ 86 - 0
c/da.h

@@ -0,0 +1,86 @@
+#ifndef DA_H
+#define DA_H
+
+#define CONCAT(a, b) CONCAT_INNER(a, b)
+#define CONCAT_INNER(a, b) a ## b
+
+#define UNIQUE_NAME(base) CONCAT(base, __COUNTER__)
+
+#include <stdlib.h>
+
+#define DA_DEF_STRUCT(type, name)		\
+	struct name {				\
+		type *items;			\
+		size_t size;			\
+		size_t cap;			\
+	}
+
+#define DA_DEF_STRUCT_ITEM(type, name)		\
+	struct {				\
+		type *items;			\
+		size_t size;			\
+		size_t cap;			\
+	} name
+
+#define DA_CREATE(da, item_size)				\
+	do {							\
+		(da).cap = 16;					\
+		(da).size = 0;					\
+		(da).items = calloc((da).cap, item_size);	\
+	} while(0)
+
+#define DA_DESTROY(da)					\
+	do {						\
+		free((da).items);			\
+	} while(0)
+
+#define DA_CLEAR(da)					\
+	do {						\
+		(da).size = 0;				\
+	} while(0)
+
+#define _DA_DELETE(da, index, i)					\
+	do {								\
+		if ( index > (da).size ) {				\
+			break;						\
+		}							\
+		memmove((da).items+index, (da).items+index+1,		\
+			(da).cap - (index+1));				\
+		--(da).size;						\
+	} while(0)
+
+#define DA_DELETE(da, index) \
+	_DA_DELETE(da, index, UNIQUE_NAME(_i))
+
+#define _DA_INSERT(da, item, index, i)					\
+	do {								\
+		if ( index > (da.size) ) {				\
+			break;						\
+		}							\
+		if ( (da).size+1 >= (da).cap ) {			\
+			(da).cap *= 2;					\
+			(da).items = realloc((da).items,		\
+					     (da).cap * sizeof(*(da).items)); \
+		}							\
+		memmove((da).items+index+1, (da).items+index,		\
+			(da).cap - index);				\
+		(da).items[index] = item;				\
+		(da).size++;						\
+	} while(0)
+
+#define DA_INSERT(da, item, index) \
+	_DA_INSERT(da, item, index, UNIQUE_NAME(_i))
+
+#define DA_APPEND(da, item)						\
+	do {								\
+		if ( (da).size+1 >= (da).cap ) {			\
+			(da).cap *= 2;					\
+			(da).items = realloc((da).items,		\
+					     (da).cap * sizeof(*(da).items)); \
+		}							\
+		(da).items[(da).size++] = item;			\
+	} while(0)
+
+#define DA_TAIL(da) (da).items[(da).size-1]
+
+#endif