]> git.dkaiser.de - 42/push_swap.git/commitdiff
Add optimization for double stack ops
authorDominik Kaiser <dominik@dominik-XPS.fritz.box>
Wed, 17 Apr 2024 07:53:13 +0000 (09:53 +0200)
committerDominik Kaiser <dominik@dominik-XPS.fritz.box>
Wed, 17 Apr 2024 07:53:13 +0000 (09:53 +0200)
Now RA and RB will be optimized to RR

cmd_optimization.c
main.c

index 2d93252eedc4c1b43647d16d58436f8215a097e4..83e20c0f5f2b6ceed68cc2a0921d4f1df0c8cf8a 100644 (file)
@@ -6,7 +6,11 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/13 16:42:34 by dkaiser           #+#    #+#             */
+<<<<<<< Updated upstream
 /*   Updated: 2024/04/13 17:31:18 by dkaiser          ###   ########.fr       */
+=======
+/*   Updated: 2024/04/17 09:41:10 by dkaiser          ###   ########.fr       */
+>>>>>>> Stashed changes
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -81,5 +85,47 @@ void optimize_commands(t_list **cmds)
         cur = last->next;
     }
     if (optimizations)
+<<<<<<< Updated upstream
         optimize_commands(cmds);
+=======
+        optimize_redundant(data, cmd1, cmd2);
+}
+
+static void optimize_two_stack_ops(t_psdata *data, enum e_pscmd cmd1, enum e_pscmd cmd2, enum e_pscmd new_cmd)
+{
+    t_list *cur;
+    t_list *last;
+    int optimizations;
+
+    cur = data->cmds;
+    last = cur;
+    optimizations = 0;
+
+    if (!cur)
+        return ;
+    while (cur && cur->next)
+    {
+        if ((get_cmd(cur) == cmd1 && get_cmd(cur->next) == cmd2) || (get_cmd(cur) == cmd2 && get_cmd(cur->next) == cmd1))
+        {
+            last->next = cur->next;
+            *(enum e_pscmd*)cur->next->content = new_cmd;
+            ft_lstdelone(cur, free);
+            optimizations++;
+        }
+        last = last->next;
+        if (last)
+            cur = last->next;
+        else
+            cur = NULL;
+    }
+    if (optimizations)
+        optimize_two_stack_ops(data, cmd1, cmd2, new_cmd);
+}
+
+void optimize_commands(t_psdata *data)
+{
+    optimize_redundant(data, PA, PB);
+    optimize_redundant(data, RB, RRB);
+    optimize_two_stack_ops(data, RA, RB, RR);
+>>>>>>> Stashed changes
 }
diff --git a/main.c b/main.c
index 803f6eb6b974e2369adab2a4c0cc8efab15c09f7..ed2a579e8f031bece65d71d0faf625557f728c76 100644 (file)
--- a/main.c
+++ b/main.c
@@ -6,7 +6,11 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/04/12 17:03:30 by dkaiser           #+#    #+#             */
+<<<<<<< Updated upstream
 /*   Updated: 2024/04/15 17:53:19 by dkaiser          ###   ########.fr       */
+=======
+/*   Updated: 2024/04/17 09:42:43 by dkaiser          ###   ########.fr       */
+>>>>>>> Stashed changes
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -25,6 +29,7 @@ int   main(int argc, char *argv[])
                ft_putendl_fd("Error", 2);
                return (1);
        }
+<<<<<<< Updated upstream
 
        stack_b = malloc(sizeof(t_stack));
        if (!stack_b)
@@ -45,5 +50,15 @@ int  main(int argc, char *argv[])
        stack_print(stack_a);
        ft_printf("B: ");
        stack_print(stack_b);
+=======
+       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); */
+>>>>>>> Stashed changes
        return (0);
 }