]> Untitled Git - axy/ft/pushswap.git/commitdiff
Leaf index
author= <=>
Wed, 10 Dec 2025 20:19:19 +0000 (21:19 +0100)
committer= <=>
Wed, 10 Dec 2025 20:19:19 +0000 (21:19 +0100)
Makefile
leaf_sort.h
leaf_sort_index.c [new file with mode: 0644]
main_pushswap.c

index 6986a10e825932cdc5ac5b60676dc15a6e403cc3..2a69b16aea0064377fc6dd780acb5af514bfa53b 100644 (file)
--- 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
 
index 18501980189f3b3c03ab0089b005668d68d042f3..e7e36728e9dd40e4bc1c67dc3ba8d67656f59790 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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 (file)
index 0000000..3444e80
--- /dev/null
@@ -0,0 +1,75 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   leaf_sort_index.c                                  :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   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)]);
+}
index 06be176a551c13471c8c5ab82b6e711978209077..0870758f542d1cef3b154a2511da10cc54d856d7 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: clefrere <clefrere@student.42.fr>          +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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));