Advertisement
sarumeister

AoC-2022 Day 5a -- fast memory arena

Dec 5th, 2022 (edited)
563
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.42 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. const char* input = R"(    [D]    
  4. [N] [C]    
  5. [Z] [M] [P]
  6. 1   2   3
  7.  
  8. move 1 from 2 to 1
  9. move 3 from 1 to 3
  10. move 2 from 2 to 1
  11. move 1 from 1 to 2
  12. )";
  13.  
  14.  
  15. struct Node
  16. {
  17.     char payload;
  18.     Node *prev;
  19.     Node *next;
  20. };
  21.  
  22. #define ARENA_SIZE 1000
  23. Node arena[ARENA_SIZE] = { 0 };
  24. int arenaPointer = ARENA_SIZE - 1;
  25.  
  26.  
  27. int main()
  28. {
  29.     int currPile = 0;
  30.     int maxPile = 0;
  31.     int i = 0;
  32.     while (input[i])
  33.     {
  34.         char a = input[i];
  35.         i += (0 != a);
  36.         char b = input[i];
  37.         i += (0 != b);
  38.         char c = input[i];
  39.         i += (0 != c);
  40.         char d = input[i];
  41.         i += (0 != d);
  42.  
  43.         if ('1' == b)
  44.             break;
  45.  
  46.         if ('[' == a)
  47.         {
  48.             // find head
  49.             Node* head = &arena[currPile];
  50.             if (nullptr == arena[currPile].next)
  51.             {
  52.                 arena[currPile].next = head;
  53.                 arena[currPile].prev = head;
  54.             }
  55.  
  56.             // we will insert right after head
  57.             Node* before = head;
  58.             Node* after = head->next;
  59.  
  60.             // malloc arena item
  61.             Node* item = &arena[arenaPointer--];
  62.             if(arenaPointer <= 1)
  63.                 return -1; // out of memory
  64.             item->payload = b;
  65.  
  66.             item->prev = before;
  67.             item->next = after;
  68.             before->next = item;
  69.             after->prev = item;
  70.         }
  71.  
  72.         if (' ' == d)
  73.             currPile++;
  74.         if ('\n' == d)
  75.         {
  76.             maxPile = currPile;
  77.             currPile = 0;
  78.         }
  79.     }
  80.  
  81.     if(arenaPointer <= maxPile)
  82.         return -1; // out of memory, heads intersected with items
  83.  
  84.  
  85.     // Skip two lines
  86.     while (input[i] && ('\n' != input[i]))
  87.     {
  88.         i++;
  89.     }
  90.     while (input[i] && ('\n' == input[i]))
  91.     {
  92.         i++;
  93.     }
  94.  
  95.     // execute commands
  96.     while (input[i])
  97.     {
  98.         int valCount = 0;
  99.         int valFrom = 0;
  100.         int valTo = 0;
  101.  
  102.  
  103.         while (input[i] && ' ' != input[i])
  104.             i++;
  105.         i++;
  106.         while (input[i] && ' ' != input[i])
  107.         {
  108.             valCount = valCount * 10 + input[i] - '0';
  109.             i++;
  110.         }
  111.         i++;
  112.  
  113.         while (input[i] && ' ' != input[i])
  114.             i++;
  115.         i++;
  116.  
  117.         while (input[i] && ' ' != input[i])
  118.         {
  119.             valFrom = valFrom * 10 + input[i] - '0';
  120.             i++;
  121.         }
  122.         i++;
  123.  
  124.         while (input[i] && ' ' != input[i])
  125.             i++;
  126.         i++;
  127.  
  128.         while (input[i] && '\n' != input[i])
  129.         {
  130.             valTo = valTo * 10 + input[i] - '0';
  131.             i++;
  132.         }
  133.         i++;
  134.  
  135.         for (int k = 0; k < valCount; k++)
  136.         {
  137.             Node* item = arena[valFrom - 1].prev;
  138.             Node* before = item->prev;
  139.             Node* after = item->next;
  140.             before->next = after;
  141.             after->prev = before;
  142.  
  143.             Node* newBefore = arena[valTo - 1].prev;
  144.             Node* newAfter = newBefore->next;
  145.             item->prev = newBefore;
  146.             item->next = newAfter;
  147.             newBefore->next = item;
  148.             newAfter->prev = item;
  149.         }
  150.     }
  151.  
  152.     // print result
  153.     int k = 0;
  154.     while(arena[k].prev)
  155.     {
  156.         Node* last = arena[k].prev;
  157.         if (last->payload)
  158.             putc(last->payload, stdout);
  159.         k++;
  160.     }
  161.  
  162.     puts("\n");
  163.     return 0;
  164. }
  165.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement