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
|
#include "allocator.h"
#include "aoc.h"
#include "dvec_s.h"
#include "util.h"
#include <assert.h>
#include <stdlib.h>
static void
deck_cut(struct dvec *deck, struct dvec *table, ssize_t in)
{
int *src, *dst;
size_t i, split, n;
n = deck->len;
split = in < 0 ? (size_t) ((ssize_t) deck->len + in) : (size_t) in;
src = deck->data;
dst = table->data;
for (i = 0; i < split; i++)
dst[i + n - split] = src[i];
for (i = split; i < n; i++)
dst[i - split] = src[i];
dvec_swap(deck, table);
}
static void
deal_increment(struct dvec *deck, struct dvec *table, size_t inc)
{
int *src, *dst;
size_t i, n, p;
n = deck->len;
src = deck->data;
dst = table->data;
p = 0;
for (i = 0; i < n; i++) {
dst[p] = src[i];
p = (p + inc) % n;
}
dvec_swap(deck, table);
}
static void
deal_new_stack(struct dvec *deck, struct dvec *table)
{
int *src, *dst;
size_t i, n;
n = deck->len - 1;
src = deck->data;
dst = table->data;
for (i = 0; i <= n; i++)
dst[n - i] = src[i];
dvec_swap(deck, table);
}
static size_t
find_card(struct dvec *deck, int card)
{
int *data;
size_t i, n;
n = deck->len;
data = deck->data;
for (i = 0; i < n; i++) {
if (data[i] == card)
return i;
}
return 0;
}
void
part1(void)
{
char line[256];
const char *lpos, *lend;
struct dvec deck, table;
size_t i, count;
size_t answer;
ssize_t val;
int target;
int *data;
if (!strcmp(aoc.inputfile, "input")) {
count = 10007;
target = 2019;
} else {
count = 10;
target = 9;
}
dvec_init(&deck, sizeof(int), count, &stdlib_strict_heap_allocator);
dvec_init(&table, sizeof(int), count, &stdlib_strict_heap_allocator);
dvec_add_slots(&deck, count);
dvec_add_slots(&table, count);
data = deck.data;
for (i = 0; i < count; i++)
data[i] = (int) i;
lpos = aoc.input;
lend = lpos + aoc.input_size;
while (readtok(line, sizeof(line), '\n', &lpos, lend)) {
if (sscanf(line, "deal with increment %li", &val) == 1) {
deal_increment(&deck, &table, (size_t) val);
} else if (sscanf(line, "cut %li", &val) == 1) {
deck_cut(&deck, &table, val);
} else if (!strcmp(line, "deal into new stack")) {
deal_new_stack(&deck, &table);
} else if (strspn(line, " \n\r\t\v") == strlen(line)) {
continue;
} else {
assert(false);
}
aoc_debug("%i pos: %lu\n", target, find_card(&deck, target));
}
answer = find_card(&deck, target);
aoc.answer = aprintf("%lu", answer);
aoc.solution = "7171";
dvec_deinit(&table);
dvec_deinit(&deck);
}
|