]> Untitled Git - axy/ft/pushswap.git/commitdiff
Nonworking changed some stuff
author= <=>
Mon, 15 Dec 2025 19:02:30 +0000 (20:02 +0100)
committer= <=>
Mon, 15 Dec 2025 19:02:30 +0000 (20:02 +0100)
_res_leaf_sort_lookup.h
algorithm_splitsort.c
leaf_sort.c
leaf_sort.h
leaf_sort_parse.c
ops_optimizer.c
pushswap.h

index 487d7d628cf464f094e4250afb8b7dde4f4cc587..ddae9f7baba659de12b62ed6015385b2d75acf1f 100644 (file)
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/10 16:53:22 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/12 13:22:56 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/15 20:00:41 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 /*
 
-ra
-ra ra
-sa ra ra
-ra ra ra
-ra sa ra ra
-sa ra ra ra
-pb sa ra pa ra ra
-sa ra sa ra ra
-pb sa ra ra pa ra
-ra ra ra ra
-ra ra sa ra ra
-ra sa ra ra ra
-ra pb sa ra pa ra ra
-ra sa ra sa ra ra
-ra pb sa ra ra pa ra
-sa ra ra ra ra
-sa ra ra sa ra ra
-pb sa ra pa ra ra ra
-pb pb sa ra pa pa ra ra ra
-sa pb sa ra ra ra pa ra
-pb pb ss ra pa ra ra pa ra
-sa ra sa ra ra ra
-pb ra sa ra pa ra ra
-pb sa ra ra pa ra ra
-pb pb sa ra pa ra pa ra ra
-pb sa ra sa ra pa ra ra
-pb pb sa ra ra pa pa ra ra
-pb ra ra ra pa ra
-pb ra sa ra ra pa ra
-pb sa ra ra ra pa ra
-pb pb sa ra pa ra ra pa ra
-pb sa ra sa ra ra pa ra
-pb pb sa ra ra pa ra pa ra
 
-pb
-sa pb pb
-pb pb
-sa pb sa pb sb pb
-sa pb sa pb pb
-pb sa pb sb pb
-sa pb pb pb
-pb sa pb pb
-pb pb pb
-sa pb rr sa pb pb rrr pb
-sa pb rr pb pb rrr pb
-pb pb ss rb pb sb pb rrb
-sa pb sa pb ss pb pb
-pb pb ss pb sb pb sb
-pb rb pb pb pb rrb
-pb rr sa pb pb rrr pb
-pb rr pb pb rrr pb
-sa pb pb rr pb sb rrr pb
-sa pb sa pb sb pb pb
-pb pb ss pb sb pb
-sa pb sa pb pb pb
-pb sa pb rr pb sb rrr pb
-pb sa pb ss pb pb
-pb pb rr pb sb rrr pb
-pb sa pb sb pb pb
-pb pb ss pb pb
-sa pb pb pb pb
-pb sa pb sa pb sb pb
-pb sa pb sa pb pb
-pb pb sa pb sb pb
-pb sa pb pb pb
-pb pb sa pb pb
-pb pb pb pb
+
+sa
+
+pb sa pa
+sa
+pb sa pa sa
+sa pb sa pa
+sa pb sa pa sa
+
+pb pb sa pa pa
+pb sa pa
+pb pb sa pa sa pa
+pb sa pb sa pa pa
+pb sa pb sa pa sa pa
+sa
+pb pb ss pa pa
+pb sa pa sa
+pb pb sa pa sa pa sa
+pb sa pb ss pa pa
+pb sa pb sa pa sa pa sa
+sa pb sa pa
+pb pb ss pa sa pa
+sa pb sa pa sa
+pb pb ss pa sa pa sa
+pb sa pb ss pa sa pa
+pb sa pb ss pa sa pa sa
+sa pb sa pb sa pa pa
+sa pb sa pb sa pa sa pa
+sa pb sa pb ss pa pa
+pb pb ss ra pa sa pa rra
+sa pb sa pb ss pa sa pa
+sa pb sa pb ss pa sa pa sa
+
+rra
+rra rra sa
+rra rra
+rra pb rra rra sa pa
+rra pb rra rra pa
+rra rra pb rra sa pa
+rra rra sa rra
+rra rra rra sa
+rra rra rra
+rra pb rra pb rra rra sa pa pa
+rra pb rra pb rra rra pa pa
+rra pb rra rra pb rra sa pa pa
+rra pb rra rra sa rra pa
+rra pb rra rra rra sa pa
+rra pb rra rra rra pa
+rra pb rra pb rra rra ss pa pa
+rra rra pb pb rra rra pa pa
+rra pb rra rra pb rra ss pa pa
+rra pb rra rra sa pa rra
+rra pb rra rra rra sa pa sa
+rra pb rra rra pa rra
+rra rra pb rra pb rra sa pa pa
+rra rra pb rra sa rra pa
+rra rra pb rra pb rra ss pa pa
+rra rra pb rra sa pa rra
+rra rra sa rra rra sa
+rra rra sa rra rra
+rra rra pb rra rra sa pa
+rra rra pb rra rra pa
+rra rra rra pb rra sa pa
+rra rra rra sa rra
+rra rra rra rra sa
+rra rra rra rra
+
+rra pb
+rra rra pb pb
+rra pb rra pb
+rra rra rra pb pb pb
+rra rra pb rra pb pb
+rra pb rra rra pb sb pb
+rra rra pb pb rra pb
+rra pb rra rra pb pb
+rra pb rra pb rra pb
+rra rra rra rra pb pb pb pb
+rra rra rra pb rra pb pb pb
+rra rra pb rra rra pb sb pb pb
+rra rra rra pb pb rra pb pb
+rra rra pb rra rra pb pb pb
+rra rra pb rra pb rra pb pb
+rra rra sa rra rra pb pb pb pb
+rra rra sa rra pb rra pb pb pb
+rra rra pb rra rra pb ss pb pb
+rra rra rra pb pb pb rra pb
+rra rra pb pb rra rra pb sb pb
+rra rra pb rra pb pb rra pb
+rra pb rra rra rra pb sb pb pb
+rra pb rb rra rra pb rrr pb pb
+rra pb rra rra rra pb ss pb pb
+rra pb rra rra pb sb pb rra pb
+rra rra pb pb rra rra pb pb
+rra rra pb pb rra pb rra pb
+rra pb rra rra rra pb pb pb
+rra pb rra rra pb rra pb pb
+rra pb rra pb rra rra pb sb pb
+rra pb rra rra pb pb rra pb
+rra pb rra pb rra rra pb pb
+rra pb rra pb rra pb rra pb
 */
