made printing move optional and created the checker, and put gnl in libft

This commit is contained in:
Willem Haffmans 2024-11-24 20:03:06 +00:00
parent d0f8e125c3
commit e266e6dcc3
18 changed files with 142 additions and 87 deletions

1
.gitignore vendored
View File

@ -8,3 +8,4 @@ Session.vim
test.txt test.txt
checker_linux checker_linux
.vscode/ .vscode/
checker

View File

@ -22,7 +22,7 @@ VPATH = src:src/util:src/moves:src/sort
SOURCES = push_all_but_3_b.c push_all_but_lis.c push.c put_at_index_asc.c \ SOURCES = push_all_but_3_b.c push_all_but_lis.c push.c put_at_index_asc.c \
reverse_rotate.c rotate_a.c rotate_a_to.c rotate_a_to_top.c \ reverse_rotate.c rotate_a.c rotate_a_to.c rotate_a_to_top.c \
rotate_b.c rotate.c shortest_rotate.c swap.c push_swap.c \ rotate_b.c rotate.c shortest_rotate.c swap.c \
best_merge_a.c b_merge_a.c common_rotations.c count_moves_merge_a.c \ best_merge_a.c b_merge_a.c common_rotations.c count_moves_merge_a.c \
sort3.c sortmore.c count_gt.c error.c free_state.c ft_abs.c \ sort3.c sortmore.c count_gt.c error.c free_state.c ft_abs.c \
ft_lstat.c ft_max.c has_duplicates.c index_of.c initialise_state.c \ ft_lstat.c ft_max.c has_duplicates.c index_of.c initialise_state.c \
@ -30,7 +30,12 @@ SOURCES = push_all_but_3_b.c push_all_but_lis.c push.c put_at_index_asc.c \
longest_incremental_subsequence.c new_element.c print_stack.c \ longest_incremental_subsequence.c new_element.c print_stack.c \
print_state.c stack_min.c print_state.c stack_min.c
SOURCES_PUSH_SWAP = push_swap.c
SOURCES_CHECKER = checker.c
OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o))
OBJECTS_PUSH_SWAP = $(addprefix $(OBJ_PATH)/, $(SOURCES_PUSH_SWAP:.c=.o))
OBJECTS_CHECKER = $(addprefix $(OBJ_PATH)/, $(SOURCES_CHECKER:.c=.o))
CC = cc CC = cc
RM = rm -rf RM = rm -rf
@ -40,15 +45,19 @@ CFLAGS = -Wall -Wextra -Werror -g
LDFLAGS = -L./libft LDFLAGS = -L./libft
LDLIBS = -lft LDLIBS = -lft
all: $(NAME) all: $(NAME) checker
$(LIBFT): $(LIBFT):
@echo "Make Libft and add the archive to lib and the header to inc" @echo "Make Libft and add the archive to lib and the header to inc"
@$(MAKE) -sC libft @$(MAKE) -sC libft
$(NAME): $(OBJECTS) $(NAME): $(OBJECTS) $(OBJECTS_PUSH_SWAP)
@echo "Linking the object files in the executable." @echo "Linking the object files in the executable."
@$(CC) $(CFLAGS) $(OBJECTS) $(LDFLAGS) $(LDLIBS) -o $(NAME) @$(CC) $(CFLAGS) $(OBJECTS) $(OBJECTS_PUSH_SWAP) $(LDFLAGS) $(LDLIBS) -o $(NAME)
checker: $(OBJECTS) $(OBJECTS_CHECKER)
@echo "Linking the object files in the executable."
@$(CC) $(CFLAGS) $(OBJECTS) $(OBJECTS_CHECKER) $(LDFLAGS) $(LDLIBS) -o checker
$(OBJ_PATH): $(OBJ_PATH):
@mkdir -p $@ @mkdir -p $@

View File

