From 367a3000369f2fd4b917d18d7a8b85d56fddd29a Mon Sep 17 00:00:00 2001 From: = <=> Date: Wed, 10 Dec 2025 21:19:19 +0100 Subject: [PATCH] Leaf index --- Makefile | 2 +- leaf_sort.h | 4 ++- leaf_sort_index.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++ main_pushswap.c | 6 ++-- 4 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 leaf_sort_index.c diff --git a/Makefile b/Makefile index 6986a10..2a69b16 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ NAME=push_swap -SRCS=algorithm_quicksort.c algorithm_selection_sort.c cheatalloc.c clist.c leaf_sort_parse.c list.c main_pushswap.c op_output.c op_p.c op_parse.c op_r.c op_rr.c op_s.c ops.c ops_groups.c ops_optimizer.c output.c psval.c slice.c stack.c stacks.c +SRCS=algorithm_quicksort.c algorithm_selection_sort.c cheatalloc.c clist.c leaf_sort_index.c leaf_sort_parse.c list.c main_pushswap.c op_output.c op_p.c op_parse.c op_r.c op_rr.c op_s.c ops.c ops_groups.c ops_optimizer.c output.c psval.c slice.c stack.c stacks.c RESSRCS=_res_leaf_sort_lookup.h diff --git a/leaf_sort.h b/leaf_sort.h index 1850198..e7e3672 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/10 18:35:51 by agilliar ### ########.fr */ +/* Updated: 2025/12/10 21:18:45 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,5 +42,7 @@ extern void _binary__build_leaf_sort_lookup_res_start(void); extern void _binary__build_leaf_sort_lookup_res_end(void); t_leaf_lookups *leaf_lookups(void); +t_leaf_solution *leaf_sort_get(size_t size, const t_psval *data, + t_leaf_lookup *lookup); #endif diff --git a/leaf_sort_index.c b/leaf_sort_index.c new file mode 100644 index 0000000..3444e80 --- /dev/null +++ b/leaf_sort_index.c @@ -0,0 +1,75 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* leaf_sort_index.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/12/10 19:46:38 by agilliar #+# #+# */ +/* Updated: 2025/12/10 21:16:39 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "leaf_sort.h" + +static size_t factorial(size_t n) +{ + if (n < 2) + return (1); + return (factorial(n - 1) * n); +} + +static size_t leaf_sort_index_norm(size_t size, const t_psval *data) +{ + size_t store[4]; + size_t i; + size_t j; + size_t max_pos; + + if (size > 4 || size < 1) + cheatexit(1); + j = 0; + while (j < size) + store[j++] = 0; + i = size; + while (i--) + { + max_pos = 0; + j = 1; + while (j < size) + { + if (i >= store[j] && (data[j] > data[max_pos] || store[max_pos] > i)) + max_pos = j; + j++; + } + store[max_pos] = i; + } + return (store[0]); +} + +static size_t leaf_sort_index(size_t size, const t_psval *data) +{ + if (size < 2) + return (0); + return (leaf_sort_index_norm(size, data) * factorial(size - 1) + + leaf_sort_index(size - 1, data + 1)); +} + +static t_leaf_solution *leaf_group_get(size_t size, t_leaf_lookup *lookup) +{ + if (size == 0) + return (lookup->zero); + if (size == 1) + return (lookup->one); + if (size == 2) + return (lookup->two); + if (size == 3) + return (lookup->three); + return (lookup->four); +} + +t_leaf_solution *leaf_sort_get(size_t size, const t_psval *data, + t_leaf_lookup *lookup) +{ + return (&leaf_group_get(size, lookup)[leaf_sort_index(size, data)]); +} diff --git a/main_pushswap.c b/main_pushswap.c index 06be176..0870758 100644 --- a/main_pushswap.c +++ b/main_pushswap.c @@ -6,7 +6,7 @@ /* By: clefrere +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/02 22:15:12 by agilliar #+# #+# */ -/* Updated: 2025/12/10 19:17:52 by agilliar ### ########.fr */ +/* Updated: 2025/12/10 20:25:15 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -50,8 +50,8 @@ int main(int argc, char **argv) args.state = stacks_new(); args.bench = false; args.algo = NULL; - t_leaf_lookups *test = leaf_lookups(); - printf("%i", test->other.four[0].store[2]); + t_psval test[] = {0, 2, 3, 1}; + printf("%i", leaf_sort_get(4, test, &leaf_lookups()->other)->store[4]); for (int i = 1; i < argc; i++) arg_step(argv[i], &args); ops = ops_compose(ops_stackops(), ops_optimizer(ops_output(), &opt)); -- 2.51.0