aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-01-19 14:21:53 +0100
committerCharles <sircharlesaze@gmail.com>2020-01-19 14:21:53 +0100
commit6be6c78c8856b14c19a1958dfa3993cc0ced1b3f (patch)
tree68871b12df49d623dda8cfcbda0da810045608e4 /src
parent2b4327b7a448228f67a054b4bdaa3f84b9db2164 (diff)
downloadpush_swap-6be6c78c8856b14c19a1958dfa3993cc0ced1b3f.tar.gz
push_swap-6be6c78c8856b14c19a1958dfa3993cc0ced1b3f.tar.bz2
push_swap-6be6c78c8856b14c19a1958dfa3993cc0ced1b3f.zip
Added stack operation visualizer, random stack generator, quick sort of some sort (WIP)
Diffstat (limited to 'src')
-rw-r--r--src/checker/check.c12
-rw-r--r--src/checker/checker.h10
-rw-r--r--src/checker/main.c34
-rw-r--r--src/common/common.h58
-rw-r--r--src/common/parse.c49
-rw-r--r--src/common/stack_core.c3
-rw-r--r--src/push_swap/main.c45
-rw-r--r--src/push_swap/push_swap.h29
-rw-r--r--src/push_swap/sort.c61
-rw-r--r--src/push_swap/stack_wrapper.c40
10 files changed, 275 insertions, 66 deletions
diff --git a/src/checker/check.c b/src/checker/check.c
index 125fdb7..bbe509f 100644
--- a/src/checker/check.c
+++ b/src/checker/check.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/18 10:16:08 by cacharle #+# #+# */
-/* Updated: 2020/01/19 07:11:05 by cacharle ### ########.fr */
+/* Updated: 2020/01/19 09:02:08 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -48,8 +48,8 @@ static t_action g_actions[] = {
{"sa", FLAG_ARG_A, {.arg_1 = &stack_swap}},
{"sb", FLAG_ARG_B, {.arg_1 = &stack_swap}},
{"ss", FLAG_ARG_A_B, {.arg_2 = &stack_swap_2}},
- {"pa", FLAG_ARG_A_B, {.arg_2 = &stack_push_to}},
- {"pb", FLAG_ARG_B_A, {.arg_2 = &stack_push_to}},
+ {"pa", FLAG_ARG_B_A, {.arg_2 = &stack_push_to}},
+ {"pb", FLAG_ARG_A_B, {.arg_2 = &stack_push_to}},
{"ra", FLAG_ARG_A, {.arg_1 = &stack_rotate}},
{"rb", FLAG_ARG_B, {.arg_1 = &stack_rotate}},
{"rr", FLAG_ARG_A_B, {.arg_2 = &stack_rotate_2}},
@@ -89,9 +89,9 @@ t_bool stack_sorted(t_stack *stack)
if (stack_length(stack) < 2)
return (TRUE);
- i = -1;
- while (++i < stack->top)
- if (stack->elements[i] > stack->elements[i + 1])
+ i = stack->top + 1;
+ while (--i > 0)
+ if (stack->elements[i] > stack->elements[i - 1])
return (FALSE);
return (TRUE);
}
diff --git a/src/checker/checker.h b/src/checker/checker.h
index 877f669..808e408 100644
--- a/src/checker/checker.h
+++ b/src/checker/checker.h
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/18 10:16:12 by cacharle #+# #+# */
-/* Updated: 2020/01/19 06:30:04 by cacharle ### ########.fr */
+/* Updated: 2020/01/19 09:09:29 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include <stdio.h>
@@ -22,14 +22,6 @@
typedef enum
{
- STATUS_SUCCESS,
- STATUS_FAILURE,
- STATUS_ERROR,
- STATUS_EOF,
-} t_status;
-
-typedef enum
-{
FLAG_ARG_A,
FLAG_ARG_B,
FLAG_ARG_A_B,
diff --git a/src/checker/main.c b/src/checker/main.c
index 3b4b313..a0a08b2 100644
--- a/src/checker/main.c
+++ b/src/checker/main.c
@@ -6,26 +6,12 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/18 10:16:14 by cacharle #+# #+# */
-/* Updated: 2020/01/19 08:37:03 by cacharle ### ########.fr */
+/* Updated: 2020/01/19 09:08:41 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "checker.h"
-t_status has_dup(int *xs, size_t size)
-{
- int *tmp;
- t_status ret;
-
- if ((tmp = (int*)malloc(size * sizeof(int))) == NULL)
- return (STATUS_ERROR);
- ft_memcpy(tmp, xs, size * sizeof(int));
- ret = ft_is_set(tmp, size, sizeof(int), &ft_compar_int) ?
- STATUS_SUCCESS : STATUS_FAILURE;
- free(tmp);
- return (ret);
-}
-
int main(int argc, char **argv)
{
t_status s;
@@ -36,24 +22,8 @@ int main(int argc, char **argv)
return (0);
if ((a = stack_new(argc - 1)) == NULL)
return (1);
- while (--argc >= 1)
- {
- errno = 0;
- stack_push(a, ft_strict_atoi(argv[argc]));
- if (errno != 0)
- {
- ft_putendl_fd("Error", STDERR_FILENO);
- stack_destroy(a);
- return (1);
- }
- }
-
- if (has_dup(a->elements, stack_length(a)) != STATUS_SUCCESS)
- {
- ft_putendl_fd("Error", STDERR_FILENO);
- stack_destroy(a);
+ if (parse(argc, argv, a) != STATUS_SUCCESS)
return (1);
- }
if ((b = stack_new(stack_length(a))) == NULL)
{
stack_destroy(a);
diff --git a/src/common/common.h b/src/common/common.h
index 0cfd687..97881c8 100644
--- a/src/common/common.h
+++ b/src/common/common.h
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/18 11:20:54 by cacharle #+# #+# */
-/* Updated: 2020/01/19 06:43:24 by cacharle ### ########.fr */
+/* Updated: 2020/01/19 13:31:27 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include <stdio.h>
@@ -17,39 +17,61 @@
#include <stdlib.h>
#include "libft.h"
+typedef enum
+{
+ STATUS_SUCCESS,
+ STATUS_FAILURE,
+ STATUS_ERROR,
+ STATUS_EOF,
+} t_status;
+
+typedef enum
+{
+ STACK_NO_TAG,
+ STACK_A,
+ STACK_B
+} t_stack_tag;
+
typedef struct
{
- int *elements;
- int top;
-} t_stack;
+ int *elements;
+ t_stack_tag tag;
+ int top;
+} t_stack;
/*
** stack_core.c
*/
-t_stack *stack_new(int size);
-void stack_destroy(t_stack *stack);
-void stack_push(t_stack *stack, int n);
-void stack_pop(t_stack *stack);
-int stack_peek(t_stack *stack);
+t_stack *stack_new(int size);
+void stack_destroy(t_stack *stack);
+void stack_push(t_stack *stack, int n);
+void stack_pop(t_stack *stack);
+int stack_peek(t_stack *stack);
/*
** stack_op.c
*/
-void stack_swap(t_stack *stack);
-void stack_push_to(t_stack *from, t_stack *to);
-void stack_rotate(t_stack *stack);
-void stack_reverse_rotate(t_stack *stack);
+void stack_swap(t_stack *stack);
+void stack_push_to(t_stack *from, t_stack *to);
+void stack_rotate(t_stack *stack);
+void stack_reverse_rotate(t_stack *stack);
/*
** stack_helper.c
*/
-void stack_swap_2(t_stack *stack_a, t_stack *stack_b);
-void stack_rotate_2(t_stack *stack_a, t_stack *stack_b);
-void stack_reverse_rotate_2(t_stack *stack_a, t_stack *stack_b);
-t_bool stack_empty(t_stack *stack);
-int stack_length(t_stack *stack);
+void stack_swap_2(t_stack *stack_a, t_stack *stack_b);
+void stack_rotate_2(t_stack *stack_a, t_stack *stack_b);
+void stack_reverse_rotate_2(t_stack *stack_a, t_stack *stack_b);
+t_bool stack_empty(t_stack *stack);
+int stack_length(t_stack *stack);
+
+/*
+** parse.c
+*/
+
+t_status parse(int argc, char **argv, t_stack *a);
#endif
diff --git a/src/common/parse.c b/src/common/parse.c
new file mode 100644
index 0000000..b0415cd
--- /dev/null
+++ b/src/common/parse.c
@@ -0,0 +1,49 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* parse.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/01/19 09:03:28 by cacharle #+# #+# */
+/* Updated: 2020/01/19 13:33:17 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "common.h"
+
+static t_status has_dup(int *xs, size_t size)
+{
+ int *tmp;
+ t_status ret;
+
+ if ((tmp = (int*)malloc(size * sizeof(int))) == NULL)
+ return (STATUS_ERROR);
+ ft_memcpy(tmp, xs, size * sizeof(int));
+ ret = ft_is_set(tmp, size, sizeof(int), &ft_compar_int) ?
+ STATUS_SUCCESS : STATUS_FAILURE;
+ free(tmp);
+ return (ret);
+}
+
+t_status parse(int argc, char **argv, t_stack *a)
+{
+ while (--argc >= 1)
+ {
+ errno = 0;
+ stack_push(a, ft_strict_atoi(argv[argc]));
+ if (errno != 0)
+ {
+ ft_putendl_fd("Error", STDERR_FILENO);
+ stack_destroy(a);
+ return (STATUS_FAILURE);
+ }
+ }
+ if (has_dup(a->elements, stack_length(a)) != STATUS_SUCCESS)
+ {
+ ft_putendl_fd("Error", STDERR_FILENO);
+ stack_destroy(a);
+ return (STATUS_FAILURE);
+ }
+ return (STATUS_SUCCESS);
+}
diff --git a/src/common/stack_core.c b/src/common/stack_core.c
index 6875862..bf766d4 100644
--- a/src/common/stack_core.c
+++ b/src/common/stack_core.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/19 06:37:45 by cacharle #+# #+# */
-/* Updated: 2020/01/19 06:50:50 by cacharle ### ########.fr */
+/* Updated: 2020/01/19 13:33:08 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -24,6 +24,7 @@ t_stack *stack_new(int size)
return (NULL);
}
stack->top = -1;
+ stack->tag = STACK_NO_TAG;
return (stack);
}
diff --git a/src/push_swap/main.c b/src/push_swap/main.c
index 5019e79..b97feb3 100644
--- a/src/push_swap/main.c
+++ b/src/push_swap/main.c
@@ -1,4 +1,49 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* main.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/01/19 09:09:59 by cacharle #+# #+# */
+/* Updated: 2020/01/19 13:37:26 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "push_swap.h"
+
int main(int argc, char **argv)
{
+ t_stack *a;
+ t_stack *b;
+
+ if (argc == 1)
+ return (0);
+ if ((a = stack_new(argc - 1)) == NULL)
+ return (1);
+ if (parse(argc, argv, a) != STATUS_SUCCESS)
+ return (1);
+ if ((b = stack_new(stack_length(a))) == NULL)
+ {
+ stack_destroy(a);
+ return (1);
+ }
+
+ a->tag = STACK_A;
+ b->tag = STACK_B;
+
+ push_swap_qsort(a, b);
+ /* push_swap_qsort(a, b); */
+ /* push_swap_qsort(a, b); */
+ /* push_swap_qsort(a, b); */
+ /* push_swap_qsort(a, b); */
+
+ /* printf("\na: "); */
+ /* stack_print(a); */
+ /* printf("b: "); */
+ /* stack_print(b); */
+
+ stack_destroy(a);
+ stack_destroy(b);
return 0;
}
diff --git a/src/push_swap/push_swap.h b/src/push_swap/push_swap.h
index 0e553e0..e22fa9a 100644
--- a/src/push_swap/push_swap.h
+++ b/src/push_swap/push_swap.h
@@ -1,4 +1,33 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* push_swap.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/01/19 09:10:11 by cacharle #+# #+# */
+/* Updated: 2020/01/19 13:16:06 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
#ifndef PUSH_SWAP_H
# define PUSH_SWAP_H
+# include "libft.h"
+# include "common.h"
+
+/*
+** sort.c
+*/
+
+void push_swap_sort(t_stack *main, t_stack *tmp);
+
+/*
+** stack_wrapper.c
+*/
+
+void stack_swap_print(t_stack *stack);
+void stack_rotate_print(t_stack *stack);
+void stack_push_to_print(t_stack *from, t_stack *to);
+
#endif
diff --git a/src/push_swap/sort.c b/src/push_swap/sort.c
new file mode 100644
index 0000000..e1e738e
--- /dev/null
+++ b/src/push_swap/sort.c
@@ -0,0 +1,61 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* sort.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/01/19 09:12:02 by cacharle #+# #+# */
+/* Updated: 2020/01/19 13:45:37 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "push_swap.h"
+
+/*
+ * pivot == stack top
+ * push pivot to B
+ * iterate over current partition and push < pivot onto B
+ *
+ *
+ *
+ */
+
+void stack_print(t_stack *stack)
+{
+ printf("> ");
+ for (int i = 0; i <= stack->top; i++)
+ printf("%2d | ", stack->elements[i]);
+ printf("\n");
+}
+
+void push_swap_qsort(t_stack *main, t_stack *tmp)
+{
+ int pivot;
+
+ if (stack_length(main) < 2) // if empty or one element, sorted
+ return ;
+ if (stack_length(main) == 2) // if 2 elements and wrong order, swap then sorted
+ {
+ if (stack_peek(main) > main->elements[0])
+ stack_swap_print(main);
+ return ;
+ }
+
+ pivot = stack_peek(main); // get pivot
+ stack_rotate_print(main); // hide pivot
+ while (stack_peek(main) != pivot) // iterate over every element that was bellow pivot in the stack
+ {
+ if (stack_peek(main) < pivot) // if lower than pivot, place it on tmp
+ stack_push_to_print(main, tmp);
+ else // else pass it
+ stack_rotate_print(main);
+ }
+ // main contain all > pivot and the pivot hiself,
+ // tmp contain all < pivot
+ push_swap_qsort(tmp, main); // sort the sub stack tmp
+ stack_push_to_print(main, tmp); // pass the pivot to tmp which is already sorted to sort sub stack main
+ push_swap_qsort(main, tmp); // sort main sub stack
+ while (!stack_empty(tmp)) // push all tmp stack on stack main
+ stack_push_to_print(tmp, main);
+}
diff --git a/src/push_swap/stack_wrapper.c b/src/push_swap/stack_wrapper.c
new file mode 100644
index 0000000..df44e23
--- /dev/null
+++ b/src/push_swap/stack_wrapper.c
@@ -0,0 +1,40 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* stack_wrapper.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/01/19 13:05:58 by cacharle #+# #+# */
+/* Updated: 2020/01/19 13:17:18 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "push_swap.h"
+
+void stack_swap_print(t_stack *stack)
+{
+ if (stack->tag == STACK_A)
+ ft_putendl("sa");
+ if (stack->tag == STACK_B)
+ ft_putendl("sb");
+ stack_swap(stack);
+}
+
+void stack_rotate_print(t_stack *stack)
+{
+ if (stack->tag == STACK_A)
+ ft_putendl("ra");
+ if (stack->tag == STACK_B)
+ ft_putendl("rb");
+ stack_rotate(stack);
+}
+
+void stack_push_to_print(t_stack *from, t_stack *to)
+{
+ if (to->tag == STACK_A)
+ ft_putendl("pa");
+ if (to->tag == STACK_B)
+ ft_putendl("pb");
+ stack_push_to(from, to);
+}