@ -66,15 +66,15 @@ void reverse_rotate(t_list **stack);
void swap(t_list **stack); void swap(t_list **stack);
void pa(t_state *state); void pa(t_state *state, int silent);
void pb(t_state *state); void pb(t_state *state, int silent);
void sa(t_state *state); void sa(t_state *state, int silent);
void sb(t_state *state); void sb(t_state *state, int silent);
void ss(t_state *state); void ss(t_state *state, int silent);
void ra(t_state *state); void ra(t_state *state, int silent);
void rb(t_state *state); void rb(t_state *state, int silent);
void rr(t_state *state); void rr(t_state *state, int silent);
void rra(t_state *state); void rra(t_state *state, int silent);
void rrb(t_state *state); void rrb(t_state *state, int silent);
void rrr(t_state *state); void rrr(t_state *state, int silent);
#endif #endif

View File

@ -23,7 +23,7 @@ WARNINGS = -Wall -Wextra -Werror
CFLAGS = $(WARNINGS) CFLAGS = $(WARNINGS)
VPATH = src:src/conversion:src/ft_printf:src/list:src/memory:src/output:\ VPATH = src:src/conversion:src/ft_printf:src/list:src/memory:src/output:\
src/string src/string:src/get_next_line
SRC_CONVERSION = ft_atoi.c ft_itoa.c ft_tolower.c ft_toupper.c \ SRC_CONVERSION = ft_atoi.c ft_itoa.c ft_tolower.c ft_toupper.c \
@ -33,7 +33,7 @@ SRC_MEMORY = ft_memchr.c ft_memcmp.c ft_memcpy.c ft_memmove.c ft_memset.c \
SRC_STRING = ft_isalnum.c ft_isalpha.c ft_isascii.c ft_isdigit.c ft_isprint.c \ SRC_STRING = ft_isalnum.c ft_isalpha.c ft_isascii.c ft_isdigit.c ft_isprint.c \
ft_split.c ft_strchr.c ft_strdup.c ft_striteri.c ft_strjoin.c \ ft_split.c ft_strchr.c ft_strdup.c ft_striteri.c ft_strjoin.c \
ft_strlcat.c ft_strlcpy.c ft_strlen.c ft_strmapi.c ft_strncmp.c \ ft_strlcat.c ft_strlcpy.c ft_strlen.c ft_strmapi.c ft_strncmp.c \
ft_strnstr.c ft_strrchr.c ft_strtrim.c ft_substr.c ft_strnstr.c ft_strrchr.c ft_strtrim.c ft_substr.c ft_strcmp.c
SRC_LIST = ft_lstadd_back.c ft_lstadd_front.c ft_lstclear.c ft_lstdelone.c \ SRC_LIST = ft_lstadd_back.c ft_lstadd_front.c ft_lstclear.c ft_lstdelone.c \
ft_lstiter.c ft_lstlast.c ft_lstmap.c ft_lstnew.c ft_lstsize.c ft_lstiter.c ft_lstlast.c ft_lstmap.c ft_lstnew.c ft_lstsize.c
@ -45,8 +45,10 @@ SRC_FT_PRINTF = ft_isbase.c ft_putnbr_base.c ft_write_str.c parse_placeholder.c
ft_putnbr_signed.c parse_conversion.c print_char.c \ ft_putnbr_signed.c parse_conversion.c print_char.c \
print_number.c print_string.c print_number.c print_string.c
SRC_GET_NEXT_LINE = get_next_line.c
SOURCES = $(SRC_CONVERSION) $(SRC_MEMORY) $(SRC_STRING) \ SOURCES = $(SRC_CONVERSION) $(SRC_MEMORY) $(SRC_STRING) \
$(SRC_LIST) $(SRC_OUTPUT) $(SRC_FT_PRINTF) $(SRC_LIST) $(SRC_OUTPUT) $(SRC_FT_PRINTF) $(SRC_GET_NEXT_LINE)
OBJECTS = $(addprefix $(OBJ_DIR)/, $(SOURCES:.c=.o)) OBJECTS = $(addprefix $(OBJ_DIR)/, $(SOURCES:.c=.o))

View File

@ -37,6 +37,7 @@ int ft_tolower(int c);
char *ft_strchr(const char *s, int c); char *ft_strchr(const char *s, int c);
char *ft_strrchr(const char *s, int c); char *ft_strrchr(const char *s, int c);
int ft_strncmp(const char *s1, const char *s2, size_t n); int ft_strncmp(const char *s1, const char *s2, size_t n);
int ft_strcmp(const char *s1, const char *s2);
void *ft_memchr(const void *s, int c, size_t n); void *ft_memchr(const void *s, int c, size_t n);
int ft_memcmp(const void *s1, const void *s2, size_t n); int ft_memcmp(const void *s1, const void *s2, size_t n);
char *ft_strnstr(const char *big, const char *little, size_t len); char *ft_strnstr(const char *big, const char *little, size_t len);
@ -74,4 +75,12 @@ t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *));
*/ */
int ft_printf(const char *format, ...); int ft_printf(const char *format, ...);
/*
* get_next_line
*/
# define OPEN_MAX 1024
# define BUFFER_SIZE 256
char *get_next_line(int fd);
#endif #endif

View File

@ -11,12 +11,36 @@
/* ************************************************************************** */ /* ************************************************************************** */
#include "push_swap.h" #include "push_swap.h"
#include <unistd.h>
#include <stdlib.h>
void execute_move(const char *move, t_state *state)
{
void (*const moves[])(t_state *, int) = {&sa, &sb, &ss, &pa, &pb, \
&ra, &rb, &rr, &rra, &rrb, &rrr};
const char *moves_names[] = {"sa\n", "sb\n", "ss\n", "pa\n", "pb\n", \
"ra\n", "rb\n", "rr\n", "rra\n", "rrb\n", "rrr\n"};
int i;
i = 0;
while (i < 11)
{
if (ft_strcmp(move, moves_names[i]) == 0)
{
moves[i](state, 1);
return;
}
i++;
}
ft_putstr_fd("Error: Invalid move\n", 2);
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int size;
t_state *state; t_state *state;
char *move;
state = NULL;
if (!initialise_state(&state)) if (!initialise_state(&state))
return (1); return (1);
while (argc-- > 1) while (argc-- > 1)
@ -26,9 +50,16 @@ int main(int argc, char *argv[])
if (has_duplicates(state->a)) if (has_duplicates(state->a))
return (error(state)); return (error(state));
} }
if (ft_lstsize(state->a) <= 1 || is_sorted(state->a)) size = ft_lstsize(state->a);
return (0); move = get_next_line(STDIN_FILENO);
sortmore(state); while (move)
free_state(state); {
return (0); execute_move(move, state);
free(move);
move = get_next_line(STDIN_FILENO);
}
free(move);
if (ft_lstsize(state->a) == size && (size == 0 || is_sorted(state->a)))
return (free_state(state), ft_printf("OK\n"));
return (free_state(state), ft_printf("KO\n"));
} }

View File

@ -12,28 +12,27 @@
#include "libft.h" #include "libft.h"
#include "push_swap.h" #include "push_swap.h"
#include <unistd.h>
void pb(t_state *state) void pb(t_state *state, int silent)
{ {
push(&(state->a), &(state->b)); push(&(state->a), &(state->b));
#ifndef SILENT if (!silent)
ft_printf("pb\n"); ft_putstr_fd("pb\n", STDOUT_FILENO);
#endif
} }
void pa(t_state *state) void pa(t_state *state, int silent)
{ {
push(&(state->b), &(state->a)); push(&(state->b), &(state->a));
#ifndef SILENT if (!silent)
ft_printf("pa\n"); ft_putstr_fd("pa\n", STDOUT_FILENO);
#endif
} }
void push(t_list **stack_1, t_list **stack_2) void push(t_list **stack_1, t_list **stack_2)
{ {
t_list *temp; t_list *temp;
if (!stack_1) if (!*stack_1)
return ; return ;
temp = (*stack_1)->next; temp = (*stack_1)->next;
ft_lstadd_front(stack_2, *stack_1); ft_lstadd_front(stack_2, *stack_1);

View File

@ -20,5 +20,5 @@ void push_all_but_3_b(t_state *state)
i = 0; i = 0;
while (i++ < size - 3) while (i++ < size - 3)
pb(state); pb(state, 0);
} }

