diff --git a/.gitignore b/.gitignore index 10d1df0..ae38c65 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ visualizer-push-swap/ +push_swap_visualizer/ diff --git a/Makefile b/Makefile index bdd8fc2..594e8ec 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: adjoly +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2023/11/01 11:03:22 by adjoly #+# #+# # -# Updated: 2024/02/22 11:51:16 by adjoly ### ########.fr # +# Updated: 2024/03/11 15:45:33 by adjoly ### ########.fr # # # # **************************************************************************** # @@ -14,9 +14,11 @@ NAME = push_swap CC = cc +OBJSDIR = obj/ + +SRCDIR = src/ + SRCS = main.c \ - algo.c \ - median.c \ check_error.c \ print_stack.c \ parsing.c \ @@ -31,8 +33,13 @@ SRCS = main.c \ operations/ft_pushstack.c \ operations/ft_rotatestack.c \ operations/ft_reverserotate.c \ + algo/get_min_max.c \ + algo/algo.c \ + algo/insertion.c \ + algo/median.c \ + utils/is_sorted.c \ -OBJS = $(SRCS:.c=.o) +OBJS = $(addprefix $(OBJSDIR), $(SRCS:.c=.o)) FLAGS = -Werror -Wall -Wextra -g @@ -41,21 +48,25 @@ HEADERS = so_long.h LIB = libft/libft.a \ $(NAME): $(OBJS) - make -C libft - $(CC) $(FLAGS) $(OBJS) $(LIB) -o $(NAME) + @make -s -C libft + @$(CC) $(FLAGS) $(OBJS) $(LIB) -o $(NAME) + @echo "[✔] Compiled" -%.o: %.c - $(CC) $(FLAGS) -I $(HEADERS) $< -c -o $@ +$(OBJSDIR)%.o: $(SRCDIR)%.c + @mkdir -p $(@D) + @$(CC) $(FLAGS) -I $(HEADERS) $< -c -o $@ + @echo "[✔] $< compiled" all: $(NAME) clean: - make -C libft clean - rm -f $(OBJS) + @make -s -C libft clean + @rm -f $(OBJS) fclean: clean - make -C libft fclean - rm -f $(NAME) + @make -s -C libft fclean + @rm -f $(NAME) + @echo "[X] Cleaned" re: fclean all diff --git a/checker_linux b/checker_linux new file mode 100755 index 0000000..002d593 Binary files /dev/null and b/checker_linux differ diff --git a/obj/algo/algo.o b/obj/algo/algo.o new file mode 100644 index 0000000..d7fa48e Binary files /dev/null and b/obj/algo/algo.o differ diff --git a/obj/algo/get_min_max.o b/obj/algo/get_min_max.o new file mode 100644 index 0000000..9760ce0 Binary files /dev/null and b/obj/algo/get_min_max.o differ diff --git a/obj/algo/insertion.o b/obj/algo/insertion.o new file mode 100644 index 0000000..67d01f6 Binary files /dev/null and b/obj/algo/insertion.o differ diff --git a/obj/algo/median.o b/obj/algo/median.o new file mode 100644 index 0000000..d33084d Binary files /dev/null and b/obj/algo/median.o differ diff --git a/obj/check_error.o b/obj/check_error.o new file mode 100644 index 0000000..255fb2d Binary files /dev/null and b/obj/check_error.o differ diff --git a/obj/main.o b/obj/main.o new file mode 100644 index 0000000..3d12878 Binary files /dev/null and b/obj/main.o differ diff --git a/obj/operations/ft_pushstack.o b/obj/operations/ft_pushstack.o new file mode 100644 index 0000000..549d5dd Binary files /dev/null and b/obj/operations/ft_pushstack.o differ diff --git a/obj/operations/ft_reverserotate.o b/obj/operations/ft_reverserotate.o new file mode 100644 index 0000000..89ad696 Binary files /dev/null and b/obj/operations/ft_reverserotate.o differ diff --git a/obj/operations/ft_rotatestack.o b/obj/operations/ft_rotatestack.o new file mode 100644 index 0000000..455e36c Binary files /dev/null and b/obj/operations/ft_rotatestack.o differ diff --git a/obj/operations/ft_swapstack.o b/obj/operations/ft_swapstack.o new file mode 100644 index 0000000..5949e10 Binary files /dev/null and b/obj/operations/ft_swapstack.o differ diff --git a/obj/parsing.o b/obj/parsing.o new file mode 100644 index 0000000..e376074 Binary files /dev/null and b/obj/parsing.o differ diff --git a/obj/print_stack.o b/obj/print_stack.o new file mode 100644 index 0000000..33eb899 Binary files /dev/null and b/obj/print_stack.o differ diff --git a/obj/stack/ft_stackadd_back.o b/obj/stack/ft_stackadd_back.o new file mode 100644 index 0000000..0a4c0d1 Binary files /dev/null and b/obj/stack/ft_stackadd_back.o differ diff --git a/obj/stack/ft_stackadd_front.o b/obj/stack/ft_stackadd_front.o new file mode 100644 index 0000000..0a79f34 Binary files /dev/null and b/obj/stack/ft_stackadd_front.o differ diff --git a/obj/stack/ft_stackclear.o b/obj/stack/ft_stackclear.o new file mode 100644 index 0000000..613092a Binary files /dev/null and b/obj/stack/ft_stackclear.o differ diff --git a/obj/stack/ft_stackdelone.o b/obj/stack/ft_stackdelone.o new file mode 100644 index 0000000..846ca39 Binary files /dev/null and b/obj/stack/ft_stackdelone.o differ diff --git a/obj/stack/ft_stacklast.o b/obj/stack/ft_stacklast.o new file mode 100644 index 0000000..91c8035 Binary files /dev/null and b/obj/stack/ft_stacklast.o differ diff --git a/obj/stack/ft_stacknew.o b/obj/stack/ft_stacknew.o new file mode 100644 index 0000000..dd20558 Binary files /dev/null and b/obj/stack/ft_stacknew.o differ diff --git a/obj/stack/ft_stacksize.o b/obj/stack/ft_stacksize.o new file mode 100644 index 0000000..1625cb2 Binary files /dev/null and b/obj/stack/ft_stacksize.o differ diff --git a/obj/utils/is_sorted.o b/obj/utils/is_sorted.o new file mode 100644 index 0000000..0905af1 Binary files /dev/null and b/obj/utils/is_sorted.o differ diff --git a/push_swap b/push_swap new file mode 100755 index 0000000..95fa249 Binary files /dev/null and b/push_swap differ diff --git a/push_swap-testeur-max b/push_swap-testeur-max new file mode 160000 index 0000000..84c59f1 --- /dev/null +++ b/push_swap-testeur-max @@ -0,0 +1 @@ +Subproject commit 84c59f165a5665df9cddac803367e6b90fb49a25 diff --git a/push_swap.h b/push_swap.h deleted file mode 100644 index 676df47..0000000 --- a/push_swap.h +++ /dev/null @@ -1,57 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* push_swap.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/02/04 12:18:29 by adjoly #+# #+# */ -/* Updated: 2024/02/22 11:50:24 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef PUSH_SWAP_H -# define PUSH_SWAP_H - -typedef struct s_stack -{ - int nb; - struct s_stack *next; -} t_stack; - -#include "libft/libft.h" - -void ft_check_args_format(char **av); -void ft_check_double(t_stack **stack); - -t_stack *ft_parsing(int ac, char **av); -void ft_print_stack(t_stack *stack); - -void ft_stackadd_back(t_stack **stack, t_stack *new); -void ft_stackadd_front(t_stack **stack, t_stack *new); -void ft_stackclear(t_stack **stack); -void ft_stackdelone(t_stack *stack); -t_stack *ft_stacklast(t_stack *stack); -t_stack *ft_stacknew(int content); -size_t ft_stacksize(t_stack *stack); -t_stack *ft_stackbeforelast(t_stack *stack); - -void ft_swap_a(t_stack *stack_a); -void ft_swap_b(t_stack *stack_b); -void ft_stack_ss(t_stack *stack_a, t_stack *stack_b); - -void ft_push_a(t_stack **stack_a, t_stack **stack_b); -void ft_push_b(t_stack **stack_a, t_stack **stack_b); - -void ft_rotatestack_a(t_stack **stack_a); -void ft_rotatestack_b(t_stack **stack_b); -void ft_rotatestack_r(t_stack **stack_a, t_stack **stack_b); - -void ft_reverserotate_a(t_stack **stack_a); -void ft_reverserotate_b(t_stack **stack_b); -void ft_reverserotate_r(t_stack **stack_a, t_stack **stack_b); - -void ft_algo(t_stack **stack_a, t_stack **stack_b); -int find_median(t_stack **stack); - -#endif diff --git a/push_swap_tester b/push_swap_tester new file mode 160000 index 0000000..317339a --- /dev/null +++ b/push_swap_tester @@ -0,0 +1 @@ +Subproject commit 317339a8b6ada29f9bc263a24fd640ee63036539 diff --git a/algo.c b/src/algo/algo.c similarity index 60% rename from algo.c rename to src/algo/algo.c index 15c9c4e..b07fd49 100644 --- a/algo.c +++ b/src/algo/algo.c @@ -6,87 +6,55 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/21 17:29:26 by adjoly #+# #+# */ -/* Updated: 2024/02/22 13:29:52 by adjoly ### ########.fr */ +/* Updated: 2024/03/11 16:06:26 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "push_swap.h" +#include "../push_swap.h" void send_to_stack_b(t_stack **stack_a, t_stack **stack_b) { size_t stack_size; + int q_one; int median; while (*stack_a) { median = find_median(stack_a); + q_one = find_q_one(stack_a); stack_size = ft_stacksize(*stack_a); - while (*stack_a && stack_size != 0) + while (stack_size != 0) { - if ((*stack_a)->nb < median) + if ((*stack_a)->nb <= median) + { ft_push_b(stack_a, stack_b); + if (*stack_b && (*stack_b)->nb <= q_one) + ft_rotatestack_b(stack_b); + } else ft_rotatestack_a(stack_a); stack_size--; } } -} - -size_t get_stack_max(t_stack **stack) -{ - t_stack *tmp; - size_t i; - size_t i_max; - int max; - - tmp = *stack; - max = tmp->nb; - i_max = 0; - i = 0; - while (tmp) - { - if (tmp->nb > max) - { - max = tmp->nb; - i_max = i; - } - tmp = tmp->next; - i++; - } - return (i_max); + if (*stack_a) + ft_push_b(stack_a, stack_b); } void ft_algo(t_stack **stack_a, t_stack **stack_b) { - size_t max; - size_t i; - size_t stack_size; - - i = 0; - send_to_stack_b(stack_a, stack_b); - stack_size = ft_stacksize(*stack_b); - while (*stack_b) + if (ft_stacksize(*stack_a) == 2) { - max = get_stack_max(stack_b); - i = 0; - if (max < stack_size / 2) - { - while (i < max) - { - ft_rotatestack_b(stack_b); - i++; - } - } - else - { - i = stack_size; - while (i > max) - { - ft_reverserotate_b(stack_b); - i--; - } - } - ft_push_a(stack_a, stack_b); - stack_size--; + ft_swap_a(*stack_a); + return ; } + if (ft_stacksize(*stack_a) == 3) + { + } + if (ft_stacksize(*stack_a) == 5) + { + } + send_to_stack_b(stack_a, stack_b); + while_insert(stack_a, stack_b); + while (ft_is_sort(stack_a) == FALSE) + ft_rotatestack_a(stack_a); } diff --git a/src/algo/get_min_max.c b/src/algo/get_min_max.c new file mode 100644 index 0000000..c3f3466 --- /dev/null +++ b/src/algo/get_min_max.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_min_max.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/03/11 15:23:26 by adjoly #+# #+# */ +/* Updated: 2024/03/11 15:59:26 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../push_swap.h" + +size_t get_stack_max(t_stack **stack) +{ + t_stack *tmp; + size_t i; + size_t i_max; + int max; + + tmp = *stack; + max = tmp->nb; + i_max = 0; + i = 0; + while (tmp) + { + if (tmp->nb > max) + { + max = tmp->nb; + i_max = i; + } + tmp = tmp->next; + i++; + } + return (i_max); +} + +size_t get_stack_min(t_stack **stack) +{ + size_t i; + size_t i_min; + int nb_min; + t_stack *tmp; + + i = 0; + i_min = 0; + nb_min = INT_MAX; + tmp = *stack; + while (tmp) + { + if (tmp->nb < nb_min) + { + i_min = i; + nb_min = tmp->nb; + } + tmp = tmp->next; + i++; + } + return (i_min); +} diff --git a/src/algo/insertion.c b/src/algo/insertion.c new file mode 100644 index 0000000..fb0f5e1 --- /dev/null +++ b/src/algo/insertion.c @@ -0,0 +1,117 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* insertion.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/02/23 14:49:14 by adjoly #+# #+# */ +/* Updated: 2024/03/11 16:03:14 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../push_swap.h" + +void prepare_to_send_a(t_stack **stack_b, size_t lowest_cost_b) +{ + size_t i; + + if (lowest_cost_b < (ft_stacksize(*stack_b) / 2)) + { + while (stack_b && *stack_b && lowest_cost_b > 0) + { + ft_rotatestack_b(stack_b); + lowest_cost_b--; + } + } + else + { + i = 0; + while (stack_b && *stack_b && lowest_cost_b < ft_stacksize(*stack_b)) + { + ft_reverserotate_b(stack_b); + lowest_cost_b++; + } + } +} + +size_t get_index(t_stack **stack, int nb) +{ + t_stack *tmp; + size_t i; + + i = 1; + tmp = (*stack); + while (tmp && tmp->next) + { + if (tmp->nb < nb && tmp->next->nb > nb) + return (i); + tmp = tmp->next; + i++; + } + if (tmp && nb > tmp->nb && nb < (*stack)->nb) + return (0); + return (get_stack_min(stack)); +} + +size_t get_lowest_cost(t_stack **stack_a, t_stack **stack_b) +{ + t_stack *tmp; + size_t i_lowest_cost; + size_t lowest_cost_b; + size_t actual_cost_b; + + i_lowest_cost = get_index(stack_a, (*stack_b)->nb); + tmp = *stack_b; + actual_cost_b = 0; + lowest_cost_b = 0; + while (tmp) + { + if ((get_index(stack_a, tmp->nb) < i_lowest_cost)) + { + i_lowest_cost = get_index(stack_a, tmp->nb); + lowest_cost_b = actual_cost_b; + } + actual_cost_b++; + tmp = tmp->next; + } + prepare_to_send_a(stack_b, lowest_cost_b); + return (i_lowest_cost); +} + +void insert_nb(t_stack **stack_a, t_stack **stack_b) +{ + size_t i; + size_t new_i_elem; + size_t stack_size; + + i = 0; + new_i_elem = get_lowest_cost(stack_a, stack_b); + stack_size = ft_stacksize(*stack_a); + if (new_i_elem < (stack_size / 2)) + { + while (i < new_i_elem) + { + ft_rotatestack_a(stack_a); + i++; + } + } + else + { + i = stack_size; + while (i > new_i_elem) + { + ft_reverserotate_a(stack_a); + i--; + } + } + ft_push_a(stack_a, stack_b); +} + +void while_insert(t_stack **stack_a, t_stack **stack_b) +{ + while (*stack_b) + { + insert_nb(stack_a, stack_b); + } +} diff --git a/median.c b/src/algo/median.c similarity index 67% rename from median.c rename to src/algo/median.c index 4f3905a..9af97ae 100644 --- a/median.c +++ b/src/algo/median.c @@ -6,11 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/22 11:27:04 by adjoly #+# #+# */ -/* Updated: 2024/02/22 13:27:41 by adjoly ### ########.fr */ +/* Updated: 2024/03/11 16:05:40 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "push_swap.h" +#include "../push_swap.h" t_boolean is_median(t_stack **stack, int nb) { @@ -42,3 +42,36 @@ int find_median(t_stack **stack) } return (ERROR); } + +t_boolean is_q_one(t_stack **stack, int nb) +{ + t_stack *tmp; + int tmp_count; + int count; + + tmp = *stack; + count = 0; + while (tmp) + { + tmp_count = (tmp->nb < nb) + (tmp->nb < nb) + (tmp->nb < nb); + count += tmp_count - (tmp->nb > nb); + tmp = tmp->next; + } + if (count == -1 || count == 0 || count == 1) + return (TRUE); + return (FALSE); +} + +int find_q_one(t_stack **stack) +{ + t_stack *tmp; + + tmp = *stack; + while (tmp) + { + if (is_q_one(stack, tmp->nb) == TRUE) + return (tmp->nb); + tmp = tmp->next; + } + return (ERROR); +} diff --git a/src/algo/small_mouv.c b/src/algo/small_mouv.c new file mode 100644 index 0000000..b471d26 --- /dev/null +++ b/src/algo/small_mouv.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* small_mouv.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/03/11 16:12:47 by adjoly #+# #+# */ +/* Updated: 2024/03/11 16:21:54 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../push_swap.h" + +void sort_three(t_stack **stack_a) +{ + if ((*stack_a)->nb > (*stack_a)->next->nb) + ft_swap_a(*stack_a); + if (get_stack_max(stack_a) == 2) + ft_reverserotate_a(stack_a); +} diff --git a/check_error.c b/src/check_error.c similarity index 79% rename from check_error.c rename to src/check_error.c index 9d880ff..381d78b 100644 --- a/check_error.c +++ b/src/check_error.c @@ -6,40 +6,34 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/15 13:45:25 by adjoly #+# #+# */ -/* Updated: 2024/02/18 18:30:08 by adjoly ### ########.fr */ +/* Updated: 2024/03/11 15:56:15 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft/libft.h" #include "push_swap.h" -#include -#include void ft_check_args_format(char **av) { - size_t i; - size_t j; + char **tmp; + char *tmp_av; - i = 0; - av++; - while (*av) + tmp = av; + tmp++; + while (*tmp) { - j = 0; - while (**av) + tmp_av = *tmp; + while (*tmp_av) { - if (!ft_isdigit(**av) && **av != 32 && **av != '-' && **av != '+') + if (!ft_isdigit(*tmp_av) && *tmp_av != 32 \ + && *tmp_av != '-' && *tmp_av != '+') { ft_putendl_fd("Error", STDERR_FILENO); exit(EXIT_SUCCESS); } - j++; - (*av)++; + tmp_av++; } - (*av) -= j; - i++; - av++; + tmp++; } - av -= i; } void ft_check_double(t_stack **stack) diff --git a/main.c b/src/main.c similarity index 65% rename from main.c rename to src/main.c index c1ddae1..9c2f5c0 100644 --- a/main.c +++ b/src/main.c @@ -6,12 +6,43 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/04 12:14:22 by adjoly #+# #+# */ -/* Updated: 2024/02/22 13:28:28 by adjoly ### ########.fr */ +/* Updated: 2024/03/08 14:17:09 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" +void ft_check_args(char **av) +{ + char **tmp; + char *tmp_av; + + tmp = av; + tmp++; + while (*tmp) + { + tmp_av = *tmp; + while (*tmp_av) + { + if ((*tmp_av == '+' || *tmp_av == '-')) + { + if (!ft_isdigit(*tmp_av + 1)) + { + ft_putendl_fd("Error", STDERR_FILENO); + exit(EXIT_FAILURE); + } + else + { + while (!*tmp_av && ft_isdigit(*tmp_av)) + tmp_av++; + } + } + tmp_av++; + } + tmp++; + } +} + int main(int ac, char **av) { t_stack *stack_a; @@ -23,12 +54,18 @@ int main(int ac, char **av) exit(EXIT_FAILURE); } ft_check_args_format(av); + ft_check_args(av); stack_b = NULL; - stack_a = ft_parsing(ac, av); + stack_a = ft_parsing(av); if (ft_stacksize(stack_a) <= 1) { ft_stackclear(&stack_a); - exit(EXIT_FAILURE); + exit(EXIT_SUCCESS); + } + if (ft_is_sort(&stack_a) == TRUE) + { + ft_stackclear(&stack_a); + exit(EXIT_SUCCESS); } ft_check_double(&stack_a); ft_algo(&stack_a, &stack_b); @@ -36,4 +73,3 @@ int main(int ac, char **av) ft_stackclear(&stack_b); return (0); } - diff --git a/src/mouv b/src/mouv new file mode 100644 index 0000000..caebc11 --- /dev/null +++ b/src/mouv @@ -0,0 +1,8 @@ +1 2 3 nope +1 3 2 sa ra + +3 2 1 sa rra +3 1 2 ra + +2 1 3 sa +2 3 1 rra diff --git a/operations/ft_pushstack.c b/src/operations/ft_pushstack.c similarity index 95% rename from operations/ft_pushstack.c rename to src/operations/ft_pushstack.c index 8a7edbf..6117d91 100644 --- a/operations/ft_pushstack.c +++ b/src/operations/ft_pushstack.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/08 18:08:51 by adjoly #+# #+# */ -/* Updated: 2024/02/21 17:55:12 by adjoly ### ########.fr */ +/* Updated: 2024/03/11 15:10:03 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ void ft_push_a(t_stack **stack_a, t_stack **stack_b) { t_stack *tmp_a; - + if (!stack_b || !(*stack_b)) return ; ft_putendl_fd("pa", STDOUT_FILENO); @@ -38,4 +38,3 @@ void ft_push_b(t_stack **stack_a, t_stack **stack_b) tmp_b->next = *stack_b; *stack_b = tmp_b; } - diff --git a/operations/ft_reverserotate.c b/src/operations/ft_reverserotate.c similarity index 93% rename from operations/ft_reverserotate.c rename to src/operations/ft_reverserotate.c index 7aeb3b3..dc7aa65 100644 --- a/operations/ft_reverserotate.c +++ b/src/operations/ft_reverserotate.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/13 13:41:25 by adjoly #+# #+# */ -/* Updated: 2024/02/15 13:30:20 by adjoly ### ########.fr */ +/* Updated: 2024/03/11 15:10:13 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,8 +18,6 @@ void ft_reverserotate(t_stack **stack) t_stack *last; t_stack *stack_start; - if (!stack || !(*stack) || !(*stack)->next) - return ; bfrlast = ft_stackbeforelast(*stack); last = ft_stacklast(*stack); bfrlast->next = NULL; @@ -54,4 +52,3 @@ void ft_reverserotate_r(t_stack **stack_a, t_stack **stack_b) ft_reverserotate(stack_a); ft_reverserotate(stack_b); } - diff --git a/operations/ft_rotatestack.c b/src/operations/ft_rotatestack.c similarity index 84% rename from operations/ft_rotatestack.c rename to src/operations/ft_rotatestack.c index e691fd5..3bbfe18 100644 --- a/operations/ft_rotatestack.c +++ b/src/operations/ft_rotatestack.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/13 12:53:55 by adjoly #+# #+# */ -/* Updated: 2024/02/15 13:32:27 by adjoly ### ########.fr */ +/* Updated: 2024/03/11 15:09:40 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ void ft_rotatestack(t_stack **stack) { t_stack *tmp_last; t_stack *start; - + if (!stack || !(*stack)) return ; start = (*stack)->next; @@ -28,7 +28,7 @@ void ft_rotatestack(t_stack **stack) void ft_rotatestack_a(t_stack **stack_a) { - if (!stack_a || !(*stack_a)) + if (!stack_a || !(*stack_a) || !(*stack_a)->next) return ; ft_putendl_fd("ra", STDOUT_FILENO); ft_rotatestack(stack_a); @@ -36,7 +36,7 @@ void ft_rotatestack_a(t_stack **stack_a) void ft_rotatestack_b(t_stack **stack_b) { - if (!stack_b || !(*stack_b)) + if (!stack_b || !(*stack_b) || !(*stack_b)->next) return ; ft_putendl_fd("rb", STDOUT_FILENO); ft_rotatestack(stack_b); @@ -44,12 +44,11 @@ void ft_rotatestack_b(t_stack **stack_b) void ft_rotatestack_r(t_stack **stack_a, t_stack **stack_b) { - if (!stack_a || !(*stack_a)) + if (!stack_a || !(*stack_a) || !(*stack_a)->next) return ; - if (!stack_b || !(*stack_b)) + if (!stack_b || !(*stack_b) || !(*stack_b)->next) return ; ft_putendl_fd("rr", STDOUT_FILENO); ft_rotatestack(stack_a); ft_rotatestack(stack_b); } - diff --git a/operations/ft_swapstack.c b/src/operations/ft_swapstack.c similarity index 95% rename from operations/ft_swapstack.c rename to src/operations/ft_swapstack.c index 9d437e3..aa438c5 100644 --- a/operations/ft_swapstack.c +++ b/src/operations/ft_swapstack.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/08 17:55:21 by adjoly #+# #+# */ -/* Updated: 2024/02/15 13:36:44 by adjoly ### ########.fr */ +/* Updated: 2024/03/11 15:09:06 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ void ft_swapstack(t_stack *stack) { int tmp; - + if (!stack) return ; tmp = stack->nb; diff --git a/parsing.c b/src/parsing.c similarity index 58% rename from parsing.c rename to src/parsing.c index 0192e65..e4a6edc 100644 --- a/parsing.c +++ b/src/parsing.c @@ -6,12 +6,26 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/04 12:05:43 by adjoly #+# #+# */ -/* Updated: 2024/02/08 17:41:41 by adjoly ### ########.fr */ +/* Updated: 2024/03/11 15:58:28 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" +size_t ft_nbrlen(char *s) +{ + char *tmp; + char *nbrlen; + + tmp = s; + while (*tmp || *tmp == '-' || *tmp == '+' || *tmp == '0') + tmp++; + nbrlen = tmp; + while (*nbrlen) + nbrlen++; + return (nbrlen - tmp); +} + void ft_freearr(char **arr) { size_t i; @@ -25,27 +39,30 @@ void ft_freearr(char **arr) free(arr); } -t_stack *ft_parsing(int ac, char **av) +t_stack *ft_parsing(char **av) { - t_stack *parsed_data; + t_stack *parsed_data; char **tmp_split; - size_t i; + char **split; + char **tmp_av; - i = 0; - (void)ac; - av++; + tmp_av = av; + tmp_av++; parsed_data = NULL; - while (*av) + while (*tmp_av) { - i = 0; - tmp_split = ft_split(*av, ' '); - while (tmp_split[i]) + split = ft_split(*tmp_av, ' '); + tmp_split = split; + while (*tmp_split) { - ft_stackadd_back(&parsed_data, ft_stacknew(ft_atoi(tmp_split[i]))); - i++; + if (ft_nbrlen(*tmp_split) > 11 || ft_atoll(*tmp_split) > 2147483647 \ + || ft_atoll(*tmp_split) < -2147483648) + ft_senderror(); + ft_stackadd_back(&parsed_data, ft_stacknew(ft_atoi(*tmp_split))); + tmp_split++; } - ft_freearr(tmp_split); - av++; + ft_freearr(split); + tmp_av++; } return (parsed_data); } diff --git a/print_stack.c b/src/print_stack.c similarity index 91% rename from print_stack.c rename to src/print_stack.c index 657c96c..69a0ade 100644 --- a/print_stack.c +++ b/src/print_stack.c @@ -6,11 +6,10 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/15 11:05:52 by adjoly #+# #+# */ -/* Updated: 2024/02/15 11:07:42 by adjoly ### ########.fr */ +/* Updated: 2024/03/04 12:36:31 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft/libft.h" #include "push_swap.h" void ft_print_stack(t_stack *stack) diff --git a/src/push_swap.h b/src/push_swap.h new file mode 100644 index 0000000..744ab00 --- /dev/null +++ b/src/push_swap.h @@ -0,0 +1,73 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* push_swap.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/02/04 12:18:29 by adjoly #+# #+# */ +/* Updated: 2024/03/11 16:07:50 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef PUSH_SWAP_H +# define PUSH_SWAP_H + +# include "../libft/libft.h" + +typedef struct s_stack +{ + int nb; + struct s_stack *next; +} t_stack; + +// stack +void ft_stackadd_back(t_stack **stack, t_stack *new); +void ft_stackadd_front(t_stack **stack, t_stack *new); +void ft_stackclear(t_stack **stack); +void ft_stackdelone(t_stack *stack); +t_stack *ft_stacklast(t_stack *stack); +t_stack *ft_stacknew(int content); +size_t ft_stacksize(t_stack *stack); +t_stack *ft_stackbeforelast(t_stack *stack); + +// operations +void ft_swap_a(t_stack *stack_a); +void ft_swap_b(t_stack *stack_b); +void ft_stack_ss(t_stack *stack_a, t_stack *stack_b); + +void ft_push_a(t_stack **stack_a, t_stack **stack_b); +void ft_push_b(t_stack **stack_a, t_stack **stack_b); + +void ft_rotatestack_a(t_stack **stack_a); +void ft_rotatestack_b(t_stack **stack_b); +void ft_rotatestack_r(t_stack **stack_a, t_stack **stack_b); + +void ft_reverserotate_a(t_stack **stack_a); +void ft_reverserotate_b(t_stack **stack_b); +void ft_reverserotate_r(t_stack **stack_a, t_stack **stack_b); + +// algo +void ft_algo(t_stack **stack_a, t_stack **stack_b); +int find_median(t_stack **stack); +void insert_nb(t_stack **stack_a, t_stack **stack_b); +void while_insert(t_stack **stack_a, t_stack **stack_b); +size_t get_lowest_cost(t_stack **stack_a, t_stack **stack_b); +t_boolean ft_is_sort(t_stack **stack); +int find_q_one(t_stack **stack); + +// get_min_max +size_t get_stack_max(t_stack **stack); +size_t get_stack_min(t_stack **stack); + +// error checkin +void ft_check_args_format(char **av); +t_stack *ft_parsing(char **av); +void ft_check_double(t_stack **stack); +void ft_print_stack(t_stack *stack); + +// utils +t_boolean ft_is_sort(t_stack **stack); +void ft_senderror(void); + +#endif diff --git a/stack/ft_stackadd_back.c b/src/stack/ft_stackadd_back.c similarity index 100% rename from stack/ft_stackadd_back.c rename to src/stack/ft_stackadd_back.c diff --git a/stack/ft_stackadd_front.c b/src/stack/ft_stackadd_front.c similarity index 100% rename from stack/ft_stackadd_front.c rename to src/stack/ft_stackadd_front.c diff --git a/stack/ft_stackclear.c b/src/stack/ft_stackclear.c similarity index 100% rename from stack/ft_stackclear.c rename to src/stack/ft_stackclear.c diff --git a/stack/ft_stackdelone.c b/src/stack/ft_stackdelone.c similarity index 100% rename from stack/ft_stackdelone.c rename to src/stack/ft_stackdelone.c diff --git a/stack/ft_stacklast.c b/src/stack/ft_stacklast.c similarity index 100% rename from stack/ft_stacklast.c rename to src/stack/ft_stacklast.c diff --git a/stack/ft_stacknew.c b/src/stack/ft_stacknew.c similarity index 100% rename from stack/ft_stacknew.c rename to src/stack/ft_stacknew.c diff --git a/stack/ft_stacksize.c b/src/stack/ft_stacksize.c similarity index 93% rename from stack/ft_stacksize.c rename to src/stack/ft_stacksize.c index afebea2..ae7b5a7 100644 --- a/stack/ft_stacksize.c +++ b/src/stack/ft_stacksize.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/05 11:42:40 by adjoly #+# #+# */ -/* Updated: 2024/02/22 13:29:39 by adjoly ### ########.fr */ +/* Updated: 2024/03/07 11:30:13 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/utils/is_sorted.c b/src/utils/is_sorted.c new file mode 100644 index 0000000..cb325bc --- /dev/null +++ b/src/utils/is_sorted.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* is_sorted.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/03/11 15:39:00 by adjoly #+# #+# */ +/* Updated: 2024/03/11 15:41:20 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../push_swap.h" + +t_boolean ft_is_sort(t_stack **stack) +{ + t_stack *tmp; + + tmp = *stack; + while (tmp->next && tmp->nb < tmp->next->nb) + tmp = tmp->next; + if (!tmp->next) + return (TRUE); + return (FALSE); +} diff --git a/src/utils/print_error.c b/src/utils/print_error.c new file mode 100644 index 0000000..299064f --- /dev/null +++ b/src/utils/print_error.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* print_error.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/03/11 15:47:05 by adjoly #+# #+# */ +/* Updated: 2024/03/11 15:54:09 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../push_swap.h" + +void ft_senderror(void) +{ + ft_putendl_fd("Error", STDOUT_FILENO); + exit(EXIT_FAILURE); +}