diff --git a/srcs/checker.c b/srcs/checker.c index 2241f36..fa138b6 100644 --- a/srcs/checker.c +++ b/srcs/checker.c @@ -6,12 +6,38 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/23 13:35:15 by tmaze #+# #+# */ -/* Updated: 2019/03/09 14:57:41 by tmaze ### ########.fr */ +/* Updated: 2019/03/09 22:44:29 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" +#define VISU_SPEED 1000000 + +void debug(t_psdata *data, char *com) +{ + t_stack *as; + t_stack *bs; + + as = data->a; + bs = data->b; + ft_printf(FT_CLEAR); + ft_printf("============== %4s ==============\n", com); + while (as || bs) + { + if (as && bs) + ft_printf("%5d %4d|| %5d %4d\n", as->nb, as->ind, bs->nb, bs->ind); + else if (!as && bs) + ft_printf("%5c %4c|| %5d %4d\n", ' ', ' ', bs->nb, bs->ind); + else if (as && !bs) + ft_printf("%5d %4d|| %5c %c\n", as->nb, as->ind, ' ', ' '); + as = (as) ? as->next : as; + bs = (bs) ? bs->next : bs; + } + ft_printf("==================================\n"); + usleep(VISU_SPEED); +} + void exec_actions(t_psdata *data) { char *buff; @@ -37,6 +63,7 @@ void exec_actions(t_psdata *data) ps_rerot(data, buff[2]); else if (buff[2] == 'r') ps_rrerot(data); + debug(data, buff); nop = nop->next; } } diff --git a/srcs/push_swap.c b/srcs/push_swap.c index 18f4ac0..0d4bd11 100644 --- a/srcs/push_swap.c +++ b/srcs/push_swap.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/03 11:41:49 by tmaze #+# #+# */ -/* Updated: 2019/03/09 17:44:01 by tmaze ### ########.fr */ +/* Updated: 2019/03/09 23:12:23 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -79,10 +79,9 @@ void sortfor5(t_psdata *data) ft_printf("pb\n"); ps_push(data, 'b'); if (data->b->nb > data->b->next->nb) - { ft_printf("sb\n"); + if (data->b->nb > data->b->next->nb) ps_swap(data, 'b'); - } sortfor3(data); data->b->ind = 1; data->b->next->ind = 1; @@ -91,18 +90,68 @@ void sortfor5(t_psdata *data) data->a->next->next->ind = 2; while (data->a->ind == 2 || data->size_b > 0) { - if (data->a->ind != 2 || (data->size_b > 0 && data->b->nb < data->a->nb)) - { + if (data->a->ind != 2 + || (data->size_b > 0 && data->b->nb < data->a->nb)) ft_printf("pa\n"); + if (data->a->ind != 2 + || (data->size_b > 0 && data->b->nb < data->a->nb)) ps_push(data, 'a'); - } data->a->ind = 3; ft_printf("ra\n"); ps_rot(data, 'a'); } } +t_stack *get_last_a(t_psdata *data) +{ + t_stack *ptr; + + ptr = data->a; + while (ptr && ptr->next) + ptr = ptr->next; + return (ptr); +} + void sort2(t_psdata *data) +{ + t_stack *last; + int inds; + int inds2; + + last = get_last_a(data); + inds = last->ind + 1; + while (data->a->ind != last->ind) + { + inds2 = data->a->ind; + while (data->a->ind == inds2) + { + ft_printf("pb\n"); + ps_push(data, 'b'); + } + inds2 = last->ind; + while (last->ind == inds2 || data->size_b > 0) + { + last = get_last_a(data); + if ((last->ind != inds2 && data->size_b > 0) || (data->b && data->b->nb > last->nb)) + { + ft_printf("pa\n"); + ps_push(data, 'a'); + data->a->ind = inds; + } + else if (data->size_b == 0 || data->b->nb < last->nb) + { + ft_printf("rra\n"); + ps_rerot(data, 'a'); + data->a->ind = inds; + last = get_last_a(data); + } + } + inds++; + last = get_last_a(data); + } +} + +void sort(t_psdata *data) { t_stack *ptr; int inds; @@ -162,74 +211,6 @@ void sort2(t_psdata *data) } } -int sort(t_psdata *data, int size) -{ - t_stack *ptr; - int i; - - if (size > 2) - { - if (!sort(data, ((size % 2) ? size + 1 : size) / 2)) - return (0); - if (!sort(data, size - (((size % 2) ? size + 1 : size) / 2))) - return (0); - } - else if (size == 1) - { - printf("ra\n"); - ps_rot(data, 'a'); - return (1); - } - i = 0; - while (size > 2 && i < size) - { - printf("rra\n"); - ps_rerot(data, 'a'); - i++; - } - i = 0; - ptr = data->a; - while ((i < ((size % 2) ? size + 1 : size) / 2) || (ptr->next != NULL && ptr->nb < ptr->next->nb)) - { - ptr->ind = 1; - ptr = ptr->next; - i++; - if (ptr->next) - return (1); - } - i = 0; - while ((ptr && i < (size - (((size % 2) ? size + 1 : size) / 2)))/* || (ptr != NULL && ptr->next != NULL && ptr->nb < ptr->next->nb)*/) - { - ptr->ind = 2; - ptr = ptr->next; - i++; - } - while (data->a->ind == 1) - { - printf("pb\n"); - if (!ps_push(data, 'b')) - return (0); - if (data->size_b > 1) - { - printf("rb\n"); - ps_rot(data, 'b'); - } - } - while (data->a->ind != 0 || data->size_b > 0) - { - if ((data->a->ind != 0 && data->size_b > 0 && data->a->nb > data->b->nb) - || (data->a->ind == 0 && data->size_b > 0)) - { - printf("pa\n"); - ps_push(data, 'a'); - } - data->a->ind = 0; - printf("ra\n"); - ps_rot(data, 'a'); - } - return (1); -} - int main(int ac, char **av) { t_stack *ptr; @@ -261,6 +242,12 @@ int main(int ac, char **av) } mark_groups(&data); ptr = data.a; + while (ptr) + { + ft_printf("nb: %d ind: %d\n", ptr->nb, ptr->ind); + ptr = ptr->next; + } + ptr = data.a; i = 0; while (ptr) { @@ -268,6 +255,12 @@ int main(int ac, char **av) i++; } sort2(&data); + ptr = data.a; + while (ptr) + { + ft_printf("nb: %d ind: %d\n", ptr->nb, ptr->ind); + ptr = ptr->next; + } ps_stkclean(&data); return (0); }