summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile3
-rw-r--r--cmd_optimization.c6
-rw-r--r--main.c22
-rw-r--r--push_swap.h6
-rw-r--r--sorting.c78
5 files changed, 24 insertions, 91 deletions
diff --git a/Makefile b/Makefile
index 4ae0b74..ebdd948 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,8 @@ LIBFT = libft
CC = cc
CFLAGS = -Wall -Wextra -Werror
-SRC_FILES = main.c input_handling.c stack_utils.c command_handling.c sorting.c stack_optimization.c cmd_optimization.c
+SRC_FILES = main.c input_handling.c stack_utils.c command_handling.c \
+ sorting.c sorting_utils.c stack_optimization.c cmd_optimization.c
OBJ_FILES = $(SRC_FILES:%.c=%.o)
LIB_DIR = $(LIBFT)
diff --git a/cmd_optimization.c b/cmd_optimization.c
index 41d1c08..90f0339 100644
--- a/cmd_optimization.c
+++ b/cmd_optimization.c
@@ -6,7 +6,7 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/13 16:42:34 by dkaiser #+# #+# */
-/* Updated: 2024/04/24 10:58:14 by dkaiser ### ########.fr */
+/* Updated: 2024/04/24 13:11:45 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
@@ -32,8 +32,6 @@ static void optimize_redundant(t_psdata *data, enum e_pscmd cmd1,
cur = data->cmds;
last = cur;
optimizations = 0;
- if (!cur)
- return ;
while (cur && cur->next)
{
if ((get_cmd(cur) == cmd1 && get_cmd(cur->next) == cmd2)
@@ -64,8 +62,6 @@ static void optimize_two_stack_ops(t_psdata *data, enum e_pscmd cmd1,
cur = data->cmds;
last = cur;
optimizations = 0;
- if (!cur)
- return ;
while (cur && cur->next)
{
if ((get_cmd(cur) == cmd1 && get_cmd(cur->next) == cmd2)
diff --git a/main.c b/main.c
index 6406ffc..6891d88 100644
--- a/main.c
+++ b/main.c
@@ -6,7 +6,7 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/12 17:03:30 by dkaiser #+# #+# */
-/* Updated: 2024/04/24 10:58:59 by dkaiser ### ########.fr */
+/* Updated: 2024/04/24 14:31:46 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
@@ -69,13 +69,17 @@ int main(int argc, char *argv[])
ft_putendl_fd("Error", 2);
return (1);
}
- stack_optimize(data->a);
- stack_sort(data);
- optimize_commands(data);
- print_commands(data->cmds);
- /* ft_printf("\nA: "); */
- /* stack_print(data->a); */
- /* ft_printf("B: "); */
- /* stack_print(data->b); */
+ if (!is_sorted(data->a))
+ {
+ stack_optimize(data->a);
+ stack_sort(data);
+ if (!is_sorted(data->a) || data->b->size)
+ {
+ ft_putendl_fd("Error", 2);
+ return (1);
+ }
+ optimize_commands(data);
+ print_commands(data->cmds);
+ }
return (0);
}
diff --git a/push_swap.h b/push_swap.h
index d3dcbaa..e9918e6 100644
--- a/push_swap.h
+++ b/push_swap.h
@@ -6,7 +6,7 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/12 16:59:09 by dkaiser #+# #+# */
-/* Updated: 2024/04/24 10:59:05 by dkaiser ### ########.fr */
+/* Updated: 2024/04/24 14:28:04 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
@@ -59,5 +59,9 @@ int stack_optimize(t_stack *stack);
void optimize_commands(t_psdata *data);
void stack_sort(t_psdata *data);
+int is_sorted(t_stack *stack);
+int calculate_score(t_psdata *data, int pos);
+void move_to_top(t_psdata *data, int idx);
+void move_to_spot(t_psdata *data, int idx);
#endif // PUSH_SWAP_H
diff --git a/sorting.c b/sorting.c
index c7522eb..aa27f55 100644
--- a/sorting.c
+++ b/sorting.c
@@ -6,7 +6,7 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/13 15:04:19 by dkaiser #+# #+# */
-/* Updated: 2024/04/24 10:58:02 by dkaiser ### ########.fr */
+/* Updated: 2024/04/24 13:48:31 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
@@ -38,79 +38,6 @@ static void presort(t_psdata *data)
}
}
-static int calculate_score(t_psdata *data, int pos)
-{
- int moves_to_top;
- int moves_to_spot;
- int i;
-
- if (pos < (data->b->size + 1) / 2)
- moves_to_top = pos;
- else
- moves_to_top = data->b->size - pos;
- i = 0;
- while (i < data->a->size && data->a->stack[i] > data->b->stack[pos])
- i++;
- if (i < (data->a->size + 1) / 2)
- moves_to_spot = 2 * i + 1;
- else
- moves_to_spot = 2 * ((data->a->size - i) + 1);
- return (moves_to_top + moves_to_spot);
-}
-
-static void move_to_top(t_psdata *data, int idx)
-{
- if (idx < (data->b->size + 1) / 2)
- {
- while (--idx > 0)
- run_command(data, RB);
- }
- else
- {
- idx = data->b->size - idx;
- while (idx--)
- run_command(data, RRB);
- }
-}
-
-static void move_to_spot(t_psdata *data, int idx)
-{
- int pos;
- int i;
-
- pos = 0;
- while (pos < data->a->size && data->b->stack[0] > data->a->stack[pos])
- pos++;
- if (pos >= data->a->size)
- {
- move_to_top(data, idx);
- run_command(data, PA);
- run_command(data, RA);
- }
- else if (pos < (data->a->size + 1) / 2)
- {
- i = pos;
- while (i--)
- run_command(data, RA);
- move_to_top(data, idx);
- run_command(data, PA);
- i = pos;
- while (i--)
- run_command(data, RRA);
- }
- else
- {
- i = data->a->size - pos;
- while (i--)
- run_command(data, RRA);
- move_to_top(data, idx);
- run_command(data, PA);
- i = data->a->size - pos;
- while (i--)
- run_command(data, RA);
- }
-}
-
static void scoresort(t_psdata *data)
{
int *scores;
@@ -118,7 +45,8 @@ static void scoresort(t_psdata *data)
int min_score;
scores = malloc(sizeof(int) * data->b->size);
- // Error if allocation fails
+ if (!scores)
+ return ;
i = 0;
while (i < data->b->size)
{