Intersecting number wheels: Difference between revisions

Line 141:
 
</pre>
 
=={{header|C}}==
<lang c>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct Wheel {
char *seq;
int len;
int pos;
};
 
struct Wheel *create(char *seq) {
struct Wheel *w = malloc(sizeof(struct Wheel));
if (w == NULL) {
return NULL;
}
 
w->seq = seq;
w->len = strlen(seq);
w->pos = 0;
 
return w;
}
 
char cycle(struct Wheel *w) {
char c = w->seq[w->pos];
w->pos = (w->pos + 1) % w->len;
return c;
}
 
struct Map {
struct Wheel *v;
struct Map *next;
char k;
};
 
struct Map *insert(char k, struct Wheel *v, struct Map *head) {
struct Map *m = malloc(sizeof(struct Map));
if (m == NULL) {
return NULL;
}
 
m->k = k;
m->v = v;
m->next = head;
 
return m;
}
 
struct Wheel *find(char k, struct Map *m) {
struct Map *ptr = m;
 
while (ptr != NULL) {
if (ptr->k == k) {
return ptr->v;
}
ptr = ptr->next;
}
 
return NULL;
}
 
void printOne(char k, struct Map *m) {
struct Wheel *w = find(k, m);
char c;
 
if (w == NULL) {
printf("Missing the wheel for: %c\n", k);
exit(1);
}
 
c = cycle(w);
if ('0' <= c && c <= '9') {
printf(" %c", c);
} else {
printOne(c, m);
}
}
 
void exec(char start, struct Map *m) {
struct Wheel *w;
int i;
 
if (m == NULL) {
printf("Unable to proceed.");
return;
}
 
for (i = 0; i < 20; i++) {
printOne(start, m);
}
printf("\n");
}
 
void group1() {
struct Wheel *a = create("123");
 
struct Map *m = insert('A', a, NULL);
 
exec('A', m);
}
 
void group2() {
struct Wheel *a = create("1B2");
struct Wheel *b = create("34");
 
struct Map *m = insert('A', a, NULL);
m = insert('B', b, m);
 
exec('A', m);
}
 
void group3() {
struct Wheel *a = create("1DD");
struct Wheel *d = create("678");
 
struct Map *m = insert('A', a, NULL);
m = insert('D', d, m);
 
exec('A', m);
}
 
void group4() {
struct Wheel *a = create("1BC");
struct Wheel *b = create("34");
struct Wheel *c = create("5B");
 
struct Map *m = insert('A', a, NULL);
m = insert('B', b, m);
m = insert('C', c, m);
 
exec('A', m);
}
 
int main() {
group1();
group2();
group3();
group4();
 
return 0;
}</lang>
{{out}}
<pre> 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2
1 3 2 1 4 2 1 3 2 1 4 2 1 3 2 1 4 2 1 3
1 6 7 1 8 6 1 7 8 1 6 7 1 8 6 1 7 8 1 6
1 3 5 1 4 3 1 4 5 1 3 4 1 3 5 1 4 3 1 4</pre>
 
=={{header|C++}}==
1,452

edits