From 565a5fc6dd024586fd73b71633f614cedd2cd89f Mon Sep 17 00:00:00 2001 From: = <=> Date: Mon, 15 Dec 2025 20:02:30 +0100 Subject: [PATCH] Nonworking changed some stuff --- _res_leaf_sort_lookup.h | 168 ++++++++++++++++++++++++---------------- algorithm_splitsort.c | 98 ++++++++++------------- leaf_sort.c | 2 +- leaf_sort.h | 7 +- leaf_sort_parse.c | 7 +- ops_optimizer.c | 28 +++---- pushswap.h | 2 +- 7 files changed, 161 insertions(+), 151 deletions(-) diff --git a/_res_leaf_sort_lookup.h b/_res_leaf_sort_lookup.h index 487d7d6..ddae9f7 100644 --- a/_res_leaf_sort_lookup.h +++ b/_res_leaf_sort_lookup.h @@ -6,77 +6,111 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 */ diff --git a/algorithm_splitsort.c b/algorithm_splitsort.c index c34c645..12bbb8b 100644 --- a/algorithm_splitsort.c +++ b/algorithm_splitsort.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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++); } diff --git a/leaf_sort.c b/leaf_sort.c index 2b5f586..f3181a0 100644 --- a/leaf_sort.c +++ b/leaf_sort.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 */ /* */ /* ************************************************************************** */ diff --git a/leaf_sort.h b/leaf_sort.h index a634885..0285393 100644 --- a/leaf_sort.h +++ b/leaf_sort.h @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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); diff --git a/leaf_sort_parse.c b/leaf_sort_parse.c index 2afd729..07575a5 100644 --- a/leaf_sort_parse.c +++ b/leaf_sort_parse.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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); diff --git a/ops_optimizer.c b/ops_optimizer.c index 4389deb..6181157 100644 --- a/ops_optimizer.c +++ b/ops_optimizer.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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); } diff --git a/pushswap.h b/pushswap.h index 275ab31..0133b6b 100644 --- a/pushswap.h +++ b/pushswap.h @@ -6,7 +6,7 @@ /* By: clefrere +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 */ /* */ /* ************************************************************************** */ -- 2.51.0