void	morc_tri_r(t_all *res, int debut, int fin, int base)
{
	int	i;
	int	ind;

	i = debut;
	ind = 0;
	while (i++ <= fin)
		if (res->a->pile[res->a->len - 1] < base)
			push_b(res);
		else
		{
			if (res->a->pile[res->a->len - 1] == base)
			{
				push_b(res);
				rotate_b(res);
			}
			else
			{
				rotate_a(res);
				ind++;
			}
		}
	if ((fin - debut) != (res->a->len + res->b->len - 1))
		while (ind-- > 0)
			reverse_rotate_a(res);
	reverse_rotate_b(res);
}
int dfs(long a,long b,char ch)
{
	t1=t2=0;
	long c,d,k;
	push_a(0);
	push_b(0);
	push_a(a+1);
	push_b(b+1);
	vis[a][b]=fill;
	while(a=pop_a())
	{
		b=pop_b();
		a--;b--;
		c=a;d=b;
		for(k=0;k<6;k++)
		{
			 c=a+x[k];
			  d=b+y[k];
			if(c>=0&&c<n&&d>=0&&d<n&&!vis[c][d]&&grid[c][d]==ch)
			{
		    	push_a(c+1);
				push_b(d+1);
			    vis[c][d]=fill;
				if(fu==1&&d==n-1)
					return 1;
				else if(fu==2&&c==n-1)
					return 1;

			}
		}
	}
	return 0;
}
long dfs(long a,long b,char im)
{
	long c,d,k,count=0;
	push_a(0);
	push_b(0);
	push_a(a+1);
	push_b(b+1);
	vis[a][b]=1;
	while(a=pop_a())
	{
		count++;
		b=pop_b();
		a--;b--;
		c=a;d=b;
		for(k=0;k<8;k++)
		{
			 c=a+x[k];
			  d=b+y[k];
			if(c>=0&&c<m&&d>=0&&d<n&&!vis[c][d]&&grid[c][d]==im)
			{
		    	push_a(c+1);
				push_b(d+1);
			    vis[c][d]=1;
			  
			}
			 
			  
		}
	}
	return count;
}
Exemple #4
0
t_list_i	*push_swap(t_list_i *list)
{
	t_list_i	*pile_b;
	t_list_i	*last_item;

	pile_b = NULL;
	last_item = NULL;
	while ((test_sort_croissant(list) == 0) || pile_b)
	{
		last_item = can_we_rotate(list);
		if (last_item && list->next && list->next->next)
			list = rotate_a(list);
		if (list->c < list->next->c)
			list = swap_a(list);
		if (list->c > list->next->c && (test_sort_croissant(list) == 0)
			&& list->next && list->next->next != NULL)
			pile_b = push_b(&list, pile_b);
		if (pile_b && pile_b->next && pile_b->c > pile_b->next->c)
			pile_b = swap_b(pile_b);
		if (pile_b && pile_b->next && test_sort_decroissant(pile_b) &&
			test_sort_croissant(list))
			list = push_a(list, &pile_b);
		if (test_sort_croissant(list) && pile_b && pile_b->next == NULL)
			list = push_a(list, &pile_b);
	}
	return (list);
}
Exemple #5
0
void				tri_basic(t_content *axx)
{
	TMP_A(4) = LIST_A(3);
	LIST_I(NB_LIST + 4, 0);
	norm(axx);
	while (check_list(axx, 0) != 0)
	{
		TMP_A(3) = LIST_A(0);
		LIST_I(NB_LIST + 3, 1);
		TMP_A(8) = LIST_A(0);
		LIST_I(NB_LIST + 8, 0);
		LIST_I(NB_LIST + 8, 0);
		if (VALUE_IN(0, 0) < VALUE_IN(0, 1))
		{
			op(axx, 5);
		}
		else if (TMP_IN(3, 1) < VALUE_IN(0, 1))
		{
			op(axx, 0);
		}
		else
		{
			push_b(axx, pos_x(axx, TMP_I(4, 0)));
			LIST_I(NB_LIST + 4, 0);
		}
	}
}
Exemple #6
0
static void			order_a(t_push **lista, t_push **listb, t_action **actions)
{
	while (!checkorder(*lista))
	{
		if (get_last(*lista) > get_before_last(*lista))
			swap_a(lista, listb, actions);
		else
			push_b(lista, listb, actions);
		order_b(lista, listb, actions);
	}
}
void	decroissant(t_all *i)
{
	while (i->a->len > 2)
	{
		push_b(i);
		if (i->b->len > 1)
			rotate_b(i);
	}
	swap_a(i);
	while (i->b->len > 0)
		push_a(i);
}
Exemple #8
0
void			basic_sort(t_box *box)
{
	while (box->size_a != 0)
	{
		box->locat = little_number(A, box->size_a, &box->val_min);
		if (A[0] > A[1] && A[1] < A[2])
			swap_a(box);
		if (check_sort(A, box->size_a))
			break ;
		if (box->locat < (box->size / 2))
			while (A[0] != box->val_min)
				rot_a(box);
		else
			while (A[0] != box->val_min)
				revrot_a(box);
		push_b(box);
	}
	while (box->size_b != 0)
		push_a(box);
}
Exemple #9
0
void			sort_pile(t_pushswap *data)
{
	while (42)
	{
		first_pile_check(data);
		put_smallest_last(data);
		if (check_pile(data->pile_a, data->length_a))
		{
			if (data->length_b == 0)
				break ;
			else if (data->length_b == 1)
				push_a(data, 1);
			else
			{
				while (data->length_b > 0)
					push_a(data, 0);
			}
		}
		else
			push_b(data, 0);
	}
}
Exemple #10
0
long vm_execute(VMContext ctx, ScriptCInstruction inst) {
  static const void *table[] = {
#define DEFINE_TABLE(NAME) &&OP_##NAME,
    IR_EACH(DEFINE_TABLE)
#undef DEFINE_TABLE
  };

  if(inst == NULL) {
    return (long)table;
  }

  register ScriptCInstruction pc = inst+1;

  goto *GET_ADDR(pc);

  OP(exit) {
    return 0;
  }
  OP(call) {
    ctx = createVMContext(ctx, pc-inst+1);
    JUMP(inst + pc->call_point);
  }
  OP(ret) {
    long retPoint = ctx->retPoint;
    Type top = pop_sp(ctx);
    VMContext next = call_back(ctx);
    if(top->type == TYPE_INT) {
      push_i(next, top->int_val);
    } else if(top->type == TYPE_FLOAT) {
      push_d(next, top->double_val);
    } else if(top->type == TYPE_STRING) {
      push_s(next, top->string);
    } else if(top->type == TYPE_BOOL) {
      push_b(next, top->bool_val);
    } else {
      fprintf(stderr, "type error of return statement\n");
      return 1;
    }
    disposeVMContext(ctx);
    ctx = next;
    JUMP(inst + retPoint);
  }
  OP(ret_void) {
    long retPoint = ctx->retPoint;
    VMContext next = call_back(ctx);
    disposeVMContext(ctx);
    ctx = next;
    JUMP(inst + retPoint);
  }
  OP(iconst) {
    push_i(ctx, pc->int_val);
    DISPATCH_NEXT;
  }
  OP(dconst) {
    push_d(ctx, pc->double_val);
    DISPATCH_NEXT;
  }
  OP(sconst) {
    push_s(ctx, pc->string);
    DISPATCH_NEXT;
  }
  OP(bconst) {
    push_b(ctx, pc->bool_val);
    DISPATCH_NEXT;
  }
  OP(jump) {
    JUMP(inst + pc->jump);
  }
  OP(ifcmp) {
    Type top = pop_sp(ctx);
    if(top->type != TYPE_BOOL) {
      fprintf(stderr, "type error of ifcmp\n");
    }
    if(!top->bool_val) {
      JUMP(inst + pc->jump);
    }
    DISPATCH_NEXT;
  }
  OP(gt) {
    Type right = pop_sp(ctx);
    Type left = pop_sp(ctx);
    if(right->type == TYPE_INT && left->type == TYPE_INT) {
      push_b(ctx, left->int_val > right->int_val);
    } else if(right->type == TYPE_FLOAT && left->type == TYPE_FLOAT) {
      push_b(ctx, left->double_val > right->double_val);
    } else {
      fprintf(stderr, "type error of gt expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(ge) {
    Type right = pop_sp(ctx);
    Type left = pop_sp(ctx);
    if(right->type == TYPE_INT && left->type == TYPE_INT) {
      push_b(ctx, left->int_val >= right->int_val);
    } else if(right->type == TYPE_FLOAT && left->type == TYPE_FLOAT) {
      push_b(ctx, left->double_val >= right->double_val);
    } else {
      fprintf(stderr, "type error of ge expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(lt) {
    Type right = pop_sp(ctx);
    Type left = pop_sp(ctx);
    if(right->type == TYPE_INT && left->type == TYPE_INT) {
      push_b(ctx, left->int_val < right->int_val);
    } else if(right->type == TYPE_FLOAT && left->type == TYPE_FLOAT) {
      push_b(ctx, left->double_val < right->double_val);
    } else {
      fprintf(stderr, "type error of lt expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(le) {
    Type right = pop_sp(ctx);
    Type left = pop_sp(ctx);
    if(right->type == TYPE_INT && left->type == TYPE_INT) {
      push_b(ctx, left->int_val <= right->int_val);
    } else if(right->type == TYPE_FLOAT && left->type == TYPE_FLOAT) {
      push_b(ctx, left->double_val <= right->double_val);
    } else {
      fprintf(stderr, "type error of le expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(eq) {
    Type right = pop_sp(ctx);
    Type left = pop_sp(ctx);
    if(right->type == TYPE_INT && left->type == TYPE_INT) {
      push_b(ctx, left->int_val == right->int_val);
    } else if(right->type == TYPE_FLOAT && left->type == TYPE_FLOAT) {
      push_b(ctx, left->double_val == right->double_val);
    } else if(right->type == TYPE_STRING && left->type == TYPE_STRING) {
      push_b(ctx, !strcmp(left->string, right->string));
    } else if(right->type == TYPE_BOOL && left->type == TYPE_BOOL) {
      push_b(ctx, left->bool_val == right->bool_val);
    } else {
      fprintf(stderr, "type error of le expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(ne) {
    Type right = pop_sp(ctx);
    Type left = pop_sp(ctx);
    if(right->type == TYPE_INT && left->type == TYPE_INT) {
      push_b(ctx, left->int_val != right->int_val);
    } else if(right->type == TYPE_FLOAT && left->type == TYPE_FLOAT) {
      push_b(ctx, left->double_val != right->double_val);
    } else if(right->type == TYPE_STRING && left->type == TYPE_STRING) {
      push_b(ctx, strcmp(left->string, right->string));
    } else if(right->type == TYPE_BOOL && left->type == TYPE_BOOL) {
      push_b(ctx, left->bool_val != right->bool_val);
    } else {
      fprintf(stderr, "type error of le expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(add) {
    Type right = pop_sp(ctx);
    Type left = pop_sp(ctx);
    if(right->type == TYPE_INT && left->type == TYPE_INT) {
      push_i(ctx, left->int_val + right->int_val);
    } else if(right->type == TYPE_FLOAT && left->type == TYPE_FLOAT) {
      push_d(ctx, left->double_val + right->double_val);
    } else if(right->type == TYPE_STRING && left->type == TYPE_STRING) {
      strcat(left->string, right->string);
      push_s(ctx, left->string);
    } else {
      fprintf(stderr, "type error of add expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(sub) {
    Type right = pop_sp(ctx);
    Type left = pop_sp(ctx);
    if(right->type == TYPE_INT && left->type == TYPE_INT) {
      push_i(ctx, left->int_val - right->int_val);
    } else if(right->type == TYPE_FLOAT && left->type == TYPE_FLOAT) {
      push_d(ctx, left->double_val - right->double_val);
    } else {
      fprintf(stderr, "type error of sub expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(mul) {
    Type right = pop_sp(ctx);
    Type left = pop_sp(ctx);
    if(right->type == TYPE_INT && left->type == TYPE_INT) {
      push_i(ctx, left->int_val * right->int_val);
    } else if(right->type == TYPE_FLOAT && left->type == TYPE_FLOAT) {
      push_d(ctx, left->double_val * right->double_val);
    } else {
      fprintf(stderr, "type error of mul expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(div) {
    Type right = pop_sp(ctx);
    Type left = pop_sp(ctx);
    if(right->type == TYPE_INT && left->type == TYPE_INT) {
      push_i(ctx, left->int_val / right->int_val);
    } else if(right->type == TYPE_FLOAT && left->type == TYPE_FLOAT) {
      push_d(ctx, left->double_val / right->double_val);
    } else {
      fprintf(stderr, "type error of div expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(minus) {
    Type left = pop_sp(ctx);
    if(left->type == TYPE_INT) {
      push_i(ctx, -left->int_val);
    } else if(left->type == TYPE_FLOAT) {
      push_d(ctx, -left->double_val);
    } else {
      fprintf(stderr, "type error of add expression\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(loadl) {
    Type val = ctx->var_list+pc->var_id;
    if(val->type == TYPE_INT) {
      push_i(ctx, val->int_val);
    } else if(val->type == TYPE_FLOAT) {
      push_d(ctx, val->double_val);
    } else if(val->type == TYPE_STRING) {
      push_s(ctx, val->string);
    } else if(val->type == TYPE_BOOL) {
      push_b(ctx, val->bool_val);
    } else {
      fprintf(stderr, "type error of loadl\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(storea) {
    Type val = ctx->var_list+pc->var_id;
    Type top = pop_sp(ctx->prev);
    if(top->type == TYPE_INT) {
      val->int_val = top->int_val;
    } else if(top->type == TYPE_FLOAT) {
      val->double_val = top->double_val;
    } else if(top->type == TYPE_STRING) {
      val->string = top->string;
    } else if(top->type == TYPE_BOOL) {
      val->bool_val = top->bool_val;
    } else {
      fprintf(stderr, "type error of storel\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(storel) {
    Type val = ctx->var_list+pc->var_id;
    Type top = pop_sp(ctx);
    if(top->type == TYPE_INT) {
      val->int_val = top->int_val;
      val->type = TYPE_INT;
    } else if(top->type == TYPE_FLOAT) {
      val->double_val = top->double_val;
      val->type = TYPE_FLOAT;
    } else if(top->type == TYPE_STRING) {
      val->string = top->string;
      val->type = TYPE_STRING;
    } else if(top->type == TYPE_BOOL) {
      val->bool_val = top->bool_val;
      val->type = TYPE_BOOL;
    } else {
      fprintf(stderr, "type error of storel\n");
      return 1;
    }
    DISPATCH_NEXT;
  }
  OP(write) {
    Type val = pop_sp(ctx);
    if(val->type == TYPE_INT) {
      printf("%d\n", val->int_val);
    } else if(val->type == TYPE_FLOAT) {
      printf("%f\n", val->double_val);
    } else if(val->type == TYPE_STRING) {
      printf("%s\n", val->string);
    } else if(val->type == TYPE_BOOL) {
      if(val->bool_val) {
        printf("true\n");
      } else {
        printf("false\n");
      }
    }
    DISPATCH_NEXT;
  }

  return 0;
}