summaryrefslogtreecommitdiff
path: root/src/rotate_stacks.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rotate_stacks.c')
-rw-r--r--src/rotate_stacks.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/rotate_stacks.c b/src/rotate_stacks.c
new file mode 100644
index 0000000..b66c487
--- /dev/null
+++ b/src/rotate_stacks.c
@@ -0,0 +1,96 @@
+/*
+sort_stack Copyright (C) 2026 yctct
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+
+#include "../include/push_swap.h"
+
+void double_rrr(int position_a, int position_b, t_list **src, t_list **dst)
+{
+ int i;
+
+ while ((ft_lstsize(*src) != position_a) && (ft_lstsize(*dst)) != position_b)
+ {
+ rrr(src, dst);
+ position_a++;
+ position_b++;
+ }
+ i = 0;
+ while (i++ < (ft_lstsize(*dst)) - position_b)
+ rrb(dst);
+ i = 0;
+ while (i++ < (ft_lstsize(*src)) - position_a)
+ rra(src);
+}
+
+void double_rr(int position_a, int position_b, t_list **src, t_list **dst)
+{
+ int i;
+
+ while (position_a && position_b)
+ {
+ rr(src, dst);
+ position_a--;
+ position_b--;
+ }
+ i = 0;
+ while (i++ < position_b)
+ rb(dst);
+ i = 0;
+ while (i++ < position_a)
+ ra(src);
+}
+
+void single_r(int position_a, int position_b, t_list **src, t_list **dst)
+{
+ int i;
+
+ i = 0;
+ if (position_b > ft_lstsize(*dst) / 2)
+ {
+ while (i++ < (ft_lstsize(*dst)) - position_b)
+ rrb(dst);
+ }
+ else
+ {
+ while (i++ < position_b)
+ rb(dst);
+ }
+ i = 0;
+ if (position_a > ft_lstsize(*src) / 2)
+ {
+ while (i++ < (ft_lstsize(*src)) - position_a)
+ rra(src);
+ }
+ else
+ {
+ while (i++ < position_a)
+ ra(src);
+ }
+}
+
+void rotate_stacks(int position_a, int position_b, t_list **src,
+ t_list **dst)
+{
+ if ((position_a > ft_lstsize(*src) / 2) && (position_b > ft_lstsize(*dst)
+ / 2))
+ double_rrr(position_a, position_b, src, dst);
+ else if ((position_a < ft_lstsize(*src) / 2)
+ && (position_b < ft_lstsize(*dst) / 2))
+ double_rr(position_a, position_b, src, dst);
+ else
+ single_r(position_a, position_b, src, dst);
+}