|
@@ -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');
|
|
|
|
|
+}
|
|
|
|
|
+
|