From 31f2054f1cf7924f7784fdf17f9d85e149ca4a6f Mon Sep 17 00:00:00 2001 From: Angel Ortigosa Perez Date: Mon, 8 Sep 2025 14:02:27 +0200 Subject: [PATCH] Push Swap --- Makefile | 30 ++++++++++++++++ cost.c | 58 +++++++++++++++++++++++++++++++ init.c | 74 ++++++++++++++++++++++++++++++++++++++++ main.c | 81 ++++++++++++++++++++++++++++++++++++++++++++ moves.c | 78 ++++++++++++++++++++++++++++++++++++++++++ position.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ push.c | 37 ++++++++++++++++++++ push_swap.h | 81 ++++++++++++++++++++++++++++++++++++++++++++ rotate.c | 44 ++++++++++++++++++++++++ rrotate.c | 46 +++++++++++++++++++++++++ sort.c | 79 ++++++++++++++++++++++++++++++++++++++++++ stack.c | 74 ++++++++++++++++++++++++++++++++++++++++ string.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ swap.c | 44 ++++++++++++++++++++++++ three_sort.c | 42 +++++++++++++++++++++++ utils.c | 80 +++++++++++++++++++++++++++++++++++++++++++ 16 files changed, 1036 insertions(+) create mode 100644 Makefile create mode 100644 cost.c create mode 100644 init.c create mode 100644 main.c create mode 100644 moves.c create mode 100644 position.c create mode 100644 push.c create mode 100644 push_swap.h create mode 100644 rotate.c create mode 100644 rrotate.c create mode 100644 sort.c create mode 100644 stack.c create mode 100644 string.c create mode 100644 swap.c create mode 100644 three_sort.c create mode 100644 utils.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1203359 --- /dev/null +++ b/Makefile @@ -0,0 +1,30 @@ +NAME = push_swap + +SRCS = cost.c main.c init.c moves.c position.c push.c rotate.c rrotate.c sort.c stack.c string.c swap.c three_sort.c utils.c + +HEADER = ./push_swap.h + +CC = cc +CFLAGS = -Wall -Wextra -Werror +RM = rm -f + +%o: %.c + ${CC} ${CFLAGS} -c $< -o $@ + +OBJS = ${SRCS:.c=.o} + +all: ${NAME} + +${NAME}: ${OBJS} $(HEADER) + ${CC} ${SRCS} -o ${NAME} + +clean: + ${RM} ${OBJS} + +fclean: + ${RM} ${OBJS} + ${RM} ${NAME} + +re: fclean all + +.PHONY: all clean fclean re \ No newline at end of file diff --git a/cost.c b/cost.c new file mode 100644 index 0000000..8f65cff --- /dev/null +++ b/cost.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cost.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/14 06:25:35 by aortigos #+# #+# */ +/* Updated: 2024/08/15 06:27:14 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +void cost(t_stack **stack_a, t_stack **stack_b) +{ + t_stack *tmp_a; + t_stack *tmp_b; + int size_a; + int size_b; + + tmp_a = *stack_a; + tmp_b = *stack_b; + size_a = get_stack_size(tmp_a); + size_b = get_stack_size(tmp_b); + while (tmp_b) + { + tmp_b->cost_b = tmp_b->pos; + if (tmp_b->pos > size_b / 2) + tmp_b->cost_b = (size_b - tmp_b->pos) * -1; + tmp_b->cost_a = tmp_b->target; + if (tmp_b->target > size_a / 2) + tmp_b->cost_a = (size_a - tmp_b->target) * -1; + tmp_b = tmp_b->next; + } +} + +void cheapest_move(t_stack **stack_a, t_stack **stack_b) +{ + t_stack *tmp; + int cheapest; + int cost_a; + int cost_b; + + tmp = *stack_b; + cheapest = INT_MAX; + while (tmp) + { + if (abs(tmp->cost_a) + abs(tmp->cost_b) < cheapest) + { + cheapest = abs(tmp->cost_a) + abs(tmp->cost_b); + cost_a = tmp->cost_a; + cost_b = tmp->cost_b; + } + tmp = tmp->next; + } + do_move(stack_a, stack_b, cost_a, cost_b); +} diff --git a/init.c b/init.c new file mode 100644 index 0000000..f4210f1 --- /dev/null +++ b/init.c @@ -0,0 +1,74 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/12 05:40:30 by aortigos #+# #+# */ +/* Updated: 2024/08/16 06:36:55 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +long input_is_correct(char *str) +{ + int i; + + i = 0; + if ((str[i] == '-' || str[i] == '+') && (ft_strlen(str) > 1)) + i++; + while (str[i] != '\0') + { + while (str[i] < '0' || str[i] > '9') + return (0); + i++; + } + return (1); +} + +int is_duplicated(t_stack *column) +{ + t_stack *tmp; + t_stack *tmp2; + + tmp = column; + while (tmp) + { + tmp2 = tmp->next; + while (tmp2) + { + if (tmp->value == tmp2->value) + return (1); + tmp2 = tmp2->next; + } + tmp = tmp->next; + } + return (0); +} + +void get_index(t_stack *stack_a, int stack_size) +{ + t_stack *ptr; + t_stack *biggest; + int min_value; + + while (--stack_size > 0) + { + ptr = stack_a; + biggest = NULL; + min_value = INT_MIN; + while (ptr) + { + if (ptr->value > min_value && ptr->index == 0) + { + min_value = ptr->value; + biggest = ptr; + } + ptr = ptr->next; + } + if (biggest != NULL) + biggest->index = stack_size; + } +} diff --git a/main.c b/main.c new file mode 100644 index 0000000..5d34c87 --- /dev/null +++ b/main.c @@ -0,0 +1,81 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/13 05:46:55 by aortigos #+# #+# */ +/* Updated: 2024/08/16 06:16:45 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +int is_sorted(t_stack *stack) +{ + while (stack->next != NULL) + { + if (stack->value > stack->next->value) + return (0); + stack = stack->next; + } + return (1); +} + +static void push_swap(t_stack **stack_a, t_stack **stack_b, int stack_size) +{ + if (stack_size == 2 && !is_sorted(*stack_a)) + ft_sa(stack_a); + else if (stack_size == 3 && !is_sorted(*stack_a)) + three_sort(stack_a); + else if (stack_size > 3 && !is_sorted(*stack_a)) + sort(stack_a, stack_b); +} + +void get_numbers(char *argv, t_stack **stack_a) +{ + char **param; + long int n; + int i; + + param = ft_split(argv, ' '); + i = 0; + while (param[i] != NULL) + { + if (input_is_correct(param[i])) + { + n = ft_atoi(param[i]); + if (n > INT_MAX || n < INT_MIN) + error_exit(stack_a, NULL); + stack_add(stack_a, stack_new(n)); + } + else + error_exit(NULL, NULL); + free(param[i]); + i++; + } + free(param); +} + +int main(int argc, char **argv) +{ + t_stack *stack_a; + t_stack *stack_b; + int stack_size; + int i; + + i = 1; + stack_a = NULL; + stack_b = NULL; + while (i < argc) + get_numbers(argv[i++], &stack_a); + if (is_duplicated(stack_a)) + error_exit(&stack_a, NULL); + stack_size = get_stack_size(stack_a); + get_index(stack_a, stack_size + 1); + push_swap(&stack_a, &stack_b, stack_size); + free_stack(&stack_a); + free_stack(&stack_b); + return (0); +} diff --git a/moves.c b/moves.c new file mode 100644 index 0000000..43bbe15 --- /dev/null +++ b/moves.c @@ -0,0 +1,78 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* moves.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/14 06:19:17 by aortigos #+# #+# */ +/* Updated: 2024/08/14 06:24:42 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +static void reverse_both(t_stack **a, t_stack **b, int *cost_a, int *cost_b) +{ + while (*cost_a < 0 && *cost_b < 0) + { + (*cost_a)++; + (*cost_b)++; + ft_rrr(a, b); + } +} + +static void rotate_both(t_stack **a, t_stack **b, int *cost_a, int *cost_b) +{ + while (*cost_a > 0 && *cost_b > 0) + { + (*cost_a)--; + (*cost_b)--; + ft_rr(a, b); + } +} + +static void rotate_a(t_stack **a, int *cost) +{ + while (*cost) + { + if (*cost > 0) + { + ft_ra(a); + (*cost)--; + } + else if (*cost < 0) + { + ft_rra(a); + (*cost)++; + } + } +} + +static void rotate_b(t_stack **b, int *cost) +{ + while (*cost) + { + if (*cost > 0) + { + ft_rb(b); + (*cost)--; + } + else if (*cost < 0) + { + ft_rrb(b); + (*cost)++; + } + } +} + +void do_move(t_stack **a, t_stack **b, int cost_a, int cost_b) +{ + if (cost_a < 0 && cost_b < 0) + reverse_both(a, b, &cost_a, &cost_b); + else if (cost_a > 0 && cost_b > 0) + rotate_both(a, b, &cost_a, &cost_b); + rotate_a(a, &cost_a); + rotate_b(b, &cost_b); + ft_pa(a, b); +} diff --git a/position.c b/position.c new file mode 100644 index 0000000..a635324 --- /dev/null +++ b/position.c @@ -0,0 +1,96 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* position.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/13 05:12:56 by aortigos #+# #+# */ +/* Updated: 2024/08/13 05:32:46 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +static void get_position(t_stack **stack) +{ + t_stack *tmp; + int i; + + tmp = *stack; + i = 0; + while (tmp) + { + tmp->pos = i; + tmp = tmp->next; + i++; + } +} + +static int get_target(t_stack **stack_a, int index_b, int target_i, int target) +{ + t_stack *tmp; + + tmp = *stack_a; + while (tmp) + { + if (tmp->index > index_b && tmp->index < target_i) + { + target_i = tmp->index; + target = tmp->pos; + } + tmp = tmp->next; + } + if (target_i != INT_MAX) + return (target); + tmp = *stack_a; + while (tmp) + { + if (tmp->index < target_i) + { + target_i = tmp->index; + target = tmp->pos; + } + tmp = tmp->next; + } + return (target); +} + +int position_lowest_index(t_stack **stack) +{ + t_stack *tmp; + int lowest_i; + int lowest_p; + + tmp = *stack; + lowest_i = INT_MAX; + get_position(stack); + lowest_p = tmp->pos; + while (tmp) + { + if (tmp->index < lowest_i) + { + lowest_i = tmp->index; + lowest_p = tmp->pos; + } + tmp = tmp->next; + } + return (lowest_p); +} + +void get_target_position(t_stack **stack_a, t_stack **stack_b) +{ + t_stack *tmp; + int target; + + tmp = *stack_b; + get_position(stack_a); + get_position(stack_b); + target = 0; + while (tmp) + { + target = get_target(stack_a, tmp->index, INT_MAX, target); + tmp->target = target; + tmp = tmp->next; + } +} diff --git a/push.c b/push.c new file mode 100644 index 0000000..50e42bd --- /dev/null +++ b/push.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* push.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/12 06:25:15 by aortigos #+# #+# */ +/* Updated: 2024/08/13 05:35:48 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +static void push(t_stack **src, t_stack **dst) +{ + t_stack *tmp; + + if (*src == NULL) + return ; + tmp = (*src)->next; + (*src)->next = *dst; + *dst = *src; + *src = tmp; +} + +void ft_pa(t_stack **stack_a, t_stack **stack_b) +{ + push(stack_b, stack_a); + ft_putstr("pa\n"); +} + +void ft_pb(t_stack **stack_a, t_stack **stack_b) +{ + push(stack_a, stack_b); + ft_putstr("pb\n"); +} diff --git a/push_swap.h b/push_swap.h new file mode 100644 index 0000000..5798f96 --- /dev/null +++ b/push_swap.h @@ -0,0 +1,81 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* push_swap.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/08 06:50:52 by aortigos #+# #+# */ +/* Updated: 2024/08/15 06:26:49 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef PUSH_SWAP_H +# define PUSH_SWAP_H + +# include +# include +# include +# include + +typedef struct s_stack +{ + int value; + int index; + int pos; + int target; + int cost_a; + int cost_b; + struct s_stack *next; +} t_stack; + +// Sorts +void three_sort(t_stack **stack); +void sort(t_stack **stack_a, t_stack **stack_b); + +void do_move(t_stack **a, t_stack **b, int cost_a, int cost_b); +void cost(t_stack **stack_a, t_stack **stack_b); +void cheapest_move(t_stack **stack_a, t_stack **stack_b); + +// Swap +void ft_sa(t_stack **stack_a); +void ft_sb(t_stack **stack_b); +void ft_ss(t_stack **stack_a, t_stack **stack_b); +void ft_pa(t_stack **stack_a, t_stack **stack_b); +void ft_pb(t_stack **stack_a, t_stack **stack_b); +void ft_ra(t_stack **stack_a); +void ft_rb(t_stack **stack_b); +void ft_rr(t_stack **stack_a, t_stack **stack_b); +void ft_rra(t_stack **stack_a); +void ft_rrb(t_stack **stack_b); +void ft_rrr(t_stack **stack_a, t_stack **stack_b); + +// Stack +t_stack *stack_new(int value); +void stack_add(t_stack **stack, t_stack *new); +t_stack *get_bottom(t_stack *stack); +t_stack *before_bottom(t_stack *stack); + +// Utils +void free_stack(t_stack **stack); +void error_exit(t_stack **stack_a, t_stack **stack_b); + +long int ft_atoi(const char *str); +void ft_putstr(char *str); +int abs(int nb); +size_t ft_strlen(const char *str); + +char **ft_split(char const *s, char c); + +// Utils Stack + +long input_is_correct(char *str); +int is_duplicated(t_stack *column); +void get_index(t_stack *stack_a, int stack_size); + +int position_lowest_index(t_stack **stack); +void get_target_position(t_stack **stack_a, t_stack **stack_b); +int get_stack_size(t_stack *stack); +int is_sorted(t_stack *stack); + +#endif diff --git a/rotate.c b/rotate.c new file mode 100644 index 0000000..729f46a --- /dev/null +++ b/rotate.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rotate.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/13 05:37:54 by aortigos #+# #+# */ +/* Updated: 2024/08/13 05:43:18 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +static void rotate(t_stack **stack) +{ + t_stack *tmp; + t_stack *tail; + + tmp = *stack; + *stack = (*stack)->next; + tail = get_bottom(*stack); + tmp->next = NULL; + tail->next = tmp; +} + +void ft_ra(t_stack **stack_a) +{ + rotate(stack_a); + ft_putstr("ra\n"); +} + +void ft_rb(t_stack **stack_b) +{ + rotate(stack_b); + ft_putstr("rb\n"); +} + +void ft_rr(t_stack **stack_a, t_stack **stack_b) +{ + rotate(stack_a); + rotate(stack_b); + ft_putstr("rr\n"); +} diff --git a/rrotate.c b/rrotate.c new file mode 100644 index 0000000..206075d --- /dev/null +++ b/rrotate.c @@ -0,0 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rrotate.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/13 05:30:07 by aortigos #+# #+# */ +/* Updated: 2024/08/13 05:37:15 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +static void r_rotate(t_stack **stack) +{ + t_stack *tmp; + t_stack *tail; + t_stack *new_tail; + + tail = get_bottom(*stack); + new_tail = before_bottom(*stack); + tmp = *stack; + *stack = tail; + (*stack)->next = tmp; + new_tail->next = NULL; +} + +void ft_rra(t_stack **stack_a) +{ + r_rotate(stack_a); + ft_putstr("rra\n"); +} + +void ft_rrb(t_stack **stack_b) +{ + r_rotate(stack_b); + ft_putstr("rrb\n"); +} + +void ft_rrr(t_stack **stack_a, t_stack **stack_b) +{ + r_rotate(stack_a); + r_rotate(stack_b); + ft_putstr("rrr\n"); +} diff --git a/sort.c b/sort.c new file mode 100644 index 0000000..d30c434 --- /dev/null +++ b/sort.c @@ -0,0 +1,79 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* sort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/14 05:58:30 by aortigos #+# #+# */ +/* Updated: 2024/08/14 06:30:25 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +static void push_init(t_stack **stack_a, t_stack **stack_b) +{ + int stack_size; + int push; + int i; + + push = 0; + i = 0; + stack_size = get_stack_size(*stack_a); + while (stack_size < 6 && i < stack_size && push < stack_size / 2) + { + if ((*stack_a)->index <= stack_size / 2) + { + ft_pb(stack_a, stack_b); + push++; + } + else + ft_ra(stack_a); + i++; + } + while (stack_size - push > 3) + { + ft_pb(stack_a, stack_b); + push++; + } +} + +static void sort_stack(t_stack **stack_a) +{ + int lowest_p; + int stack_size; + + stack_size = get_stack_size(*stack_a); + lowest_p = position_lowest_index(stack_a); + if (lowest_p > stack_size / 2) + { + while (lowest_p < stack_size) + { + ft_rra(stack_a); + lowest_p++; + } + } + else + { + while (lowest_p > 0) + { + ft_ra(stack_a); + lowest_p--; + } + } +} + +void sort(t_stack **stack_a, t_stack **stack_b) +{ + push_init(stack_a, stack_b); + three_sort(stack_a); + while (*stack_b) + { + get_target_position(stack_a, stack_b); + cost(stack_a, stack_b); + cheapest_move(stack_a, stack_b); + } + if (!is_sorted(*stack_a)) + sort_stack(stack_a); +} diff --git a/stack.c b/stack.c new file mode 100644 index 0000000..fcd6269 --- /dev/null +++ b/stack.c @@ -0,0 +1,74 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* stack.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/12 06:02:23 by aortigos #+# #+# */ +/* Updated: 2024/08/12 06:22:20 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +t_stack *stack_new(int value) +{ + t_stack *new; + + new = malloc(sizeof(t_stack)); + if (!new) + return (NULL); + new->value = value; + new->index = 0; + new->pos = -1; + new->target = -1; + new->cost_a = -1; + new->cost_b = -1; + new->next = NULL; + return (new); +} + +void stack_add(t_stack **stack, t_stack *new) +{ + t_stack *bottom; + + if (!new) + return ; + if (!*stack) + { + *stack = new; + return ; + } + bottom = get_bottom(*stack); + bottom->next = new; +} + +t_stack *get_bottom(t_stack *stack) +{ + while (stack && stack->next != NULL) + stack = stack->next; + return (stack); +} + +t_stack *before_bottom(t_stack *stack) +{ + while (stack && stack->next->next != NULL) + stack = stack->next; + return (stack); +} + +int get_stack_size(t_stack *stack) +{ + int size; + + size = 0; + if (!stack) + return (0); + while (stack) + { + stack = stack->next; + size++; + } + return (size); +} diff --git a/string.c b/string.c new file mode 100644 index 0000000..631623a --- /dev/null +++ b/string.c @@ -0,0 +1,92 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* string.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/12 05:44:58 by aortigos #+# #+# */ +/* Updated: 2024/08/14 05:56:04 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +size_t ft_strlen(const char *str) +{ + size_t i; + + i = 0; + while (str[i] != '\0') + i++; + return (i); +} + +static unsigned int countwords(const char *s, char c) +{ + unsigned int count; + + count = 0; + while (*s) + { + while (*s && c == *s) + s++; + if (*s) + count++; + while (*s && *s != c) + s++; + } + return (count); +} + +static char *word_dup(const char *str, int start, int finish) +{ + char *word; + int i; + + i = 0; + word = malloc((finish - start + 1) * sizeof(char)); + if (!word) + return (NULL); + while (start < finish) + word[i++] = str[start++]; + word[i] = '\0'; + return (word); +} + +static char *ft_cpy(size_t i, char const *s, char c, char **split) +{ + int index; + size_t j; + + index = -1; + j = 0; + while (i <= ft_strlen(s)) + { + if (s[i] != c && index < 0) + index = i; + else if ((s[i] == c || i == ft_strlen(s)) && index >= 0) + { + split[j++] = word_dup(s, index, i); + index = -1; + } + i++; + } + split[j] = 0; + return (split[j]); +} + +char **ft_split(char const *s, char c) +{ + size_t i; + char **split; + + if (!s) + return (NULL); + split = malloc((countwords(s, c) + 1) * sizeof(char *)); + if (!split) + return (NULL); + i = 0; + ft_cpy(i, s, c, split); + return (split); +} diff --git a/swap.c b/swap.c new file mode 100644 index 0000000..ebf543c --- /dev/null +++ b/swap.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* swap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/12 05:35:56 by aortigos #+# #+# */ +/* Updated: 2024/08/12 05:47:04 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +static void swap(t_stack **stack) +{ + t_stack *tmp; + + if (!*stack || (*stack)->next == NULL) + return ; + tmp = *stack; + *stack = (*stack)->next; + tmp->next = (*stack)->next; + (*stack)->next = tmp; +} + +void ft_sa(t_stack **stack_a) +{ + swap(stack_a); + ft_putstr("sa\n"); +} + +void ft_sb(t_stack **stack_b) +{ + swap(stack_b); + ft_putstr("sb\n"); +} + +void ft_ss(t_stack **stack_a, t_stack **stack_b) +{ + swap(stack_a); + swap(stack_b); + ft_putstr("ss\n"); +} diff --git a/three_sort.c b/three_sort.c new file mode 100644 index 0000000..d62f74f --- /dev/null +++ b/three_sort.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* three_sort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/13 06:22:36 by aortigos #+# #+# */ +/* Updated: 2024/08/13 06:29:01 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +static int biggest_index(t_stack *stack) +{ + int index; + + index = stack->index; + while (stack) + { + if (stack->index > index) + index = stack->index; + stack = stack->next; + } + return (index); +} + +void three_sort(t_stack **stack) +{ + int biggest; + + if (is_sorted(*stack)) + return ; + biggest = biggest_index(*stack); + if ((*stack)->index == biggest) + ft_ra(stack); + else if ((*stack)->next->index == biggest) + ft_rra(stack); + if ((*stack)->index > (*stack)->next->index) + ft_sa(stack); +} diff --git a/utils.c b/utils.c new file mode 100644 index 0000000..667c5eb --- /dev/null +++ b/utils.c @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: aortigos +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/09 20:27:06 by aortigos #+# #+# */ +/* Updated: 2024/08/13 06:18:17 by aortigos ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +void free_stack(t_stack **stack) +{ + t_stack *tmp; + + if (!stack || !(*stack)) + return ; + while (*stack) + { + tmp = (*stack)->next; + free(*stack); + *stack = tmp; + } + *stack = NULL; +} + +void error_exit(t_stack **stack_a, t_stack **stack_b) +{ + if (stack_a == NULL || *stack_a != NULL) + free_stack(stack_a); + if (stack_b == NULL || *stack_b != NULL) + free_stack(stack_b); + write(2, "Error\n", 6); + exit(1); +} + +long int ft_atoi(const char *str) +{ + long int nb; + int neg; + int i; + + nb = 0; + i = 0; + neg = 1; + if (str[i] == '+') + i++; + else if (str[i] == '-') + { + neg *= -1; + i++; + } + while (str[i] >= '0' && str[i] <= '9') + { + nb = (nb * 10) + (str[i] - '0'); + i++; + } + return (nb * neg); +} + +void ft_putstr(char *str) +{ + int i; + + i = 0; + while (str[i]) + { + write(1, &str[i++], 1); + } +} + +int abs(int nb) +{ + if (nb < 0) + return (nb * -1); + return (nb); +}