View File

@ -29,10 +29,10 @@ void push_all_but_lis(t_state *state)
if (j < lis_size && i == lis_indices[j]) if (j < lis_size && i == lis_indices[j])
{ {
j++; j++;
ra(state); ra(state, 0);
} }
else else
pb(state); pb(state, 0);
i++; i++;
} }
free(lis_indices); free(lis_indices);

View File

@ -12,30 +12,28 @@
#include "libft.h" #include "libft.h"
#include "push_swap.h" #include "push_swap.h"
#include <unistd.h>
void rra(t_state *state) void rra(t_state *state, int silent)
{ {
reverse_rotate(&(state->a)); reverse_rotate(&(state->a));
#ifndef SILENT if (!silent)
ft_printf("rra\n"); ft_putstr_fd("rra\n", STDOUT_FILENO);
#endif
} }
void rrb(t_state *state) void rrb(t_state *state, int silent)
{ {
reverse_rotate(&(state->b)); reverse_rotate(&(state->b));
#ifndef SILENT if (!silent)
ft_printf("rrb\n"); ft_putstr_fd("rrb\n", STDOUT_FILENO);
#endif
} }
void rrr(t_state *state) void rrr(t_state *state, int silent)
{ {
reverse_rotate(&(state->a)); reverse_rotate(&(state->a));
reverse_rotate(&(state->b)); reverse_rotate(&(state->b));
#ifndef SILENT if (!silent)
ft_printf("rrr\n"); ft_putstr_fd("rrr\n", STDOUT_FILENO);
#endif
} }
void reverse_rotate(t_list **stack) void reverse_rotate(t_list **stack)
@ -43,7 +41,7 @@ void reverse_rotate(t_list **stack)
t_list *temp; t_list *temp;
t_list *last; t_list *last;
if (!stack) if (!*stack)
return ; return ;
temp = *stack; temp = *stack;
last = ft_lstlast(*stack); last = ft_lstlast(*stack);

View File

@ -12,37 +12,35 @@
#include "libft.h" #include "libft.h"
#include "push_swap.h" #include "push_swap.h"
#include <unistd.h>
void ra(t_state *state) void ra(t_state *state, int silent)
{ {
rotate(&(state->a)); rotate(&(state->a));
#ifndef SILENT if (!silent)
ft_printf("ra\n"); ft_putstr_fd("ra\n", STDOUT_FILENO);
#endif
} }
void rb(t_state *state) void rb(t_state *state, int silent)
{ {
rotate(&(state->b)); rotate(&(state->b));
#ifndef SILENT if (!silent)
ft_printf("rb\n"); ft_putstr_fd("rb\n", STDOUT_FILENO);
#endif
} }
void rr(t_state *state) void rr(t_state *state, int silent)
{ {
rotate(&(state->a)); rotate(&(state->a));
rotate(&(state->b)); rotate(&(state->b));
#ifndef SILENT if (!silent)
ft_printf("rr\n"); ft_putstr_fd("rr\n", STDOUT_FILENO);
#endif
} }
void rotate(t_list **stack) void rotate(t_list **stack)
{ {
t_list *temp; t_list *temp;
if (!stack) if (!*stack)
return ; return ;
temp = (*stack)->next; temp = (*stack)->next;
(*stack)->next = NULL; (*stack)->next = NULL;

View File

@ -16,12 +16,12 @@ void rotate_a(int n, t_state *state)
{ {
while (n > 0) while (n > 0)
{ {
ra(state); ra(state, 0);
n--; n--;
} }
while (n < 0) while (n < 0)
{ {
rra(state); rra(state, 0);
n++; n++;
} }
} }

View File

@ -16,12 +16,12 @@ void rotate_b(int n, t_state *state)
{ {
while (n > 0) while (n > 0)
{ {
rb(state); rb(state, 0);
n--; n--;
} }
while (n < 0) while (n < 0)
{ {
rrb(state); rrb(state, 0);
n++; n++;
} }
} }

View File

@ -12,30 +12,27 @@
#include "libft.h" #include "libft.h"
#include "push_swap.h" #include "push_swap.h"
#include <unistd.h>
void sa(t_state *state) void sa(t_state *state, int silent)
{ {
swap(&(state->a)); swap(&(state->a));
#ifndef SILENT if (!silent)
ft_printf("sa\n"); ft_putstr_fd("sa\n", STDOUT_FILENO);
#endif
} }
void sb(t_state *state, int silent)
void sb(t_state *state)
{ {
swap(&(state->b)); swap(&(state->b));
#ifndef SILENT if (!silent)
ft_printf("sb\n"); ft_putstr_fd("sb\n", STDOUT_FILENO);
#endif
} }
void ss(t_state *state) void ss(t_state *state, int silent)
{ {
swap(&(state->a)); swap(&(state->a));
swap(&(state->b)); swap(&(state->b));
#ifndef SILENT if (!silent)
ft_printf("ss\n"); ft_putstr_fd("ss\n", STDOUT_FILENO);
#endif
} }
void swap(t_list **stack) void swap(t_list **stack)

View File

@ -24,5 +24,5 @@ void b_merge_a(int idx_b, t_state *state)
common_rotations(&shortest_a, &shortest_b, state); common_rotations(&shortest_a, &shortest_b, state);
rotate_a(shortest_a, state); rotate_a(shortest_a, state);
rotate_b(shortest_b, state); rotate_b(shortest_b, state);
pa(state); pa(state, 0);
} }

