diff options
| author | Tomasz Kramkowski <tk@the-tk.com> | 2021-11-27 17:13:03 +0000 | 
|---|---|---|
| committer | Tomasz Kramkowski <tk@the-tk.com> | 2021-11-27 17:13:03 +0000 | 
| commit | 4d08e60b5dffd4c0be3b8e2d3d16c63d2fffae00 (patch) | |
| tree | 4ce5a6909d8e37ebe9479465eb67db453f439c44 | |
| parent | ac1b99879c191770085c43dcdb13027b44eae84c (diff) | |
| download | aoc2015-master.tar.gz aoc2015-master.tar.xz aoc2015-master.zip  | |
| -rw-r--r-- | 10/solution.c | 70 | 
1 files changed, 70 insertions, 0 deletions
diff --git a/10/solution.c b/10/solution.c new file mode 100644 index 0000000..1292490 --- /dev/null +++ b/10/solution.c @@ -0,0 +1,70 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +struct rle { +	unsigned char count : 2; +	unsigned char digit   : 2; +}; + +struct buf { +	struct rle *buf; +	size_t count; +}; + +size_t len(const struct buf *buf) +{ +	size_t len = 0; +	for (size_t i = 0; i < buf->count; i++) +		len += buf->buf[i].count; +	return len; +} + +void append(struct buf *buf, unsigned char digit) +{ +	if (buf->count == 0 || buf->buf[buf->count - 1].digit != digit) { +		buf->buf[buf->count++] = (struct rle){ 1, digit }; +		return; +	} +	buf->buf[buf->count - 1].count++; +} + +void solve(const struct buf *input, size_t *p1, size_t *p2) { +	struct buf bufs[2]; +	bufs[0].buf = malloc(sizeof *bufs[0].buf * 0xa00000); +	bufs[1].buf = malloc(sizeof *bufs[1].buf * 0xa00000); +	int srcbuf = 0; +	memcpy(bufs[srcbuf].buf, input->buf, +	       sizeof *bufs[srcbuf].buf * input->count); +	bufs[srcbuf].count = input->count; + +	for (int i = 0; i < 50; i++) { +		if (i == 40) *p1 = len(&bufs[srcbuf]); +		bufs[!srcbuf].count = 0; +		for (int j = 0; j < bufs[srcbuf].count; j++) { +			append(&bufs[!srcbuf], bufs[srcbuf].buf[j].count); +			append(&bufs[!srcbuf], bufs[srcbuf].buf[j].digit); +		} +		srcbuf = !srcbuf; +	} + +	*p2 = len(&bufs[srcbuf]); +} + +int main(void) +{ +	struct buf input = { +		(struct rle []){ +			{3, 1}, +			{1, 3}, +			{3, 2}, +			{2, 1}, +			{1, 3}, +		}, +		5, +	}; +	size_t p1, p2; + +	solve(&input, &p1, &p2); +	printf("%zu\n%zu\n", p1, p2); +}  | 
