94 lines
2.3 KiB
C
94 lines
2.3 KiB
C
#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;
|
|
}
|