summaryrefslogtreecommitdiff
path: root/0022/main.c
blob: 760c7d72c1be2aede372428eb2cd45ee5af77c1e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>

#define VECTOR_DEF(T) \
    typedef struct { \
        T* buffer; \
        int size; \
        int cap; \
    } T##Vector; \
    \
    void T##Vector_init(T##Vector *self); \
    void T##Vector_push_back(T##Vector *self, T elem); \
    void T##Vector_insert_before(T##Vector *self, int n, T elem); \
    void T##Vector_pop(T##Vector *self); \
    bool T##Vector_empty(T##Vector *self); \
    void T##Vector_remove(T##Vector *self, size_t n); \
    size_t T##Vector_len(T##Vector *self); \
    T* T##Vector_begin(T##Vector *self); \
    T* T##Vector_last(T##Vector *self); \
    T* T##Vector_end(T##Vector *self); \
    T* T##Vector_ref(T##Vector *self, size_t n); \
    void T##Vector_swap(T##Vector *self, int i, int j); \
    T##Vector T##Vector_move(T##Vector *self); \
    void T##Vector_show(T##Vector *self, FILE* fp); \
    void T##Vector_free(T##Vector *self);

#define VECTOR_IMPL(T) \
    void T##Vector_init(T##Vector *self) { \
        self->buffer = (T*)malloc(sizeof(T) * 16); \
        self->cap = 16; \
        self->size = 0; \
    } \
    \
    void T##Vector_push_back(T##Vector *self, T elem) { \
        if (self->size + 1 > self->cap) { \
            self->buffer = realloc(self->buffer, sizeof(T) * self->cap * 2); \
            self->cap *= 2; \
        } \
        self->buffer[self->size] = elem; \
        self->size += 1; \
    } \
    void T##Vector_insert_before(T##Vector *self, int n, T elem) { \
        if (n < 0 || n > self->size) { \
            return; \
        } \
        if (self->size + 1 > self->cap) { \
            self->buffer = malloc(sizeof(T) * self->cap * 2); \
            self->cap *= 2; \
        } \
        if (n != self->size) { \
            memmove(self->buffer + n + 1, \
                    self->buffer + n, \
                    sizeof(T) * (self->size - n)); \
            self->buffer[n] = elem; \
            self->size += 1; \
        } \
    } \
    void T##Vector_pop(T##Vector *self) { \
        self->size -= 1; \
    } \
    void T##Vector_remove(T##Vector *self, size_t n) { \
        if (n < 0 || n >= self->size) return; \
        memmove(self->buffer + n, \
                self->buffer + n + 1, \
                sizeof(T) * self->size - n - 1); \
        self->size -= 1; \
    } \
    T* T##Vector_begin(T##Vector *self) { return self->buffer; } \
    bool T##Vector_empty(T##Vector *self) { return self->size == 0; } \
    T* T##Vector_end(T##Vector *self) { return self->buffer + self->size; } \
    T* T##Vector_last(T##Vector *self) { return self->buffer + self->size - 1; } \
    T* T##Vector_ref(T##Vector *self, size_t n) { return self->buffer + n; } \
    void T##Vector_swap(T##Vector *self, int i, int j) { \
        T buf; \
        memcpy(&buf, self->buffer + i, sizeof(T)); \
        memcpy(self->buffer + i, self->buffer + j, sizeof(T)); \
        memcpy(self->buffer + j, &buf, sizeof(T)); \
    } \
    T##Vector T##Vector_move(T##Vector *self) { \
        T##Vector dup = *self; \
        self->buffer = NULL; \
        self->size = 0; \
        self->cap = 0; \
        return dup; \
    } \
    void T##Vector_show(T##Vector *self, FILE* fp) { \
        fprintf(fp, "["); \
        for (int i = 0; i < self->size-1; i++) { \
            T##_show(&self->buffer[i], fp); \
            fprintf(fp, ", "); \
        } \
        if (self->size > 0) { \
            T##_show(&self->buffer[self->size - 1], fp); \
        } \
        fprintf(fp, "]"); \
    } \
    size_t T##Vector_len(T##Vector *self) { return self->size; } \
    void T##Vector_free(T##Vector *self) { free(self->buffer); }

typedef char *String;

void String_show(String *s, FILE *fp) {
    fprintf(fp, "%s", *s);
}

VECTOR_DEF(String);
VECTOR_IMPL(String);

char *append(char *s, char c) {
    int len = strlen(s);
    char *ns = malloc(len + 2);
    strcpy(ns, s);
    ns[len] = c;
    ns[len + 1] = '\0';
    return ns;
}

void gen_impl(StringVector *res, char* current, int n, int unclosed, int finished) {
    if (unclosed == 0 && finished == n) {
        printf("add: %s\n", current);
        StringVector_push_back(res, current);
        StringVector_show(res, stdout);
        return;
    }
    if (unclosed > 0) {
        gen_impl(res, append(current, ')'), n, unclosed - 1, finished + 1);
    }
    if (unclosed + finished < n) {
        gen_impl(res, append(current, '('), n, unclosed + 1, finished);
    }
    free(current);
}

char** generateParenthesis(int n, int* returnSize) {
    StringVector result;
    StringVector_init(&result);
    char *empty = malloc(1);
    empty[0] = '\0';
    gen_impl(&result, empty, n, 0, 0);
    *returnSize = StringVector_len(&result);
    return result.buffer;
}

int main() {
    int size;
    generateParenthesis(3, &size);
    printf("\n");
}