Skip to content

Commit 17f239e

Browse files
committed
Extract permutation iterator
1 parent 92468b1 commit 17f239e

File tree

7 files changed

+81
-131
lines changed

7 files changed

+81
-131
lines changed

Makefile

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ all: \
88
day02a day02b \
99
day05a day05b \
1010
day07a day07b \
11-
day08a day08b \
1211
day09a day09b \
1312
day10a \
1413
day11a day11b \
@@ -31,13 +30,16 @@ emulator: lib/emulator.h lib/emulator.c
3130

3231
parser: lib/parser.h lib/parser.c
3332
$(CC) $(CFLAGS) -c lib/parser.c -o parser.o
34-
33+
3534
emulate: tools/emulate.c emulator parser
3635
$(CC) $(CFLAGS) $< -o emulate.o emulator.o parser.o
3736

3837
intcode: tools/intcode.c emulator parser
3938
$(CC) $(CFLAGS) $< -o intcode.o emulator.o parser.o
4039

40+
permutation_iterator: lib/permutation_iterator.h lib/permutation_iterator.c
41+
$(CC) $(CFLAGS) -c lib/permutation_iterator.c -o permutation_iterator.o
42+
4143
day02a: src/day02a.c emulator parser
4244
$(CC) $(CFLAGS) $< -o $@.o emulator.o parser.o
4345

@@ -50,17 +52,11 @@ day05a: src/day05a.c emulator parser
5052
day05b: src/day05b.c emulator parser
5153
$(CC) $(CFLAGS) $< -o $@.o emulator.o parser.o
5254

53-
day07a: src/day07a.c emulator parser
54-
$(CC) $(CFLAGS) $< -o $@.o emulator.o parser.o
55+
day07a: src/day07a.c emulator parser permutation_iterator
56+
$(CC) $(CFLAGS) $< -o $@.o emulator.o parser.o permutation_iterator.o
5557

56-
day07b: src/day07b.c emulator parser
57-
$(CC) $(CFLAGS) $< -o $@.o emulator.o parser.o
58-
59-
day08a: src/day08a.c
60-
$(CC) $(CFLAGS) $< -o $@.o
61-
62-
day08b: src/day08b.c
63-
$(CC) $(CFLAGS) $< -o $@.o
58+
day07b: src/day07b.c emulator parser permutation_iterator
59+
$(CC) $(CFLAGS) $< -o $@.o emulator.o parser.o permutation_iterator.o
6460

6561
day09a: src/day09a.c
6662
$(CC) $(CFLAGS) $< -o $@.o $(LIBM)

lib/permutation_iterator.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Author: Ishan Pranav
2+
// Copyright (c) 2023 Ishan Pranav
3+
// Licensed under the MIT license.
4+
5+
#include "permutation_iterator.h"
6+
7+
static void swap(int* p, int* q)
8+
{
9+
int swap = *p;
10+
11+
*p = *q;
12+
*q = swap;
13+
}
14+
15+
void permutation_begin(int* values, int length, PermutationIterator iterator)
16+
{
17+
iterator->end = false;
18+
iterator->length = length;
19+
iterator->values = values;
20+
}
21+
22+
void permutation_next(PermutationIterator iterator)
23+
{
24+
int last = iterator->length - 1;
25+
26+
while (last > 0 && iterator->values[last - 1] >= iterator->values[last])
27+
{
28+
last--;
29+
}
30+
31+
if (last > 0)
32+
{
33+
int index = iterator->length - 1;
34+
35+
while (index > last &&
36+
iterator->values[index] <= iterator->values[last - 1])
37+
{
38+
index--;
39+
}
40+
41+
swap(iterator->values + last - 1, iterator->values + index);
42+
}
43+
44+
int max = (iterator->length - last) / 2;
45+
46+
for (int index = 0; index < max; index++)
47+
{
48+
swap(
49+
iterator->values + last + index,
50+
iterator->values + iterator->length - 1 - index);
51+
}
52+
53+
iterator->end = !last;
54+
}

lib/permutation_iterator.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Author: Ishan Pranav
2+
// Copyright (c) 2023 Ishan Pranav
3+
// Licensed under the MIT license.
4+
5+
#include <stdbool.h>
6+
7+
struct PermutationIterator
8+
{
9+
int* values;
10+
int length;
11+
bool end;
12+
};
13+
14+
typedef struct PermutationIterator* PermutationIterator;
15+
16+
void permutation_begin(int* values, int length, PermutationIterator iterator);
17+
void permutation_next(PermutationIterator iterator);

