]> Untitled Git - axy/ft/pushswap.git/commitdiff
Bonus
author= <=>
Thu, 18 Dec 2025 16:20:47 +0000 (17:20 +0100)
committer= <=>
Thu, 18 Dec 2025 16:20:47 +0000 (17:20 +0100)
13 files changed:
Makefile
algorithm_stdin.c [new file with mode: 0644]
eoutput.c [new file with mode: 0644]
ft_memcpy.c [new file with mode: 0644]
get_next_op.c [new file with mode: 0644]
input.txt [new file with mode: 0644]
main_checker.c [new file with mode: 0644]
main_pushswap.c
numutils.c [new file with mode: 0644]
op_output.c
ops.c
pushswap.h
slice.c

index ee8dee5ab3ed544b7cafb7fe0e2407cb55cd093c..fbe903f75aea063cc8a812b3a154397bd6c906bb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,15 +1,23 @@
 NAME=push_swap
 
-SRCS=algorithm_complex.c algorithm_medium.c algorithm_simple.c cheatalloc.c clist.c closure.c disorder.c frac.c leaf_sort.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_count.c ops_optimizer.c ops_stackops.c output.c psval.c slice.c splitsort.c splitsort_final.c splitsort_iter.c splitsort_part.c stack.c stacks.c stacks_get.c
+NAME_BONUS=checker
+
+SRCS=algorithm_complex.c algorithm_medium.c algorithm_simple.c algorithm_stdin.c cheatalloc.c clist.c closure.c disorder.c eoutput.c frac.c ft_memcpy.c get_next_op.c leaf_sort.c leaf_sort_index.c leaf_sort_parse.c list.c numutils.c op_output.c op_p.c op_parse.c op_r.c op_rr.c op_s.c ops.c ops_count.c ops_optimizer.c ops_stackops.c output.c psval.c slice.c splitsort.c splitsort_final.c splitsort_iter.c splitsort_part.c stack.c stacks.c stacks_get.c
 
 RESSRCS=_res_leaf_sort_lookup.h
 
+MAINSRCS=main_pushswap.c
+BONUSSRCS=main_checker.c
+
 BUILDDIR=.build
 
 RESDAT=${RESSRCS:_res_%.h=${BUILDDIR}/%.res}
 
 OBJS=${SRCS:%.c=${BUILDDIR}/%.o} ${RESDAT:%.res=%.o}
 
+MAINOBJS=${MAINSRCS:%.c=${BUILDDIR}/%.o}
+BONUSOBJS=${BONUSSRCS:%.c=${BUILDDIR}/%.o}
+
 CFLAGS=-Wall -Wextra -Werror -g
 
 CC=cc
@@ -28,20 +36,25 @@ ${BUILDDIR}/%.o : %.c | ${BUILDDIR}
 ${BUILDDIR} :
        mkdir ${BUILDDIR}
 
-${NAME} : ${OBJS}
+${NAME} : ${OBJS} ${MAINOBJS}
        cc -o $@ $^
 
+${NAME_BONUS} : ${OBJS} ${BONUSOBJS}
+       cc -o $@ $^
+
+bonus : ${NAME_BONUS}
+
 clean : 
-       rm -f ${OBJS} ${RESDAT}
+       rm -f ${OBJS} ${RESDAT} ${MAINOBJS} ${BONUSOBJS}
 
 fclean : clean
-       rm -f ${NAME}
+       rm -f ${NAME} ${NAME_BONUS}
        rm -fd ${BUILDDIR}
 
 re : fclean all
 
 remakefile : clean
-       sed -i "s/^SRCS=.*/$$(echo -n SRCS=; echo -n *.c)/" Makefile
+       sed -i "s/^SRCS=.*/$$(echo -n SRCS=; echo -n *.c | sed "s/main_[^ ]* //g")/" Makefile
        sed -i "s/^RESSRCS=.*/$$(echo -n RESSRCS=; echo -n _res_*.h)/" Makefile
 
 .PHONY : all clean fclean re bonus remakefile
