GithubHelp home page GithubHelp logo

amauricoder / 42_push_swap Goto Github PK

View Code? Open in Web Editor NEW
3.0 1.0 0.0 5.34 MB

his project will make you sort data on a stack, with a limited set of instructions.

License: Other

Makefile 4.32% C 95.68%
42 42porto 42school c pushswap sortingalgorithms

42_push_swap's Introduction

Push_Swap

Banner
"This project will make you sort data on a stack, with a limited set of instructions, using the lowest possible number of actions. To succeed it's necessary to manipulate various types of algorithms and choose the most appropriate solution (out of many) for an optimized data sorting."

Table of contents

Introduction

The Push Swap project presents a simple yet essential algorithmic task: sorting data efficiently. In this project, we work with a collection of integer values, two stacks, and a set of instructions to manipulate these stacks. Our objective is to develop a C program named push_swap that determines and outputs the shortest sequence of Push Swap language instructions required to sort the given integers.

The code was written according to the 42 norm guidelines(norminette)

Usage

  1. On your terminal, clone the repository
git clone [email protected]:amauricoder/42_Push_Swap.git
  1. Considering that you already have cloned the repository, do make bonus
make bonus

This will generate a checker program in your bonus folder, this is the executable of the bonus program.

  1. Run the program with the numbers you want as parameters
./push_swap 5 -10 13

This will return the moviments necessary to organize the stack. To know more about the rules for moviments, see Subject

Sorting algorithm

This code was written based on an article by A. Yigit Ogun. Click Here if you want to check it out.
A. Yigit Ogun called this "The Turc Algorithm". Essentially, he determines the optimal sequence of moves required to arrange a set of numbers in order, and then performs the sorting accordingly. This method prioritizes efficiency by minimizing the number of moves needed to put the stack in order.

How does "The Turc Algorithm" works ??

First of all: for the turc algorithm to work we need to have more than 3 numbers on the stack. If we have 3 numbers only, we use a simple sort three algorithm, that is based on all the exiting possibilities to sort 3 numbers. If we have only 2 numbers, then we use a simple "sa", that changes the position of the first and second number of stack a.
Again, to know more about the moviments and the rules, please check Subject.
If we have more than 3 numbers, the turc algorithm takes action. Explaining in a very simple and direct form how it works:

  • Transfer all elements from STACK_A to STACK_B in descending order. This rearrangement is intended to facilitate automatic sorting when the elements are subsequently pushed back to STACK_A.
  • We perform the transfer from STACK_A to STACK_B until STACK A contains only three numbers.
  • When STACK_A is only with the 3 numbers, we perform a sort three algorithm on STACK_A and send the numbers of STACK_B back to STACK_A.

For a more detailed explanation, I highly recommend for you too read the article Here.
Below, there is an illustration of how this algorithm works.
push_swap_visualizer
If you want to test the program like this, check the push_swap visualizer.

Bonus

The bonus requires the creation of a program that reproduces the behaviour of the checker, but not 100% equally. The checker is a program that is given by the 42 school to check if the numbers are sorted.

Bonus Usage

  1. On your terminal, clone the repository
git clone [email protected]:amauricoder/42_Push_Swap.git
  1. Considering that you already have cloned the repository, do make bonus
make bonus

This will generate a checker file in the bonus folder, this is the executable of the bonus program.

  1. Run the bonus program with the numbers you want as parameters (Please, check bonus behaviour topic below for more details about the usage of this program).
./bonus/checker 5 -10 13

Bonus Behaviour

Upon executing the program, you'll be prompted to input valid movements via the terminal. These movements will determine whether the stack becomes organized as a result. If the moviment organizes the stack, it will give you an "Ok" as result. If not, it will give you an "KO". If the input is invalid, it will give you an "Error". Since this bonus part we were asked to create a checker, but not 100% equal to the original checker, I've decided to put some extra features on it.
To access these features, use the following flags on the execution.

-s -c
print the stacks print in color the last moviment that took action

Examples of usage of the checker program below:

Normal Usage

checker 1

Using -s flag

checker 2

Using -c flag alone and -s and -c together

checker 3

Makefile Overview

In this project, the Makefile offers the following essential rules:

  • make: Compiles the project to push_swap on root folder.
  • make clean: Cleans the directory by removing .o files, preserving push_swap executable.
  • make fclean: Completely cleans the directory by deleting both .o files and push_swap.
  • make re: Refreshes push_swap by recompiling everything.
  • make valgrind: Checks for memory leaks(Valgrind program required).
  • make bonus: Compiles the bonus part to checker on the bonus folder.
  • make bonus_clean: Clean the bonus .o files, preserving the checker executable.
  • make bonus_fclean: Completely cleans the bonus directory by deleting both .o files and checker.

License and Thoughtful Advice

View License

Stop deceiving yourself. Mere ability to copy code doesn't enhance your skills. This is outside the scope of school purposes. Everyone can be a "copy paster," but not everyone can be a programmer. Good luck!

42_push_swap's People

Contributors

amauricoder avatar

Stargazers

 avatar Marcelo Fassbinder Martins avatar Vinicius Vaccari avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.