prepare.c \
find.c \
circular_lis.c \
+ circ_helpers.c \
special_a.c \
PUSHSOURCES := $(addprefix $(PUSHSRCDIR)/, $(PUSHSOURCES))
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* circ_helpers.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/03/05 10:36:20 by ljiriste #+# #+# */
+/* Updated: 2024/03/05 10:41:33 by ljiriste ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "push_swap.h"
+#include "libft.h"
+#include <stddef.h>
+
+void rotate_lis_to_start(t_stack *lis, t_stack *stack, size_t init_ind)
+{
+ while (stack->ind != init_ind)
+ {
+ if (stack_top(lis) == stack_top(stack))
+ stack_rotate(lis, 1);
+ stack_rotate(stack, 1);
+ }
+ return ;
+}
+
+static int unrolled_stack_access(t_stack *stack, size_t ind)
+{
+ int res;
+
+ if (ind > SIZE_MAX - stack->ind)
+ ind -= SIZE_MAX;
+ ind += stack->ind;
+ ind %= stack->stack.size;
+ res = *(int *)ft_vec_access(&stack->stack, ind);
+ return (res);
+}
+
+size_t binary_search(t_vec *sorted, t_stack *stack, size_t val_ind)
+{
+ const int val = unrolled_stack_access(stack, val_ind);
+ size_t hi;
+ size_t lo;
+ size_t mid;
+
+ lo = 0;
+ hi = sorted->size;
+ mid = lo + (hi - lo) / 2;
+ while (lo != hi)
+ {
+ if (val > unrolled_stack_access(stack,
+ *(size_t *)ft_vec_access(sorted, mid)))
+ {
+ lo = mid + 1;
+ }
+ else
+ {
+ hi = mid;
+ }
+ mid = lo + (hi - lo) / 2;
+ }
+ return (mid);
+}
/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/02/27 15:18:21 by ljiriste #+# #+# */
-/* Updated: 2024/03/02 12:48:30 by ljiriste ### ########.fr */
+/* Updated: 2024/03/05 10:41:33 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
return (res);
}
-static void rotate_lis_to_start(t_stack *lis, t_stack *stack, size_t init_ind)
-{
- while (stack->ind != init_ind)
- {
- if (stack_top(lis) == stack_top(stack))
- stack_rotate(lis, 1);
- stack_rotate(stack, 1);
- }
- return ;
-}
-
/* This is the algorithm for finding the longest increasing subsequence
found on wikipedia adjusted for circular sequences (stack).*/
static t_arr_stat get_lis(t_stack *lis, t_stack *stack, size_t ind)
res = get_lis_loop(stack, &inds_of_lowest, &inds_of_predecessor);
if (res == success)
{
- res = reconstruct_lis(lis, stack, &inds_of_lowest, &inds_of_predecessor);
+ res = reconstruct_lis(lis, stack, &inds_of_lowest,
+ &inds_of_predecessor);
if (res == success)
rotate_lis_to_start(lis, stack, stack_init_ind);
}
/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/02/22 14:22:08 by ljiriste #+# #+# */
-/* Updated: 2024/03/01 10:07:27 by ljiriste ### ########.fr */
+/* Updated: 2024/03/05 10:39:46 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
res = ft_mins(res, a_minus + b_plus);
return (res);
}
-
-static int unrolled_stack_access(t_stack *stack, size_t ind)
-{
- int res;
-
- if (ind > SIZE_MAX - stack->ind)
- ind -= SIZE_MAX;
- ind += stack->ind;
- ind %= stack->stack.size;
- res = *(int *)ft_vec_access(&stack->stack, ind);
- return (res);
-}
-
-size_t binary_search(t_vec *sorted, t_stack *stack, size_t val_ind)
-{
- const int val = unrolled_stack_access(stack, val_ind);
- size_t hi;
- size_t lo;
- size_t mid;
-
- lo = 0;
- hi = sorted->size;
- mid = lo + (hi - lo) / 2;
- while (lo != hi)
- {
- if (val > unrolled_stack_access(stack,
- *(size_t *)ft_vec_access(sorted, mid)))
- {
- lo = mid + 1;
- }
- else
- {
- hi = mid;
- }
- mid = lo + (hi - lo) / 2;
- }
- return (mid);
-}
/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/24 12:13:51 by ljiriste #+# #+# */
-/* Updated: 2024/03/01 10:22:32 by ljiriste ### ########.fr */
+/* Updated: 2024/03/05 10:41:33 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
int stack_top(t_stack *s);
t_arr_stat get_circular_lis(t_stack *lis, t_stack *stack);
+size_t binary_search(t_vec *sorted, t_stack *stack, size_t val_ind);
+void rotate_lis_to_start(t_stack *lis, t_stack *stack, size_t init_ind);
+
int is_sorted(t_stack *s);
int parse(int argc, char **argv, t_stack *s);
void prepare_stacks(t_stacks *s, size_t ind_a, size_t ind_b);
size_t cost(t_stacks *s, const size_t b_plus, const size_t a_plus);
-size_t binary_search(t_vec *sorted, t_stack *stack, size_t val_ind);
size_t find_best(t_stacks *s, t_vec *target_a_indeces);
size_t find_target_ind(t_stack *stack, int val);
size_t find_minind(t_stack *s);