]> git.dkaiser.de - 42/push_swap.git/commitdiff
Add some optimization
authorDominik Kaiser <dominik@dominik-XPS.fritz.box>
Tue, 16 Apr 2024 11:16:20 +0000 (13:16 +0200)
committerDominik Kaiser <dominik@dominik-XPS.fritz.box>
Tue, 16 Apr 2024 11:16:20 +0000 (13:16 +0200)
cmd_optimization.c
command_handling.c
main.c
sorting.c

index 0c5913dd398bf6a4a25c2a7755e078c0d641a58b..63be895526c98205a8a5fcba2db6ee2b87587675 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/13 16:42:34 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/04/16 10:32:28 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/04/16 13:15:34 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -22,7 +22,7 @@ static enum e_pscmd get_cmd(t_list *cmd)
         return NO_CMD;
 }
 
-void optimize_commands(t_psdata *data)
+static void optimize_redundant_pushes(t_psdata *data)
 {
     t_list *cur;
     t_list *last;
@@ -45,5 +45,67 @@ void optimize_commands(t_psdata *data)
         cur = last->next;
     }
     if (optimizations)
-        optimize_commands(data);
+        optimize_redundant_pushes(data);
+}
+
+static void fake_command(t_psdata *data, enum e_pscmd cmd)
+{
+    if (cmd == PA)
+    {
+        data->a->size++;
+        data->b->size--;
+    }
+    else if (cmd == PB)
+    {
+        data->a->size--;
+        data->b->size++;
+    }
+}
+
+static void optimize_rotate(t_psdata *data)
+{
+    t_list *cur;
+    t_list *last_before;
+    t_list *first_after;
+    enum e_pscmd *cmd;
+    int i;
+
+    cur = data->cmds;
+    while(cur)
+    {
+        if (get_cmd(cur->next) == RA)
+        {
+            last_before = cur;
+            cur = cur->next;
+            i = 0;
+            while (cur && get_cmd(cur) == RA)
+            {
+                i++;
+                cur = cur->next;
+            }
+            first_after = cur;
+            if (i >= (data->a->size - 1) / 2)
+            {
+                cmd = malloc(sizeof(enum e_pscmd));
+                *cmd = RRA;
+                cur = last_before->next;
+                while (i < data->a->size)
+                {
+                    cur->next = ft_lstnew(cmd);
+                    cur = cur->next;
+                    i++;
+                }
+                cur->next = first_after;
+                ft_printf("i: %d\n", i);
+            }
+        }
+        fake_command(data, get_cmd(cur));
+        cur = cur->next;
+    }
+}
+
+void optimize_commands(t_psdata *data)
+{
+    optimize_redundant_pushes(data);
+    optimize_rotate(data);
 }
index 0b5f335c7e6e83cbc650a3bc8b72554ce83671e7..4f7c79562dfecd1b75c764a5daad9e56fb4e3bff 100644 (file)
@@ -6,10 +6,11 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/13 14:38:47 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/04/16 09:27:41 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/04/16 12:12:48 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
+#include "libft/libft.h"
 #include "push_swap.h"
 
 static int     add_cmd_to_queue(t_list **cmds, enum e_pscmd cmd)
@@ -92,6 +93,8 @@ static void   print_cmd(void *ptr_cmd)
                ft_putendl_fd("rrb", 1);
        else if (cmd == RRR)
                ft_putendl_fd("rrr", 1);
+       else
+               ft_putendl_fd("NO CMD", 1);
 }
 
 void   print_commands(t_list *cmds)
diff --git a/main.c b/main.c
index 0087dc7ba03d043f5a7d74b78a758809a63bd6b2..617e014b40a5e01d2579f1fb5490fb27bbdf2bc0 100644 (file)
--- 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/16 10:31:48 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/04/16 12:36:10 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -73,9 +73,9 @@ int   main(int argc, char *argv[])
        stack_sort(data);
        optimize_commands(data);
        print_commands(data->cmds);
-       ft_printf("\nA: ");
-       stack_print(data->a);
-       ft_printf("B: ");
-       stack_print(data->b);
+       /* ft_printf("\nA: "); */
+       /* stack_print(data->a); */
+       /* ft_printf("B: "); */
+       /* stack_print(data->b); */
        return (0);
 }
index feae530d1702e79a8d13d3469663b820299b6194..8012176e1bc34fc174f5859d5e368e9e57a4e69a 100644 (file)
--- 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/16 09:55:31 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/04/16 11:20:43 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -44,9 +44,9 @@ void stack_sort(t_psdata *data)
 
         while (data->a->size > 0 && data->a->stack[0] != pivot)
         {
-            if (data->a->stack[0] > pivot)
+            if (data->a->size > 1 && data->a->stack[0] > pivot)
                 run_command(data, RA);
-            else
+            else if (data->a->size > 0)
                 run_command(data, PB);
         }
         while (data->b->size > 0)