View File

@ -20,7 +20,7 @@ void common_rotations(int *shortest_a, int *shortest_b, t_state *state)
{ {
while (*shortest_a > 0 && *shortest_b > 0) while (*shortest_a > 0 && *shortest_b > 0)
{ {
rr(state); rr(state, 0);
(*shortest_a)--; (*shortest_a)--;
(*shortest_b)--; (*shortest_b)--;
} }
@ -29,7 +29,7 @@ void common_rotations(int *shortest_a, int *shortest_b, t_state *state)
{ {
while (*shortest_a < 0 && *shortest_b < 0) while (*shortest_a < 0 && *shortest_b < 0)
{ {
rrr(state); rrr(state, 0);
(*shortest_a)++; (*shortest_a)++;
(*shortest_b)++; (*shortest_b)++;
} }

View File

@ -32,10 +32,10 @@ int sort3(t_state *state)
return (1); return (1);
else if (a < b && b > c && a < c) else if (a < b && b > c && a < c)
{ {
rra(state); rra(state, 0);
sa(state); sa(state, 0);
} }
else if ((a > b && a < c) || (a > b && b > c)) else if ((a > b && a < c) || (a > b && b > c))
sa(state); sa(state, 0);
return (1); return (1);
} }

View File

@ -14,7 +14,7 @@ run_test_case() {
do do
ARG=$(seq -1000 1000 | shuf -n $N) ARG=$(seq -1000 1000 | shuf -n $N)
OPS=$(./push_swap $ARG | wc -l) OPS=$(./push_swap $ARG | wc -l)
OK=$(./push_swap $ARG | ./checker_linux $ARG) OK=$(./push_swap $ARG | ./checker $ARG)
if [ $OPS -gt $MAX ] if [ $OPS -gt $MAX ]
then then
MAX_ARGS="Max: $OPS | $(echo $ARG | tr -d '\n')" MAX_ARGS="Max: $OPS | $(echo $ARG | tr -d '\n')"
@ -49,6 +49,17 @@ run_test_case() {
} }
run_test_case 500 1000 run_test_case 1 10
run_test_case 2 10
run_test_case 3 10
run_test_case 4 10
run_test_case 5 10
run_test_case 10 10
run_test_case 20 10
run_test_case 50 10
run_test_case 100 10
run_test_case 200 10
run_test_case 500 10