Skip to content

Commit 92468b1

Browse files
committed
Add day07b
1 parent 0603141 commit 92468b1

File tree

13 files changed

+301
-91
lines changed

13 files changed

+301
-91
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ day05b: src/day05b.c emulator parser
5353
day07a: src/day07a.c emulator parser
5454
$(CC) $(CFLAGS) $< -o $@.o emulator.o parser.o
5555

56-
day07b: src/day07b.c
57-
$(CC) $(CFLAGS) $< -o $@.o
56+
day07b: src/day07b.c emulator parser
57+
$(CC) $(CFLAGS) $< -o $@.o emulator.o parser.o
5858

5959
day08a: src/day08a.c
6060
$(CC) $(CFLAGS) $< -o $@.o

data/074.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3, 26, 1001, 26, -4, 26, 3, 27, 1002, 27, 2, 27, 1, 27, 26, 27, 4, 27, 1001, 28, -1, 28, 1005, 28, 6, 99, 0, 0, 5

data/075.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3, 52, 1001, 52, -5, 52, 3, 53, 1, 52, 56, 54, 1007, 54, 5, 55, 1005, 55, 26, 1001, 54, -5, 54, 1105, 1, 12, 1, 53, 54, 53, 1008, 54, 0, 55, 1001, 55, 1, 55, 2, 53, 55, 53, 4, 53, 1001, 56, -1, 56, 1005, 56, 6, 99, 0, 0, 0, 0, 10

lib/emulator.c

Lines changed: 59 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// Licensed under the MIT license.
44

55
#include <stdio.h>
6+
#include <string.h>
67
#include "emulator.h"
78

89
enum Opcode
@@ -33,23 +34,20 @@ static void emulator_on_output(Emulator instance, Word word)
3334
void emulator(Emulator instance, Word memory[])
3435
{
3536
instance->memory = memory;
37+
instance->instruction = instance->memory;
3638
instance->input = emulator_on_input;
3739
instance->output = emulator_on_output;
38-
40+
3941
queue(&instance->inputs, NULL, 0);
4042
queue(&instance->outputs, NULL, 0);
4143
}
4244

43-
static void emulator_move(
44-
Emulator instance,
45-
Word* instruction,
46-
Word result,
47-
int slot)
45+
static void emulator_move(Emulator instance, Word result, int slot)
4846
{
49-
instance->memory[instruction[slot]] = result;
47+
instance->memory[instance->instruction[slot]] = result;
5048
}
5149

52-
static Word emulator_load(Emulator instance, Word* instruction, int slot)
50+
static Word emulator_load(Emulator instance, int slot)
5351
{
5452
int denominator = 100;
5553

@@ -58,121 +56,132 @@ static Word emulator_load(Emulator instance, Word* instruction, int slot)
5856
denominator *= 10;
5957
}
6058

61-
Word value = instruction[slot];
59+
Word value = instance->instruction[slot];
6260

63-
if ((*instruction / denominator) % 10 == 0)
61+
if ((*instance->instruction / denominator) % 10 == 0)
6462
{
6563
return instance->memory[value];
6664
}
6765

6866
return value;
6967
}
7068

