Yellowstone sequence: Difference between revisions
Content added Content deleted
Line 37: | Line 37: | ||
:* Applegate et al, 2015: The Yellowstone Permutation [https://arxiv.org/abs/1501.01669]. |
:* Applegate et al, 2015: The Yellowstone Permutation [https://arxiv.org/abs/1501.01669]. |
||
<br><br> |
<br><br> |
||
=={{header|C}}== |
|||
{{trans|Ruby}} |
|||
<lang c>#include <stdbool.h> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
typedef struct lnode_t { |
|||
struct lnode_t *prev; |
|||
struct lnode_t *next; |
|||
int v; |
|||
} Lnode; |
|||
Lnode *make_list_node(int v) { |
|||
Lnode *node = malloc(sizeof(Lnode)); |
|||
if (node == NULL) { |
|||
return NULL; |
|||
} |
|||
node->v = v; |
|||
node->prev = NULL; |
|||
node->next = NULL; |
|||
return node; |
|||
} |
|||
void free_lnode(Lnode *node) { |
|||
if (node == NULL) { |
|||
return; |
|||
} |
|||
node->v = 0; |
|||
node->prev = NULL; |
|||
free_lnode(node->next); |
|||
node->next = NULL; |
|||
} |
|||
typedef struct list_t { |
|||
Lnode *front; |
|||
Lnode *back; |
|||
size_t len; |
|||
} List; |
|||
List *make_list() { |
|||
List *list = malloc(sizeof(List)); |
|||
if (list == NULL) { |
|||
return NULL; |
|||
} |
|||
list->front = NULL; |
|||
list->back = NULL; |
|||
list->len = 0; |
|||
return list; |
|||
} |
|||
void free_list(List *list) { |
|||
if (list == NULL) { |
|||
return; |
|||
} |
|||
list->len = 0; |
|||
list->back = NULL; |
|||
free_lnode(list->front); |
|||
list->front = NULL; |
|||
} |
|||
void list_insert(List *list, int v) { |
|||
Lnode *node; |
|||
if (list == NULL) { |
|||
return; |
|||
} |
|||
node = make_list_node(v); |
|||
if (list->front == NULL) { |
|||
list->front = node; |
|||
list->back = node; |
|||
list->len = 1; |
|||
} else { |
|||
node->prev = list->back; |
|||
list->back->next = node; |
|||
list->back = node; |
|||
list->len++; |
|||
} |
|||
} |
|||
void list_print(List *list) { |
|||
Lnode *it; |
|||
if (list == NULL) { |
|||
return; |
|||
} |
|||
for (it = list->front; it != NULL; it = it->next) { |
|||
printf("%d ", it->v); |
|||
} |
|||
} |
|||
int list_get(List *list, int idx) { |
|||
Lnode *it = NULL; |
|||
if (list != NULL && list->front != NULL) { |
|||
int i; |
|||
if (idx < 0) { |
|||
it = list->back; |
|||
i = -1; |
|||
while (it != NULL && i > idx) { |
|||
it = it->prev; |
|||
i--; |
|||
} |
|||
} else { |
|||
it = list->front; |
|||
i = 0; |
|||
while (it != NULL && i < idx) { |
|||
it = it->next; |
|||
i++; |
|||
} |
|||
} |
|||
} |
|||
if (it == NULL) { |
|||
return INT_MIN; |
|||
} |
|||
return it->v; |
|||
} |
|||
/////////////////////////////////////// |
|||
typedef struct mnode_t { |
|||
int k; |
|||
bool v; |
|||
struct mnode_t *next; |
|||
} Mnode; |
|||
Mnode *make_map_node(int k, bool v) { |
|||
Mnode *node = malloc(sizeof(Mnode)); |
|||
if (node == NULL) { |
|||
return node; |
|||
} |
|||
node->k = k; |
|||
node->v = v; |
|||
node->next = NULL; |
|||
return node; |
|||
} |
|||
void free_mnode(Mnode *node) { |
|||
if (node == NULL) { |
|||
return; |
|||
} |
|||
node->k = 0; |
|||
node->v = false; |
|||
free_mnode(node->next); |
|||
node->next = NULL; |
|||
} |
|||
typedef struct map_t { |
|||
Mnode *front; |
|||
} Map; |
|||
Map *make_map() { |
|||
Map *map = malloc(sizeof(Map)); |
|||
if (map == NULL) { |
|||
return NULL; |
|||
} |
|||
map->front = NULL; |
|||
return map; |
|||
} |
|||
void free_map(Map *map) { |
|||
if (map == NULL) { |
|||
return; |
|||
} |
|||
free_mnode(map->front); |
|||
map->front = NULL; |
|||
} |
|||
void map_insert(Map *map, int k, bool v) { |
|||
if (map == NULL) { |
|||
return; |
|||
} |
|||
if (map->front == NULL) { |
|||
map->front = make_map_node(k, v); |
|||
} else { |
|||
Mnode *it = map->front; |
|||
while (it->next != NULL) { |
|||
it = it->next; |
|||
} |
|||
it->next = make_map_node(k, v); |
|||
} |
|||
} |
|||
bool map_get(Map *map, int k) { |
|||
if (map != NULL) { |
|||
Mnode *it = map->front; |
|||
while (it != NULL && it->k != k) { |
|||
it = it->next; |
|||
} |
|||
if (it != NULL) { |
|||
return it->v; |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
/////////////////////////////////////// |
|||
int gcd(int u, int v) { |
|||
if (u < 0) u = -u; |
|||
if (v < 0) v = -v; |
|||
if (v) { |
|||
while ((u %= v) && (v %= u)); |
|||
} |
|||
return u + v; |
|||
} |
|||
List *yellow(size_t n) { |
|||
List *a; |
|||
Map *b; |
|||
int i; |
|||
a = make_list(); |
|||
list_insert(a, 1); |
|||
list_insert(a, 2); |
|||
list_insert(a, 3); |
|||
b = make_map(); |
|||
map_insert(b, 1, true); |
|||
map_insert(b, 2, true); |
|||
map_insert(b, 3, true); |
|||
i = 4; |
|||
while (n > a->len) { |
|||
if (!map_get(b, i) && gcd(i, list_get(a, -1)) == 1 && gcd(i, list_get(a, -2)) > 1) { |
|||
list_insert(a, i); |
|||
map_insert(b, i, true); |
|||
i = 4; |
|||
} |
|||
i++; |
|||
} |
|||
free_map(b); |
|||
return a; |
|||
} |
|||
int main() { |
|||
List *a = yellow(30); |
|||
list_print(a); |
|||
free_list(a); |
|||
putc('\n', stdout); |
|||
return 0; |
|||
}</lang> |
|||
{{out}} |
|||
<pre>1 2 3 4 9 8 15 14 5 6 25 12 35 16 7 10 21 20 27 22 39 11 13 33 26 45 28 51 32 17</pre> |
|||
=={{header|C++}}== |
=={{header|C++}}== |