Facebook
From triedel, 1 Month ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 157
  1. t_cmdseq *cmdseq_optimize(t_state *state, t_cmdseq *seq)
  2. {
  3.  t_state  *s;
  4.  t_cmdseq *oseq;
  5.  int   ra = 0;
  6.  int   rb = 0;
  7.  int   pb = 0;
  8.  bool  sa = false;
  9.  bool  sb = false;
  10.  bool  is_rotation;
  11.  bool  is_swap;
  12.  bool  is_push;
  13.  
  14.  s = state_dup(state);
  15.  oseq = cmdseq_new();
  16.  // state_print(s);
  17.  
  18.  t_cmd cmd = cmdseq_next(seq);
  19.  // seq = NULL;
  20.  while (1)
  21.  {
  22.   is_rotation = (cmd == RA || cmd == RB || cmd == RR || cmd == RRA || cmd == RRB || cmd == RRR);
  23.   is_swap = (cmd == SA || cmd == SB || cmd == SS);
  24.   is_push = (cmd == PA || cmd == PB);
  25.  
  26.   // flush rotations
  27.   if (!is_rotation)
  28.   {
  29.    // rotate shorter way
  30.    if (s->a->top) {
  31.     ra %= s->a->top;
  32.     ra = (ra + s->a->top) % s->a->top;
  33.    }
  34.    if (s->b->top) {
  35.     rb %= s->b->top;
  36.     rb = (rb + s->b->top) % s->b->top;
  37.    }
  38.    if (ra > s->a->top / 2)
  39.     ra -= s->a->top;
  40.    if (rb > s->b->top / 2)
  41.     rb -= s->b->top;
  42.    // flush rotations
  43.    while (ra > 0 && rb > 0)
  44.    {
  45.     state_do(s, oseq, RR);
  46.     ra--;
  47.     rb--;
  48.    }
  49.    while (ra < 0 && rb < 0)
  50.    {
  51.     state_do(s, oseq, RRR);
  52.     ra++;
  53.     rb++;
  54.    }
  55.    while (ra)
  56.    {
  57.     if (ra > 0) {
  58.      state_do(s, oseq, RA);
  59.      ra--;
  60.     } else {
  61.      state_do(s, oseq, RRA);
  62.      ra++;
  63.     }
  64.    }
  65.    while (rb)
  66.    {
  67.     if (rb > 0) {
  68.      state_do(s, oseq, RB);
  69.      rb--;
  70.     } else {
  71.      state_do(s, oseq, RRB);
  72.      rb++;
  73.     }
  74.    }
  75.   }
  76.   // flush pushes
  77.   if (!is_push)
  78.   {
  79.    while (pb > 0) {
  80.     state_do(s, oseq, PB);
  81.     pb--;
  82.    }
  83.    while (pb < 0) {
  84.     state_do(s, oseq, PA);
  85.     pb++;
  86.    }
  87.   }
  88.   // flush swaps
  89.   if (!is_swap)
  90.   {
  91.    if (sa && sb)
  92.     state_do(s, oseq, SS);
  93.    else if (sa)
  94.     state_do(s, oseq, SA);
  95.    else if (sb)
  96.     state_do(s, oseq, SB);
  97.    sa = sb = false;
  98.   }
  99.  
  100.   // =======================
  101.   // rotations
  102.   if (cmd == RA)
  103.    ra++;
  104.   else if (cmd == RB)
  105.    rb++;
  106.   else if (cmd == RR) {
  107.    ra++; rb++;
  108.   } else if (cmd == RRA)
  109.    ra--;
  110.   else if (cmd == RRB)
  111.    rb--;
  112.   else if (cmd == RRR) {
  113.    ra--; rb--;
  114.   // pushes
  115.   } else if (cmd == PA)
  116.    pb--;
  117.   else if (cmd == PB)
  118.    pb++;
  119.   // swaps
  120.   else if (cmd == SA)
  121.    sa = !sa;
  122.   else if (cmd == SB)
  123.    sb = !sb;
  124.   else if (cmd == SS) {
  125.    sa = !sa;
  126.    sb = !sb;
  127.   }
  128.  
  129.   if (cmd == CMD_NONE)
  130.    break ;
  131.   cmd = cmdseq_next(NULL);
  132.  }
  133.  state_del(s);
  134.  return (oseq);
  135. }