Advertisement
NaZaRa

Hydra Games

Aug 24th, 2015
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.33 KB | None | 0 0
  1. #include "ggy.h"
  2.  
  3. #define LABEL_OMEGA (-1)
  4.  
  5. struct labelled_hydra {
  6.     int children_count;
  7.     struct labelled_hydra **children;
  8.     struct labelled_hydra *parent;
  9.     int label;
  10.     struct labelled_hydra *aarex;
  11.     int n;
  12. };
  13.  
  14. struct labelled_hydra *duplicate_labelled_hydra(struct labelled_hydra *hydra)
  15. {
  16.     int i;
  17.     struct labelled_hydra *dup = malloc(sizeof(struct labelled_hydra));
  18.  
  19.     dup->children_count = hydra->children_count;
  20.     dup->parent = hydra->parent;
  21.     dup->label = hydra->label;
  22.     dup->aarex = hydra->aarex;
  23.  
  24.     for (i = 0 ; i < dup->children_count ; dup->children[i] = duplicate_labelled_hydra(hydra->children[i]));
  25.  
  26.     return dup;
  27. }
  28.  
  29. void unlink_labelled_hydra(struct labelled_hydra *hydra)
  30. {
  31.     int i, j;
  32.     struct labelled_hydra *parent = hydra->parent;
  33.  
  34.     if (parent->children_count == 1) {
  35.         parent->children_count = 0;
  36.         parent->children = NULL;
  37.     }
  38.     else {
  39.         for (i = 0 ; i < parent->children_count && parent->children[i] != hydra ; i++);
  40.         for (j = i + 1 ; j < parent->children_count ; parent->children[j - 1] = parent->children[i]);
  41.  
  42.         parent->children_count--;
  43.         parent->children[parent->children_count] = NULL;
  44.     }
  45. }
  46.  
  47. struct labelled_hydra *solve_labelled_hydra(struct labelled_hydra *hydra, int n, int only_one_step)
  48. {
  49.     if (hydra->children) {
  50.         return solve_labelled_hydra(hydra->children[hydra->children_count - 1], n + 1, only_one_step);
  51.     }
  52.     if (!hydra->parent) {
  53.         hydra->n = n+1;
  54.         return hydra;
  55.     }
  56.     if (hydra->label == 0) {
  57.         if (hydra->aarex) {
  58.             if (!hydra->aarex->children) {
  59.                 hydra->aarex = NULL;
  60.                 hydra->label = hydra->aarex->n;
  61.             }
  62.             else {
  63.                 hydra->label = LABEL_OMEGA;
  64.                 solve_labelled_hydra(hydra->aarex, n + 1, 1);
  65.             }
  66.         }
  67.         struct labelled_hydra *parent = hydra->parent;
  68.         struct labelled_hydra *pparent = parent->parent;
  69.  
  70.         unlink_labelled_hydra(hydra);
  71.  
  72.         if (pparent == NULL) {
  73.             if (only_one_step) {
  74.                 return hydra->parent;
  75.             }
  76.             return solve_labelled_hydra(parent, n+1, 0);
  77.         }
  78.  
  79.         int i;
  80.         for (i = n ; i ; i--) {
  81.             pparent->children_count++;
  82.             pparent->children[pparent->children_count - 1] = duplicate_labelled_hydra(parent);
  83.         }
  84.  
  85.         if (only_one_step) {
  86.             return hydra->parent;
  87.         }
  88.         return solve_labelled_hydra(pparent, n+1, 0);
  89.     }
  90.     else {
  91.         if (hydra->label == LABEL_OMEGA) {
  92.             hydra->label = n+1;
  93.         }
  94.  
  95.         hydra->label--;
  96.  
  97.         struct labelled_hydra *tmp = hydra->parent;
  98.  
  99.         while (tmp && tmp->label > hydra->label) {
  100.             tmp = tmp->parent;
  101.         }
  102.  
  103.         int tmplabel = tmp->label;
  104.  
  105.         tmp->label = hydra->label;
  106.         hydra->label = 0;
  107.         hydra->parent->children[hydra->parent->children_count - 1] = duplicate_labelled_hydra(tmp);
  108.         tmp->label = tmplabel;
  109.  
  110.         if (only_one_step) {
  111.             return hydra->parent;
  112.         }
  113.  
  114.         return solve_labelled_hydra(hydra->parent, n+1, 0);
  115.     }
  116. }
  117.  
  118. int KirbyParisHydra(int x)
  119. {
  120.     int i;
  121.     struct labelled_hydra *tmp[x];
  122.  
  123.     for (i = 0 ; i < x ; i++) {
  124.         struct labelled_hydra hydra;
  125.  
  126.         hydra.children_count = 1;
  127.         hydra.children = NULL;
  128.         hydra.parent = (i > 0 ? tmp[i - 1] : NULL);
  129.  
  130.         hydra.label = 0;
  131.         hydra.aarex = NULL;
  132.         hydra.n = 0;
  133.  
  134.         tmp[i] = &hydra;
  135.  
  136.         if (i > 0) {
  137. #ifdef NO_MAGIC
  138.             tmp[i - 1]->children = malloc(sizeof(struct labelled_hydra *));
  139. #else // NO_MAGIC
  140.             tmp[i - 1]->children = magic_malloc_2();
  141. #endif // NO_MAGIC
  142.             tmp[i - 1]->children[0] = &hydra;
  143.         }
  144.     }
  145.  
  146.     return solve_labelled_hydra(tmp[0], 1, 0)->n;
  147. }
  148.  
  149. int WeakBuchholzHydra(int x)
  150. {
  151.     int i;
  152.     struct labelled_hydra *tmp[x];
  153.  
  154.     for (i = 0 ; i < x ; i++) {
  155.         struct labelled_hydra hydra;
  156.  
  157.         hydra.children_count = 1;
  158.         hydra.children = NULL;
  159.         hydra.parent = (i > 0 ? tmp[i - 1] : NULL);
  160.  
  161.         if (i <= 1) {
  162.             hydra.label = 0;
  163.         }
  164.         else {
  165.             hydra.label = i;
  166.         }
  167.         hydra.aarex = NULL;
  168.         hydra.n = 0;
  169.  
  170.         tmp[i] = &hydra;
  171.  
  172.         if (i > 0) {
  173. #ifdef NO_MAGIC
  174.             tmp[i - 1]->children = malloc(sizeof(struct labelled_hydra *));
  175. #else // NO_MAGIC
  176.             tmp[i - 1]->children = magic_malloc_2();
  177. #endif // NO_MAGIC
  178.             tmp[i - 1]->children[0] = &hydra;
  179.         }
  180.     }
  181.  
  182.     return solve_labelled_hydra(tmp[0], 1, 0)->n;
  183. }
  184.  
  185. int BuchholzHydra(int x)
  186. {
  187.     int i;
  188.     struct labelled_hydra *tmp[x];
  189.  
  190.     for (i = 0 ; i < x ; i++) {
  191.         struct labelled_hydra hydra;
  192.  
  193.         hydra.children_count = 1;
  194.         hydra.children = NULL;
  195.         hydra.parent = (i > 0 ? tmp[i - 1] : NULL);
  196.  
  197.         if (i <= 1) {
  198.             hydra.label = 0;
  199.         }
  200.         else {
  201.             hydra.label = LABEL_OMEGA;
  202.         }
  203.         hydra.aarex = NULL;
  204.         hydra.n = 0;
  205.  
  206.         tmp[i] = &hydra;
  207.  
  208.         if (i > 0) {
  209. #ifdef NO_MAGIC
  210.             tmp[i - 1]->children = malloc(sizeof(struct labelled_hydra *));
  211. #else // NO_MAGIC
  212.             tmp[i - 1]->children = magic_malloc_2();
  213. #endif // NO_MAGIC
  214.             tmp[i - 1]->children[0] = &hydra;
  215.         }
  216.     }
  217.  
  218.     return solve_labelled_hydra(tmp[0], 1, 0)->n;
  219. }
  220.  
  221. int ModifiedAarexHydra(int x) {
  222.     int i;
  223.     struct labelled_hydra *tmp[x];
  224.  
  225.     for (i = 0 ; i < x ; i++) {
  226.         struct labelled_hydra hydra;
  227.  
  228.         hydra.children_count = 1;
  229.         hydra.children = NULL;
  230.         hydra.parent = (i > 0 ? tmp[i - 1] : NULL);
  231.  
  232.         if (i <= 1) {
  233.             hydra.label = 0;
  234.         }
  235.         else {
  236.             hydra.label = LABEL_OMEGA;
  237.             hydra.aarex = duplicate_labelled_hydra(tmp[0]);
  238.         }
  239.  
  240.         hydra.n = 0;
  241.  
  242.         tmp[i] = &hydra;
  243.  
  244.         if (i > 0) {
  245. #ifdef NO_MAGIC
  246.             tmp[i - 1]->children = malloc(sizeof(struct labelled_hydra *));
  247. #else // NO_MAGIC
  248.             tmp[i - 1]->children = magic_malloc_2();
  249. #endif // NO_MAGIC
  250.             tmp[i - 1]->children[0] = &hydra;
  251.         }
  252.     }
  253.     return solve_labelled_hydra(tmp[0], 1, 0)->n;
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement