/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/11 12:45:16 by agilliar #+# #+# */
-/* Updated: 2025/12/16 01:54:24 by agilliar ### ########.fr */
+/* Updated: 2025/12/16 12:55:57 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
-#include "pushswap.h"
-
-typedef struct s_splitsort
-{
- const t_stacks *stacks;
- t_closure cb;
- size_t blocks;
-} t_splitsort;
-
-typedef struct s_iter
-{
- t_list range;
- size_t blocks;
- bool rev;
-} t_iter;
+#include "splitsort.h"
static t_iter iter_new(t_list range, size_t blocks, bool rev)
{
return (res);
}
-typedef struct s_part
-{
- t_list top;
- t_list bottom;
- bool rev;
- bool mirror;
-} t_part;
-
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)
if (list_get_sorted(self.top, val) != -1)
{
closure_callm(sort.cb, OP_PB, self.mirror);
- rb++;
- continue ;
- }
- while (rb--)
closure_callm(sort.cb, OP_RB, self.mirror);
- rb = 0;
- if (list_get_sorted(self.bottom, val) != -1)
+ }
+ else 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);
}
-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;
leaf_top_b_a(sort.stacks, sort.cb, range.len);
}
-
// 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_B);
}
-typedef void (t_layer_func) (t_splitsort, t_list);
-
static t_layer_func *layer_from_info(size_t depth, size_t blocks, size_t len)
{
size_t i;
return (&splitsort_part_b);
}
-typedef struct s_visit
-{
- t_list range;
- size_t depth;
- t_layer_func *cb;
- bool rev;
-} t_visit;
-
static void splitsort_visit_layer(t_visit self, t_splitsort sort)
{
t_iter iter;
/* By: clefrere <clefrere@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/02 22:15:12 by agilliar #+# #+# */
-/* Updated: 2025/12/11 19:22:20 by agilliar ### ########.fr */
+/* Updated: 2025/12/16 13:03:28 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
t_args args;
t_ops ops;
t_optimizer opt;
+ int i;
args.state = stacks_new();
args.bench = false;
args.algo = NULL;
- for (int i = 1; i < argc; i++)
- arg_step(argv[i], &args);
- output_str("\na:\n");
- stack_output(args.state.a);
- output_str("\nb:\n");
- stack_output(args.state.b);
+ i = 1;
+ while (i < argc)
+ arg_step(argv[i++], &args);
ops = ops_compose(ops_stackops(), ops_optimizer(ops_output(), &opt));
stacks_apply(&args.state, &ops, args.algo);
ops_optimizer_commit(&opt, &args.state);
- output_str("\na:\n");
- stack_output(args.state.a);
- output_str("\nb:\n");
- stack_output(args.state.b);
output_flush();
cheatexit(!stacks_is_solved(&args.state));
}
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/03 12:28:28 by agilliar #+# #+# */
-/* Updated: 2025/12/08 18:40:54 by agilliar ### ########.fr */
+/* Updated: 2025/12/16 12:48:13 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
t_closure op_output(t_op op)
{
- t_closure res;
- static char *ops[11] = {
+ t_closure res;
+ const char *const ops[11] = {
"sa",
"sb",
"ss",
"rrr",
};
- res.data = ops[op];
+ res.data = (void *) ops[op];
res.func = &op_output_inner;
return (res);
}
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/08 17:54:20 by agilliar #+# #+# */
-/* Updated: 2025/12/15 17:21:43 by agilliar ### ########.fr */
+/* Updated: 2025/12/16 13:11:01 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
int64_t *counter;
cb = data->commit.ops[OP_RA];
- if (data->b > 0)
- cb = data->commit.ops[OP_RB];
if (data->a < 0)
cb = data->commit.ops[OP_RRA];
+ counter = &data->a;
+ if (*counter > 0)
+ *counter *= -1;
+ while (*counter != 0)
+ {
+ (cb.func)(cb.data, stacks);
+ (*counter)++;
+ }
+ cb = data->commit.ops[OP_RB];
if (data->b < 0)
cb = data->commit.ops[OP_RRB];
- counter = &data->a;
- if (data->b != 0)
- counter = &data->b;
+ counter = &data->b;
if (*counter > 0)
*counter *= -1;
while (*counter != 0)
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);
}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* splitsort.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/12/16 12:54:11 by agilliar #+# #+# */
+/* Updated: 2025/12/16 12:56:36 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef SPLITSORT_H
+# define SPLITSORT_H
+
+# include "pushswap.h"
+
+typedef struct s_splitsort
+{
+ const t_stacks *stacks;
+ t_closure cb;
+ size_t blocks;
+} t_splitsort;
+
+typedef struct s_iter
+{
+ t_list range;
+ size_t blocks;
+ bool rev;
+} t_iter;
+
+typedef struct s_part
+{
+ t_list top;
+ t_list bottom;
+ bool rev;
+ bool mirror;
+} t_part;
+
+typedef enum e_mode
+{
+ MODE_A,
+ MODE_A_WRAP,
+ MODE_B,
+} t_mode;
+
+typedef void (t_layer_func) (t_splitsort, t_list);
+
+typedef struct s_visit
+{
+ t_list range;
+ size_t depth;
+ t_layer_func *cb;
+ bool rev;
+} t_visit;
+
+#endif
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* splitsort_iter.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/12/16 12:57:22 by agilliar #+# #+# */
+/* Updated: 2025/12/16 12:57:29 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "splitsort.h"