diff --git a/algorithm_stdin.c b/algorithm_stdin.c
new file mode 100644 (file)
index 0000000..a869728
--- /dev/null
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   algorithm_stdin.c                                  :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2025/12/18 15:59:51 by agilliar          #+#    #+#             */
+/*   Updated: 2025/12/18 17:16:51 by agilliar         ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+
+void   algorithm_stdin(const t_stacks *stacks, t_closure cb)
+{
+       t_op    op;
+
+       op = OP_PA;
+       while (get_next_op(&op))
+               closure_call(cb, op);
+       if (!stacks_is_solved(stacks))
+               output_str("KO\n");
+       else
+               output_str("OK\n");
+}
diff --git a/eoutput.c b/eoutput.c
new file mode 100644 (file)
index 0000000..2e1bb91
--- /dev/null
+++ b/eoutput.c
@@ -0,0 +1,62 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   eoutput.c                                          :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2025/12/02 16:47:00 by agilliar          #+#    #+#             */
+/*   Updated: 2025/12/18 16:32:18 by agilliar         ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+#include "output_inner.h"
+#include <unistd.h>
+
+static t_output_store  *eoutput_store(void)
+{
+       static t_output_store   store = {.written = 0};
+
+       return (&store);
+}
+
+void   eoutput_flush(void)
+{
+       size_t                  i;
+       ssize_t                 written;
+       t_output_store  *store;
+
+       store = eoutput_store();
+       i = 0;
+       while (i < store->written)
+       {
+               written = write(2, &store->buf[i], store->written - i);
+               if (written <= 0)
+                       cheatexit(written != 0);
+               i += written;
+       }
+       store->written = 0;
+}
+
+void   eoutput_char(char c)
+{
+       t_output_store  *store;
+
+       store = eoutput_store();
+       if (store->written == OUTPUT_STORE_SIZE)
+               eoutput_flush();
+       store->buf[store->written++] = c;
+}
+
+void   eoutput_str(const char *s)
+{
+       while (*s)
+               eoutput_char(*(s++));
+}
+
+void   eoutput_str_ln(const char *s)
+{
+       eoutput_str(s);
+       eoutput_char('\n');
+}
diff --git a/ft_memcpy.c b/ft_memcpy.c
new file mode 100644 (file)
index 0000000..7cff35e
--- /dev/null
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   ft_memcpy.c                                        :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2025/10/29 09:48:05 by agilliar          #+#    #+#             */
+/*   Updated: 2025/12/18 15:17:29 by agilliar         ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include <stddef.h>
+
+void   *ft_memcpy(void *dest, const void *src, size_t n)
+{
+       size_t  i;
+
+       i = 0;
+       while (i < n)
+       {
+               ((unsigned char *)dest)[i] = ((unsigned char *)src)[i];
+               i++;
+       }
+       return (dest);
+}
diff --git a/get_next_op.c b/get_next_op.c
new file mode 100644 (file)
index 0000000..e6d8bce
--- /dev/null
@@ -0,0 +1,45 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   get_next_op.c                                      :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2025/12/18 15:36:01 by agilliar          #+#    #+#             */
+/*   Updated: 2025/12/18 17:15:30 by agilliar         ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+#include <unistd.h>
+
+#define BUF_SIZE 128
+
+bool   get_next_op(t_op *res)
+{
+       static char             buf[BUF_SIZE];
+       static size_t   used = 0;
+       ssize_t                 n;
+       t_slice                 curr;
+       t_slice                 op;
+
+       while (used < 10)
+       {
+               n = read(0, &buf[used], BUF_SIZE - used);
+               if (n == 0)
+                       break ;
+               if (n < 0)
+                       cheatexit(1);
+               used += n;
+       }
+       if (!used)
+               return (false);
+       curr = slice_new_range(buf, &buf[used]);
+       op = slice_split(&curr, '\n');
+       *res = op_parse(op);
+       if (*res == OP_INVALID || used - curr.len - op.len == 0)
+               cheatexit(1);
+       ft_memcpy(buf, curr.ptr, curr.len);
+       used = curr.len;
+       return (true);
+}
diff --git a/input.txt b/input.txt
new file mode 100644 (file)
index 0000000..6ee4a92
--- /dev/null
+++ b/input.txt
@@ -0,0 +1,655 @@
+ra
+ra
+pb
+rr
+ra
+ra
+ra
+pb
+pb
+ra
+pb
+rb
+pb
+rr
+pb
+rb
+pb
+pb
+pb
+ra
+ra
+pb
+ra
+ra
+ra
+pb
+rr
+pb
+rr
+ra
+ra
+pb
+pb
+rb
+pb
+pb
+rr
+pb
+pb
+pb
+rr
+ra
+ra
+ra
+ra
+ra
+ra
+pb
+rb
+pb
+rr
+pb
+pb
+pb
+ra
+ra
+ra
+ra
+pb
+rr
+ra
+pb
+ra
+ra
+pb
+pb
+rb
+pb
+rb
+pb
+ra
+pb
+rb
+pb
+rr
+ra
+ra
+ra
+ra
+ra
+ra
+ra
+pb
+rb
+pb
+ra
+ra
+ra
+ra
+ra
+ra
+ra
+ra
+pb
+rr
+ra
+pb
+rr
+ra
+ra
+ra
+ra
+pb
+pb
+pb
+pb
+rra
+rra
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+pb
+rra
+rra
+rra
+rb
+pb
+rra
+rra
+rb
+pb
+rra
+rra
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+pb
+rra
+pb
+rra
+rra
+pb
+rra
+pb
+rra
+rra
+pb
+rra
+rra
+rra
+pb
+rra
+rb
+pb
+rra
+rra
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+rra
+rra
+rra
+rb
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+pb
+rra
+pb
+rra
+rb
+pb
+rra
+rb
+pb
+rra
+rra
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pb
+pa
+pa
+rr
+rb
+rb
+rb
+rb
+pa
+rr
+rb
+pa
+rr
+pa
+rb
+rb
+rb
+pa
+pa
+ra
+pa
+rb
+sa
+pb
+sa
+pb
+sa
+pa
+pa
+rra
+rra
+pb
+rra
+pb
+rra
+sa
+pa
+pa
+rrb
+pa
+rrb
+pa
+rrb
+pa
+rrb
+pa
+ra
+rrb
+pa
+rrb
+rrb
+pa
+ra
+rrb
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+rrb
+pb
+sa
+pb
+ss
+pa
+sa
+pa
+sa
+rra
+pb
+rra
+rra
+sa
+rra
+pa
+pa
+pa
+pa
+pa
+pb
+pb
+ss
+pa
+sa
+pa
+pa
+ra
+pa
+pa
+rb
+pa
+rb
+rb
+rb
+rb
+rb
+rb
+pa
+rb
+rb
+rb
+rb
+rb
+pa
+ra
+pa
+ra
+pa
+ra
+pb
+sa
+pb
+sa
+pa
+sa
+pa
+rra
+rra
+rra
+pb
+rra
+sa
+pa
+rrb
+pa
+rrb
+rrb
+pa
+ra
+rrb
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+pa
+rrb
+rrb
+pa
+rrb
+pa
+ra
+rrb
+pa
+rrb
+pb
+sa
+pb
+sa
+pa
+sa
+pa
+rra
+pb
+rra
+rra
+sa
+pa
+rra
+pa
+pa
+pa
+pa
+sa
+pb
+sa
+pa
+sa
+pa
+rb
+rb
+rb
+pa
+rr
+rb
+pa
+rr
+rb
+pa
+rb
+pa
+rr
+pa
+rr
+pa
+rb
+pa
+rb
+pb
+sa
+pb
+ss
+pa
+sa
+pa
+sa
+rra
+pb
+rra
+rra
+pa
+rrr
+pa
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+pa
+rrb
+rrb
+rrb
+rrb
+pa
+ra
+rrb
+pa
+rrb
+pa
+rrb
+sa
+pb
+sa
+pb
+sa
+pa
+pa
+rra
+pb
+rra
+rra
+pa
+rra
+pa
+pa
+pa
+pa
+pb
+pb
+ss
+pa
+sa
+pa
+sa
+rb
+pa
+rr
+pa
+rb
+rb
+rb
+rb
+rb
+pa
+pa
+rb
+pa
+rr
+pa
+rr
+rb
+rb
+pa
+ra
+pa
+pb
+pb
+ss
+ra
+pa
+sa
+pa
+rra
+rra
+rra
+pb
+rra
+sa
+pa
+rrr
+pa
+rrb
+pa
+ra
+rrb
+pa
+rrb
+rrb
+pa
+rrb
+rrb
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+rrb
+pa
+rrb
+pa
+ra
+pb
+pb
+ss
+pa
+sa
+pa
+sa
+rra
+rra
+pb
+rra
+rra
+pa
+pa
+pa
+pa
+pa
+sa
+pb
+sa
+pb
+ss
+pa
+sa
+pa
+rb
+pa
+rb
+pa
+rb
+pa
+rr
+rb
+pa
+rr
+pa
+rb
+rb
+rb
+rb
+rb
+rb
+pa
+ra
+pa
+pa
+ra
+pb
+pb
+ss
+ra
+pa
+sa
+pa
+rra
+rra
+rra
+pb
+rra
+sa
+pa
+rrr
+pa
+rrb
+pa
+ra
+rrb
+rrb
+pa
+ra
+rrb
+rrb
+rrb
+pa
+rrb
+rrb
+pa
+ra
+rrb
+pa
+ra
+rrb
+pa
+rrb
+pa
+sa
+rra
+rra
+pb
+rra
+pb
+rra
+sa
+pa
+pa
+pa
+pa
+pa
+pa
diff --git a/main_checker.c b/main_checker.c
new file mode 100644 (file)
index 0000000..b4174a5
--- /dev/null
@@ -0,0 +1,35 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   main_checker.c                                     :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: clefrere <clefrere@student.42.fr>          +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2025/12/02 22:15:12 by agilliar          #+#    #+#             */
+/*   Updated: 2025/12/18 17:11:15 by agilliar         ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+
+static void    arg_step(char *str, t_stacks *stacks)
+{
+       stack_push_back(&stacks->a, psval_parse(str));
+}
+
+int    main(int argc, char **argv)
+{
+       t_stacks        stacks;
+       int                     i;
+       t_ops           ops;
+
+       i = 1;
+       stacks = stacks_new();
+       while (i < argc)
+               arg_step(argv[i++], &stacks);
+       ops = ops_stackops();
+       stacks_apply(&stacks, &ops, &algorithm_stdin);
+       output_flush();
+       eoutput_flush();
+       cheatexit(0);
+}
index e46902f07617c5b1761ab23f68b98ea1c70ab94d..1669b9213b8b3dce5663a6e87a0306c5a6d30aad 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: clefrere <clefrere@student.42.fr>          +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/02 22:15:12 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/18 14:07:38 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/18 16:12:13 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -34,9 +34,7 @@ typedef struct s_args
 {
        t_stacks        state;
        t_algovar       algo;
-       t_algorithm     *algo_func;
        bool            bench;
-       t_frac          disorder;
 }      t_args;
 
 static t_algorithm     *algorithm_get(t_algovar var, t_frac disorder)
@@ -55,25 +53,25 @@ static t_algorithm  *algorithm_get(t_algovar var, t_frac disorder)
 }
 
 #define COMPLEXITY_SIMPLE "Simple / O(N^2)"
-#define COMPLEXITY_MEDIUM "Simple / O(N^(3/2))"
-#define COMPLEXITY_COMPLEX "Simple / O(N log N)"
+#define COMPLEXITY_MEDIUM "Medium / O(N^(3/2))"
+#define COMPLEXITY_COMPLEX "Complex / O(N log N)"
 #define COMPLEXITY_ADAPTIVE_LOW "Adaptive / O(N^2)"
 #define COMPLEXITY_ADAPTIVE_MEDIUM "Adaptive / O(N^(3/2))"
 #define COMPLEXITY_ADAPTIVE_HIGH "Adaptive / O(N log N)"
 
-t_slice        complexity_get(t_algovar var, t_frac disorder)
+static const char      *complexity_get(t_algovar var, t_frac disorder)
 {
        if (var == ALGORITHM_SIMPLE)
-               return (slice_new(COMPLEXITY_SIMPLE));
+               return (COMPLEXITY_SIMPLE);
        if (var == ALGORITHM_MEDIUM)
-               return (slice_new(COMPLEXITY_MEDIUM));
+               return (COMPLEXITY_MEDIUM);
        if (var == ALGORITHM_COMPLEX)
-               return (slice_new(COMPLEXITY_COMPLEX));
+               return (COMPLEXITY_COMPLEX);
        if (frac_lt(disorder, frac_new(1, 5)))
-               return (slice_new(COMPLEXITY_ADAPTIVE_LOW));
+               return (COMPLEXITY_ADAPTIVE_LOW);
        if (frac_lt(disorder, frac_new(1, 2)))
-               return (slice_new(COMPLEXITY_ADAPTIVE_MEDIUM));
-       return (slice_new(COMPLEXITY_ADAPTIVE_HIGH));
+               return (COMPLEXITY_ADAPTIVE_MEDIUM);
+       return (COMPLEXITY_ADAPTIVE_HIGH);
 }
 
 static void    arg_step(char *str, t_args *arg)
@@ -96,7 +94,7 @@ typedef struct        s_benchres
 {
        t_ops_count     pre_opt;
        t_ops_count     post_opt;
-       t_slice         strategy;
+       const char      *strategy;
        t_frac          disorder;
 }      t_benchres;
 
@@ -106,16 +104,51 @@ static t_benchres pushswap_solve(t_args *args)
        t_optimizer     opt;
        t_benchres      res;
 
-       res.disorder = args->disorder;
+       res.disorder = compute_disorder(&args->state.a);
        ops = ops_compose(ops_output(), ops_count(&res.post_opt));
        ops = ops_optimizer(ops, &opt);
        ops = ops_compose(ops_stackops(), ops);
        ops = ops_compose(ops_count(&res.pre_opt), ops);
-       stacks_apply(&args->state, &ops, args->algo_func);
+       stacks_apply(&args->state, &ops, algorithm_get(args->algo, res.disorder));
        ops_optimizer_commit(&opt, &args->state);
+       res.strategy = complexity_get(args->algo, res.disorder);
        return (res);
 }
 
+static void    output_ops(t_ops_count ops)
+{
+       t_op    op;
+       size_t  total;
+
+       op = OP_SA;
+       total = 0;
+       while (op <= OP_RRR)
+       {
+               if (op != OP_SA)
+                       eoutput_str(", ");
+               eoutput_str(ops_str(op));
+               eoutput_str(": ");
+               eoutput_size(ops.counters[op]);
+               total += ops.counters[op];
+               op++;
+       }
+       eoutput_str("\t| ");
+       eoutput_str("total: ");
+       eoutput_size(total);
+       eoutput_char('\n');
+}
+
+static void    output_bench(t_benchres res)
+{
+       eoutput_str_ln("[Bench]");
+       eoutput_str("\tStrategy:\t");
+       eoutput_str_ln(res.strategy);
+       eoutput_str("\tPost-Opt:\t");
+       output_ops(res.post_opt);
+       eoutput_str("\tPre-Opt:\t");
+       output_ops(res.pre_opt);
+}
+
 #include <stdio.h>
 int    main(int argc, char **argv)
 {
@@ -129,13 +162,9 @@ int        main(int argc, char **argv)
        i = 1;
        while (i < argc)
                arg_step(argv[i++], &args);
-       args.disorder = compute_disorder(&args.state.a);
-       args.algo_func = algorithm_get(args.algo, args.disorder);
        res = pushswap_solve(&args);
+       output_bench(res);
        output_flush();
-       printf("pre: %lu\n", res.pre_opt.counters[OP_RR]);
-       printf("post: %lu\n", res.post_opt.counters[OP_RR]);
-       printf("num: %lu\n", args.disorder.num);
-       printf("den: %lu\n", args.disorder.den);
+       eoutput_flush();
        cheatexit(!stacks_is_solved(&args.state));
 }
diff --git a/numutils.c b/numutils.c
new file mode 100644 (file)
index 0000000..743d3b0
--- /dev/null
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   numutils.c                                         :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2025/12/18 14:58:14 by agilliar          #+#    #+#             */
+/*   Updated: 2025/12/18 15:00:37 by agilliar         ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "pushswap.h"
+
+void   eoutput_size(size_t n)
+{
+       if (n >= 10)
+               eoutput_size(n / 10);
+       eoutput_char("0123456789"[n % 10]);
+}
index 5622c8bd3d221bd2b20fd2e6d96ebf0fdd0db000..9892ee3f10ed9696f579a0dc500b8a1435c9bd5d 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/03 12:28:28 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/16 19:07:40 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/18 14:55:48 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -21,21 +21,8 @@ static void  op_output_inner(const char *data, t_stack *stack)
 static t_closure       op_output(t_op op)
 {
        t_closure                       res;
-       const char *const       ops[11] = {
-               "sa",
-               "sb",
-               "ss",
-               "pa",
-               "pb",
-               "ra",
-               "rb",
-               "rr",
-               "rra",
-               "rrb",
-               "rrr",
-       };
 
-       res.data = (void *) ops[op];
+       res.data = (void *) ops_str(op);
        res.func = &op_output_inner;
        return (res);
 }
diff --git a/ops.c b/ops.c
index 48fca72e3f1329d127fb2f6c3420f3ac99e981f1..5d8441b0a32846141b61d996677275c6133a50a0 100644 (file)
--- a/ops.c
+++ b/ops.c
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/03 10:57:30 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/11 16:58:11 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/18 17:16:20 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -59,3 +59,22 @@ t_ops        ops_init(t_closure (*gen)(t_op))
        }
        return (res);
 }
+
+const char     *ops_str(t_op op)
+{
+       const char *const       ops[11] = {
+               "sa",
+               "sb",
+               "ss",
+               "pa",
+               "pb",
+               "ra",
+               "rb",
+               "rr",
+               "rra",
+               "rrb",
+               "rrr",
+       };
+
+       return (ops[op]);
+}
index cac3466557caf60ed6b2c6f0d06d528818e1f255..d5794850fbf8ac29a377ae66ac7d2d1fbdc1e898 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: clefrere <clefrere@student.42.fr>          +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/02 11:02:44 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/18 14:07:48 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/18 16:04:35 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -117,6 +117,11 @@ void                       output_str(const char *s);
 void                   output_str_ln(const char *s);
 void                   output_flush(void);
 
+void                   eoutput_char(char c);
+void                   eoutput_str(const char *s);
+void                   eoutput_str_ln(const char *s);
+void                   eoutput_flush(void);
+
 t_stacks               stacks_new(void);
 bool                   stacks_is_solved(const t_stacks *stacks);
 void                   stacks_apply(t_stacks *stacks, const t_ops *ops,
@@ -142,6 +147,7 @@ t_op                        op_parse(t_slice s);
 t_closure              op_compose(t_closure first, t_closure second);
 t_ops                  ops_compose(t_ops lhs, t_ops rhs);
 t_ops                  ops_init(t_closure (*gen)(t_op));
+const char             *ops_str(t_op op);
 
 t_ops                  ops_stackops(void);
 t_ops                  ops_output(void);
@@ -161,7 +167,6 @@ t_slice                     slice_new(const char *s);
 t_slice                        slice_new_range(void *start, void *end);
 bool                   slice_eq(t_slice lhs, t_slice rhs);
 t_slice                        slice_split(t_slice *rem, char at);
-void                   slice_output(t_slice s);
 
 void                   leaf_top_a_a(const t_stacks *stacks, t_closure cb,
                                        size_t size);
@@ -175,6 +180,7 @@ void                        splitsort(const t_stacks *stacks, t_closure cb, size_t blocks);
 void                   algorithm_simple(const t_stacks *stacks, t_closure cb);
 void                   algorithm_medium(const t_stacks *stacks, t_closure cb);
 void                   algorithm_complex(const t_stacks *stacks, t_closure cb);
+void                   algorithm_stdin(const t_stacks *stacks, t_closure cb);
 
 t_frac                 frac_new(size_t num, size_t den);
 t_frac                 frac_mul(t_frac lhs, t_frac rhs);
@@ -182,4 +188,10 @@ bool                       frac_lt(t_frac lhs, t_frac rhs);
 
 t_frac                 compute_disorder(const t_stack *a);
 
+void                   eoutput_size(size_t n);
+
+void                   *ft_memcpy(void *restrict dest, const void *src, size_t n);
+
+bool                   get_next_op(t_op *res);
+
 #endif
diff --git a/slice.c b/slice.c
index 28536a655581ff2f0f277a6457922df37b59b88a..3a9ee8812a52cc1e475a3f2baaa89716c733d4e9 100644 (file)
--- a/slice.c
+++ b/slice.c
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/12/10 17:08:21 by agilliar          #+#    #+#             */
-/*   Updated: 2025/12/10 18:41:15 by agilliar         ###   ########.fr       */
+/*   Updated: 2025/12/18 14:34:34 by agilliar         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -65,9 +65,3 @@ t_slice       slice_split(t_slice *rem, char at)
        }
        return (res);
 }
-
-void   slice_output(t_slice s)
-{
-       while (s.len--)
-               output_char(*(s.ptr++));
-}