/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* push_swap.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/11/25 23:10:37 by apommier #+# #+# */ /* Updated: 2022/01/19 05:53:41 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" int is_nbr(int nbrarg, char **list, int i) { int j; j = 0; while (--nbrarg) { j++; i = 0; while (list[j][i]) { while (list[j][i] == ' ') i++; if (list[j][i] == '-' || (list[j][i] == '+')) i++; if (!list[j][i] && (list[j][i] < '0' || list[j][i] > '9')) return (0); while (list[j][i] && list[j][i] >= '0' && list[j][i] <= '9') i++; if (list[j][i] && list[j][i] != ' ') return (0); while (list[j][i] == ' ') i++; } } return (1); } int is_double(int nbrarg, char **list) { int i; int j; int len; i = 1; j = 1; nbrarg--; while (nbrarg - j) { i = 1; while (list[j + i]) { if (ft_strlen(list[j]) > ft_strlen(list[j + i])) len = ft_strlen(list[j]); else len = ft_strlen(list[j + i]); if (ft_strncmp(list[j], list[j + i], len) == 0) return (0); i++; } j++; } return (1); } int push_swap(int nbrarg, char **list) { t_list *start; int lst_size; start = 0; if (!is_nbr(nbrarg, list, 0) || !is_double(nbrarg, list)) { ft_putstr_fd("Error\n", 2); return (0); } start = set_list(--nbrarg, list); lst_indexing(start); start = is_double_one(start); if (!start) return (0); lst_size = ft_lstsize(start); if (lst_size == 1) return (1); if (lst_size == 3 || lst_size == 5) sort_little(start); else { start = find_loop_index(start); ft_lstclear(&start, &free); } return (1); } t_list *set_list(int nbrarg, char **src) { int *tmp; int i; int j; t_list *swap; j = 1; tmp = 0; i = 0; swap = 0; while (nbrarg--) { i = 0; while (src[j][i]) { tmp = ft_calloc(sizeof(int), 1); *tmp = ft_atoi(&src[j][i]); ft_lstadd_back(&swap, ft_lstnew(tmp)); while ((src[j][i] >= '0' && src[j][i] <= '9') || src[j][i] == '-') i++; while (src[j][i] == ' ') i++; } j++; } return (swap); } t_list *best_b(t_list **b, t_list *start_b, t_list *a, int best_move) { int move; t_list *best_b; move = 0; while (*b) { move = find_nbr(ft_lstsize(start_b), a, start_b, (*b)->index); if (move < best_move) { best_move = move; best_b = *b; } *b = (*b)->next; } return (best_b); }