71-
void emulator_execute(Emulator instance)
69+
bool emulator_execute(Emulator instance)
7270
{
73-
Word* instruction = instance->memory;
74-
7571
for (;;)
7672
{
77-
Opcode opcode = *instruction % 100;
73+
Opcode opcode = *instance->instruction % 100;
7874

7975
switch (opcode)
8076
{
8177
case OPCODE_ADD:
8278
{
83-
Word a = emulator_load(instance, instruction, 1);
84-
Word b = emulator_load(instance, instruction, 2);
79+
Word a = emulator_load(instance, 1);
80+
Word b = emulator_load(instance, 2);
8581

86-
emulator_move(instance, instruction, a + b, 3);
82+
emulator_move(instance, a + b, 3);
8783

88-
instruction += 4;
84+
instance->instruction += 4;
8985
}
9086
break;
9187

9288
case OPCODE_MULTIPLY:
9389
{
94-
Word a = emulator_load(instance, instruction, 1);
95-
Word b = emulator_load(instance, instruction, 2);
90+
Word a = emulator_load(instance, 1);
91+
Word b = emulator_load(instance, 2);
9692

97-
emulator_move(instance, instruction, a * b, 3);
93+
emulator_move(instance, a * b, 3);
9894

99-
instruction += 4;
95+
instance->instruction += 4;
10096
}
10197
break;
10298

10399
case OPCODE_INPUT:
104100
{
105101
Word input;
106102

107-
instance->input(instance, &input);
108-
emulator_move(instance, instruction, input, 1);
103+
if (!instance->input(instance, &input))
104+
{
105+
return false;
106+
}
107+
108+
emulator_move(instance, input, 1);
109109

110-
instruction += 2;
110+
instance->instruction += 2;
111111
}
112112
break;
113113

114114
case OPCODE_OUTPUT:
115115
{
116-
Word output = emulator_load(instance, instruction, 1);
116+
Word output = emulator_load(instance, 1);
117117

118118
instance->output(instance, output);
119-
instruction += 2;
119+
instance->instruction += 2;
120120
}
121121
break;
122122

123123
case OPCODE_JUMP_IF_TRUE:
124-
if (emulator_load(instance, instruction, 1))
124+
if (emulator_load(instance, 1))
125125
{
126-
Word label = emulator_load(instance, instruction, 2);
126+
Word label = emulator_load(instance, 2);
127127

128-
instruction = instance->memory + label;
128+
instance->instruction = instance->memory + label;
129129

130130
break;
131131
}
132132

133-
instruction += 3;
133+
instance->instruction += 3;
134134
break;
135135

136136
case OPCODE_JUMP_IF_FALSE:
137-
if (!emulator_load(instance, instruction, 1))
137+
if (!emulator_load(instance, 1))
138138
{
139-
Word label = emulator_load(instance, instruction, 2);
139+
Word label = emulator_load(instance, 2);
140140

141-
instruction = instance->memory + label;
141+
instance->instruction = instance->memory + label;
142142

143143
break;
144144
}
145145

146-
instruction += 3;
146+
instance->instruction += 3;
147147
break;
148148

149149
case OPCODE_LESS_THAN:
150150
{
151-
Word a = emulator_load(instance, instruction, 1);
152-
Word b = emulator_load(instance, instruction, 2);
151+
Word a = emulator_load(instance, 1);
152+
Word b = emulator_load(instance, 2);
153153

154-
emulator_move(instance, instruction, a < b, 3);
154+
emulator_move(instance, a < b, 3);
155155

156-
instruction += 4;
156+
instance->instruction += 4;
157157
}
158158
break;
159159

160160
case OPCODE_EQUALS:
161161
{
162-
Word a = emulator_load(instance, instruction, 1);
163-
Word b = emulator_load(instance, instruction, 2);
162+
Word a = emulator_load(instance, 1);
163+
Word b = emulator_load(instance, 2);
164164

165-
emulator_move(instance, instruction, a == b, 3);
165+
emulator_move(instance, a == b, 3);
166166

167-
instruction += 4;
167+
instance->instruction += 4;
168168
}
169169
break;
170170

171-
case OPCODE_TERMINATE: return;
171+
case OPCODE_TERMINATE: return true;
172172
}
173173
}
174174
}
175175

176+
void emulator_reimage(Emulator instance, Word image[], int imageSize)
177+
{
178+
instance->instruction = instance->memory;
179+
180+
memcpy(instance->memory, image, imageSize * sizeof(Word));
181+
queue_clear(&instance->inputs);
182+
queue_clear(&instance->outputs);
183+
}
184+
176185
void queue(Queue instance, Word buffer[], int capacity)
177186
{
178187
instance->items = buffer;
@@ -225,3 +234,9 @@ bool queue_try_dequeue(Queue instance, Word* result)
225234

226235
return true;
227236
}
237+
238+
void queue_clear(Queue instance)
239+
{
240+
instance->first = -1;
241+
instance->last = -1;
242+
}

lib/emulator.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ struct Queue
1616
struct Emulator
1717
{
1818
long* memory;
19+
long* instruction;
1920

2021
bool (*input)(struct Emulator* instance, long* result);
2122
void (*output)(struct Emulator* instance, long value);
@@ -28,8 +29,10 @@ typedef struct Emulator* Emulator;
2829
typedef struct Queue* Queue;
2930

3031
void emulator(Emulator instance, Word memory[]);
31-
void emulator_execute(Emulator instance);
32+
bool emulator_execute(Emulator instance);
33+
void emulator_reimage(Emulator instance, Word image[], int imageSize);
3234

3335
void queue(Queue instance, Word buffer[], int capacity);
3436
void queue_enqueue(Queue instance, Word item);
3537
bool queue_try_dequeue(Queue instance, Word* result);
38+
void queue_clear(Queue instance);

lib/parser.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77
int parser_parse(FILE* stream, Word memory[])
88
{
99
Word word;
10-
int count = 0;
10+
int size = 0;
1111

1212
while (fscanf(stream, WORD_FORMAT ", ", &word) == 1)
1313
{
14-
memory[count] = word;
15-
count++;
14+
memory[size] = word;
15+
size++;
1616
}
1717

18-
return count;
18+
return size;
1919
}
2020

2121
int parser_parse_file(ZString path, Word memory[])
@@ -27,12 +27,12 @@ int parser_parse_file(ZString path, Word memory[])
2727
return 0;
2828
}
2929

30-
int count = parser_parse(stream, memory);
30+
int size = parser_parse(stream, memory);
3131

3232
if (fclose(stream) == EOF)
3333
{
3434
return 0;
3535
}
3636

37-
return count;
37+
return size;
3838
}

src/day02b.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,27 @@
44

55
// 1202 Program Alarm Part 2
66

7-
#include <string.h>
87
#include <time.h>
98
#include "../lib/emulator.h"
109
#include "../lib/parser.h"
1110
#define MEMORY 256
1211

13-
static Word scan(Word image[], int length)
12+
static Word scan(Word image[], int imageSize)
1413
{
14+
Word memory[MEMORY];
15+
struct Emulator processor;
16+
17+
emulator(&processor, memory);
18+
1519
for (Word noun = 0; noun < 100; noun++)
1620
{
1721
for (Word verb = 0; verb < 100; verb++)
1822
{
19-
Word memory[MEMORY];
20-
struct Emulator processor;
21-
22-
memcpy(memory, image, sizeof(Word) * length);
23+
emulator_reimage(&processor, image, imageSize);
2324

2425
memory[1] = noun;
2526
memory[2] = verb;
2627

27-
emulator(&processor, memory);
2828
emulator_execute(&processor);
2929

3030
if (memory[0] == 19690720)

src/day07a.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "../lib/parser.h"
1313
#define INPUTS 2
1414
#define MEMORY 4096
15-
#define OUTPUTS 100
15+
#define OUTPUTS 1
1616

1717
struct PermutationIterator
1818
{
@@ -74,30 +74,30 @@ void permutation_next(PermutationIterator iter)
7474
int main()
7575
{
7676
Word max = 0;
77-
Word programMemory[MEMORY];
78-
Word sharedMemory[5][MEMORY];
77+
Word image[MEMORY];
78+
Word memory[5][MEMORY];
7979
Word inputs[5][INPUTS];
8080
Word outputs[5][OUTPUTS];
8181
struct PermutationIterator iter;
8282
struct Emulator amplifiers[5];
8383
int set[] = { 0, 1, 2, 3, 4 };
8484
clock_t start = clock();
85-
int length = parser_parse(stdin, programMemory);
85+
int size = parser_parse(stdin, image);
8686

87-
for (permutation_begin(set, 5, &iter); !iter.end; permutation_next(&iter))
87+
for (int i = 0; i < 5; i++)
8888
{
89-
for (int i = 0; i < 5; i++)
90-
{
91-
memcpy(sharedMemory[i], programMemory, length * sizeof(Word));
92-
emulator(amplifiers + i, sharedMemory[i]);
93-
queue(&amplifiers[i].inputs, inputs[i], INPUTS);
94-
queue(&amplifiers[i].outputs, outputs[i], OUTPUTS);
95-
}
89+
emulator(amplifiers + i, memory[i]);
90+
queue(&amplifiers[i].inputs, inputs[i], INPUTS);
91+
queue(&amplifiers[i].outputs, outputs[i], OUTPUTS);
92+
}
9693

94+
for (permutation_begin(set, 5, &iter); !iter.end; permutation_next(&iter))
95+
{
9796
Word output = 0;
9897

9998
for (int i = 0; i < 5; i++)
10099
{
100+
emulator_reimage(amplifiers + i, image, size);
101101
queue_enqueue(&amplifiers[i].inputs, set[i]);
102102
queue_enqueue(&amplifiers[i].inputs, output);
103103
emulator_execute(amplifiers + i);

0 commit comments

Comments
 (0)