/* 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
*/
/* 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 */
/* */
/* ************************************************************************** */
{
t_iter res;
+ if (blocks > range.len)
+ blocks = range.len;
res.range = range;
res.blocks = blocks;
res.rev = rev;
{
const t_stack *src;
t_psval val;
+ size_t rb;
src = stacks_geta(sort.stacks, self.mirror);
+ rb = 0;
while (count--)
{
if (self.rev)
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;
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);
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);
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))
{
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++);
}
/* 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 */
/* */
/* ************************************************************************** */
/* 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 */
/* */
/* ************************************************************************** */
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);
/* 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 */
/* */
/* ************************************************************************** */
{
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);
/* 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 */
/* */
/* ************************************************************************** */
{
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)
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)
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);
}
/* 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 */
/* */
/* ************************************************************************** */