src/day05a.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
// Sunny with a Chance of Asteroids Part 1
66

7-
#include <stdlib.h>
87
#include <time.h>
98
#include "../lib/emulator.h"
109
#include "../lib/parser.h"

src/day05b.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
// Sunny with a Chance of Asteroids Part 2
66

7-
#include <stdlib.h>
87
#include <time.h>
98
#include "../lib/emulator.h"
109
#include "../lib/parser.h"

src/day07a.c

Lines changed: 1 addition & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,73 +4,15 @@
44

55
// Amplification Circuit Part 1
66

7-
#include <stdbool.h>
8-
#include <stdlib.h>
97
#include <string.h>
108
#include <time.h>
119
#include "../lib/emulator.h"
1210
#include "../lib/parser.h"
11+
#include "../lib/permutation_iterator.h"
1312
#define INPUTS 2
1413
#define MEMORY 4096
1514
#define OUTPUTS 1
1615

17-
struct PermutationIterator
18-
{
19-
int* values;
20-
int length;
21-
bool end;
22-
};
23-
24-
typedef struct PermutationIterator* PermutationIterator;
25-
26-
static void swap(int* p, int* q)
27-
{
28-
int swap = *p;
29-
30-
*p = *q;
31-
*q = swap;
32-
}
33-
34-
void permutation_begin(int* values, int length, PermutationIterator iter)
35-
{
36-
iter->end = false;
37-
iter->length = length;
38-
iter->values = values;
39-
}
40-
41-
void permutation_next(PermutationIterator iter)
42-
{
43-
int last = iter->length - 1;
44-
45-
while (last > 0 && iter->values[last - 1] >= iter->values[last])
46-
{
47-
last--;
48-
}
49-
50-
if (last > 0)
51-
{
52-
int index = iter->length - 1;
53-
54-
while (index > last && iter->values[index] <= iter->values[last - 1])
55-
{
56-
index--;
57-
}
58-
59-
swap(iter->values + last - 1, iter->values + index);
60-
}
61-
62-
int max = (iter->length - last) / 2;
63-
64-
for (int index = 0; index < max; index++)
65-
{
66-
swap(
67-
iter->values + last + index,
68-
iter->values + iter->length - 1 - index);
69-
}
70-
71-
iter->end = !last;
72-
}
73-
7416
int main()
7517
{
7618
Word max = 0;

src/day07b.c

Lines changed: 1 addition & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@
44

55
// Amplification Circuit Part 2
66

7-
#include <stdbool.h>
8-
#include <stdlib.h>
97
#include <string.h>
108
#include <time.h>
119
#include "../lib/emulator.h"
1210
#include "../lib/parser.h"
11+
#include "../lib/permutation_iterator.h"
1312
#define EMULATOR_QUEUE_CAPACITY 5
1413
#define INPUTS 2
1514
#define MEMORY 4096
@@ -22,63 +21,7 @@ struct EmulatorQueue
2221
int last;
2322
};
2423

25-
struct PermutationIterator
26-
{
27-
int* values;
28-
int length;
29-
bool end;
30-
};
31-
3224
typedef struct EmulatorQueue* EmulatorQueue;
33-
typedef struct PermutationIterator* PermutationIterator;
34-
35-
static void swap(int* p, int* q)
36-
{
37-
int swap = *p;
38-
39-
*p = *q;
40-
*q = swap;
41-
}
42-
43-
void permutation_begin(int* values, int length, PermutationIterator iter)
44-
{
45-
iter->end = false;
46-
iter->length = length;
47-
iter->values = values;
48-
}
49-
50-
void permutation_next(PermutationIterator iter)
51-
{
52-
int last = iter->length - 1;
53-
54-
while (last > 0 && iter->values[last - 1] >= iter->values[last])
55-
{
56-
last--;
57-
}
58-
59-
if (last > 0)
60-
{
61-
int index = iter->length - 1;
62-
63-
while (index > last && iter->values[index] <= iter->values[last - 1])
64-
{
65-
index--;
66-
}
67-
68-
swap(iter->values + last - 1, iter->values + index);
69-
}
70-
71-
int max = (iter->length - last) / 2;
72-
73-
for (int index = 0; index < max; index++)
74-
{
75-
swap(
76-
iter->values + last + index,
77-
iter->values + iter->length - 1 - index);
78-
}
79-
80-
iter->end = !last;
81-
}
8225

8326
void emulator_queue(EmulatorQueue instance)
8427
{

0 commit comments

Comments
 (0)