index c34c645d6d6c8ae9d4041d5b44df46f43ef73ef2..12bbb8bac974368204544d37c2b8e66ac4e97d94 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/11 12:45:16 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/14 03:07:01 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/15 17:21:36 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -30,6 +30,8 @@ static t_iter iter_new(t_list range, size_t blocks, bool rev)
 {
        t_iter  res;
 
+       if (blocks > range.len)
+               blocks = range.len;
        res.range = range;
        res.blocks = blocks;
        res.rev = rev;
@@ -93,8 +95,10 @@ static void  splitsort_part_once(t_part self, t_splitsort sort, size_t count)
 {
        const t_stack   *src;
        t_psval                 val;
+       size_t                  rb;
 
        src = stacks_geta(sort.stacks, self.mirror);
+       rb = 0;
        while (count--)
        {
                if (self.rev)
@@ -103,18 +107,29 @@ static void       splitsort_part_once(t_part self, t_splitsort sort, size_t count)
                if (list_get_sorted(self.top, val) != -1)
                {
                        closure_callm(sort.cb, OP_PB, self.mirror);
-                       closure_callm(sort.cb, OP_RB, self.mirror);
+                       rb++;
+                       continue ;
                }
-               else if (list_get_sorted(self.bottom, val) != -1)
+               while (rb--)
+                       closure_callm(sort.cb, OP_RB, self.mirror);
+               rb = 0;
+               if (list_get_sorted(self.bottom, val) != -1)
                        closure_callm(sort.cb, OP_PB, self.mirror);
                else if (!self.rev)
                        closure_callm(sort.cb, OP_RA, self.mirror);
        }
+       while (rb--)
+               closure_callm(sort.cb, OP_RB, self.mirror);
 }
 
-// Parts range elements from stack a (which is in ascending order) onto stack b
-// in descending order
-static void    splitsort_part_a(t_splitsort sort, t_list range)
+typedef enum e_mode
+{
+       MODE_A,
+       MODE_A_WRAP,
+       MODE_B,
+}      t_mode;
+
+static void    splitsort_part(t_splitsort sort, t_list range, t_mode mode)
 {
        t_iter  topi;
        t_iter  bottomi;
@@ -122,13 +137,14 @@ static void       splitsort_part_a(t_splitsort sort, t_list range)
        size_t  top_count;
        size_t  bottom_count;
 
-       bottomi = iter_new(range, sort.blocks, true);
+       bottomi = iter_new(range, sort.blocks, mode == MODE_A);
        topi = iter_splitoff(&bottomi, sort.blocks / 2);
-       bottomi.rev = false;
+       bottomi.rev = mode == MODE_B;
+       topi.rev = !bottomi.rev;
        top_count = 0;
        bottom_count = 0;
        part.rev = false;
-       part.mirror = false;
+       part.mirror = mode == MODE_B;
        while (iter_nexti(&topi, &part.top) | iter_nexti(&bottomi, &part.bottom))
        {
                splitsort_part_once(part, sort, range.len - top_count - bottom_count);
@@ -136,63 +152,29 @@ static void       splitsort_part_a(t_splitsort sort, t_list range)
                top_count += part.top.len;
                bottom_count += part.bottom.len;
        }
-       while (top_count--)
-               closure_call(sort.cb, OP_RRB);
+       while (mode != MODE_A_WRAP && top_count--)
+               closure_callm(sort.cb, OP_RRB, mode == MODE_B);
+}
+
+// Parts range elements from stack a (which is in ascending order) onto stack b
+// in descending order
+static void    splitsort_part_a(t_splitsort sort, t_list range)
+{
+       splitsort_part(sort, range, MODE_A);
 }
 
 // Parts range elements from stack a (which is in ascending order) onto stack b
 // in descending order, assuming that stack b is initially empty
 static void    splitsort_part_a_wrap(t_splitsort sort, t_list range)
 {
-       t_iter  topi;
-       t_iter  bottomi;
-       t_part  part;
-       size_t  top_count;
-       size_t  bottom_count;
-
-       bottomi = iter_new(range, sort.blocks, false);
-       topi = iter_splitoff(&bottomi, sort.blocks / 2);
-       topi.rev = true;
-       top_count = 0;
-       bottom_count = 0;
-       part.rev = false;
-       part.mirror = false;
-       while (iter_nexti(&topi, &part.top) | iter_nexti(&bottomi, &part.bottom))
-       {
-               splitsort_part_once(part, sort, range.len - top_count - bottom_count);
-               part.rev = !part.rev;
-               top_count += part.top.len;
-               bottom_count += part.bottom.len;
-       }
+       splitsort_part(sort, range, MODE_A_WRAP);
 }
 
-
 // Parts range elements from stack b (which is in descending order) onto stack
 // a in ascending order
 static void    splitsort_part_b(t_splitsort sort, t_list range)
 {
-       t_iter  topi;
-       t_iter  bottomi;
-       t_part  part;
-       size_t  top_count;
-       size_t  bottom_count;
-
-       bottomi = iter_new(range, sort.blocks, false);
-       topi = iter_splitoff(&bottomi, sort.blocks / 2);
-       bottomi.rev = true;
-       top_count = 0;
-       bottom_count = 0;
-       part.rev = false;
-       part.mirror = true;
-       while (iter_nexti(&topi, &part.top) | iter_nexti(&bottomi, &part.bottom))
-       {
-               splitsort_part_once(part, sort, range.len - top_count - bottom_count);
-               part.rev = !part.rev;
-               top_count += part.top.len;
-               bottom_count += part.bottom.len;
-       }
-       while (top_count--)
-               closure_call(sort.cb, OP_RRA);
+       splitsort_part(sort, range, MODE_B);
 }
 
 typedef void (t_layer_func) (t_splitsort, t_list);
@@ -242,9 +224,7 @@ static void splitsort_visit_layer(t_visit self, t_splitsort sort)
        t_iter  iter;
 
        if (self.depth == 0)
-       {
                return (self.cb(sort, self.range));
-       }
        self.depth--;
        iter = iter_new(self.range, sort.blocks, self.rev);
        while (iter_nexti(&iter, &self.range))
@@ -266,12 +246,14 @@ void      test_splitsort(const t_stacks *stacks, t_closure cb)
 {
        t_splitsort     sort;
        t_list          range;
+       size_t          i;
 
        sort.stacks = stacks;
        sort.cb = cb;
        sort.blocks = 5;
        range = list_new(stacks->a);
        list_sort(range);
-       for (size_t i = 0; i < 4; i++)
-               splitsort_part_layer(sort, range, i);
+       i = 0;
+       while (!stacks_is_solved(stacks))
+               splitsort_part_layer(sort, range, i++);
 }
index 2b5f58647b2c5a9534193237e29ca19008c7e7e6..f3181a045b535d17dc450a884dc8f0ca0f1d2317 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: agilliar <agilliar@student.42mulhouse.fr>  +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/11 00:27:32 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/12 12:27:42 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/15 16:44:54 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
index a634885d604c5649263f9cacfd7937aece9179fd..0285393f2611a28bde746d73f31398c23853fbca 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/10 18:01:04 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/11 00:51:37 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/15 20:02:17 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -34,8 +34,9 @@ typedef struct s_leaf_lookup
 
 typedef struct s_leaf_lookups
 {
-       t_leaf_lookup   local;
-       t_leaf_lookup   other;
+       t_leaf_lookup   top_a_top_a;
+       t_leaf_lookup   bot_a_top_a;
+       t_leaf_lookup   bot_b_top_a;
 }      t_leaf_lookups;
 
 extern void            _binary__build_leaf_sort_lookup_res_start(void);
index 2afd7290e415ab05bcca7e36ad522e126d6f0796..07575a586100b466db6d1dc665b9f335955a077e 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/10 17:59:06 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/10 19:15:53 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/15 20:01:31 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -59,8 +59,9 @@ static t_leaf_lookups leaf_lookups_parse(t_slice iter)
 {
        t_leaf_lookups  res;
 
-       res.local = leaf_lookup_parse(&iter);
-       res.other = leaf_lookup_parse(&iter);
+       res.top_a_top_a = leaf_lookup_parse(&iter);
+       res.bot_a_top_a = leaf_lookup_parse(&iter);
+       res.bot_b_top_a = leaf_lookup_parse(&iter);
        if (iter.len)
                cheatexit(1);
        return (res);
index 4389deb4e2bfabdc49791f82c480caebcbda1cfb..6181157b16e1c3e0d01a3d5d0579b148c65b2ab2 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/08 17:54:20 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/11 19:46:02 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/15 17:21:43 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -19,6 +19,13 @@ static void  op_optimizer_inner(t_op_optimizer *data, t_stacks *stacks)
 {
        t_closure       cb;
 
+       cb = data->opt->commit.ops[data->op];
+       if (data->op == OP_SA || data->op == OP_SB || data->op == OP_SS
+               || data->op == OP_PA || data->op == OP_PB)
+       {
+               ops_optimizer_commit(data->opt, stacks);
+               (cb.func)(cb.data, stacks);
+       }
        if (data->op == OP_RA || data->op == OP_RR)
                data->opt->a++;
        if (data->op == OP_RB || data->op == OP_RR)
@@ -27,13 +34,6 @@ static void  op_optimizer_inner(t_op_optimizer *data, t_stacks *stacks)
                data->opt->a--;
        if (data->op == OP_RRB || data->op == OP_RRR)
                data->opt->b--;
-       if (data->op == OP_SA || data->op == OP_SB || data->op == OP_SS
-               || data->op == OP_PA || data->op == OP_PB)
-       {
-               ops_optimizer_commit(data->opt, stacks);
-               cb = data->opt->commit.ops[data->op];
-               (cb.func)(cb.data, stacks);
-       }
 }
 
 static t_closure       op_optimizer(t_optimizer *opt, t_op op)
@@ -95,18 +95,10 @@ void        ops_optimizer_commit(t_optimizer *data, t_stacks *stacks)
        t_closure       cb;
 
        cb = data->commit.ops[OP_RR];
-       while (data->a > 0 && data->b > 0)
-       {
-               data->a--;
-               data->b--;
+       while (data->a > 0 && data->b > 0 && data->a-- && data->b--)
                (cb.func)(cb.data, stacks);
-       }
        cb = data->commit.ops[OP_RRR];
-       while (data->a < 0 && data->b < 0)
-       {
-               data->a++;
-               data->b++;
+       while (data->a < 0 && data->b < 0 && data->a++ && data->b++)
                (cb.func)(cb.data, stacks);
-       }
        ops_optimizer_commit_end(data, stacks);
 }
index 275ab316b0dd80e9451e43215351f72b1ccaeca8..0133b6bba27d729df5edff93ee8b4edd3ec03f5e 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: clefrere <clefrere@student.42.fr>          +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/02 11:02:44 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/11 19:45:26 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/15 13:46:49 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */