GithubHelp home page GithubHelp logo

push_swap's Introduction

42 Cursus - push_swap

completion-with-bonus-badge

O objetivo deste projeto é estudar sobre algoritmos de ordenação e suas complexidades. A tarefa é 'simples': dada uma sequência de números aleatórios (posivitos e negativos, mas não repetidos), o programa deve organizá-los de forma crescente na pilha A usando apenas um conjunto de movimentos específicos e uma pilha auxiliar B. Opcionalmente também pode ser criado outro programa, o checker, que execute os movimentos informados pelo push_swap e valide se os números foram corretamente ordenados.

Movimentações

  • sa (swap a): Troca de posição os dois primeiros elementos da pilha A.

  • sb (swap b): Troca de posição os dois primeiros elementos da pilha B.

  • ss (swap a and swap b): Faz os movimentos sa e sb ao mesmo tempo.

  • pa (push a): Pega o primeiro elemento do topo da pilha B e coloca no topo da pilha A.

  • pb (push b): Pega o primeiro elemento do topo da pilha A e coloca no topo da pilha B.

  • ra (rotate a): Sobe todos os elementos da pilha A em 1 nível (o primeiro elemento se torna o último).

  • rb (rotate b): Sobe todos os elementos da pilha B em 1 nível (o primeiro elemento se torna o último).

  • rr (rotate a and rotate b): Faz os movimentos ra e rb ao mesmo tempo.

  • rra (reverse rotate a): Desce todos os elementos da pilha A em 1 nível (o último elemento se torna o primeiro).

  • rrb (reverse rotate b): Desce todos os elementos da pilha B em 1 nível (o último elemento se torna o primeiro).

  • rrr (reverse rotate a and reverse rotate b): Faz os movimentos rra e rrb ao mesmo tempo.

Requer conhecimento de estruturas de dados, algoritmos de ordenação e programação em C.


Push Swap

Através dos argumentos de linhas de comando (argv), o programa recebe os números inteiros positivos ou negativos, sem duplicatas, e executa os movimentos necessários para ordená-los. Apenas as instruções são impressas no terminal (stdout), e ao final delas, todos os números estarão em em ordem crescente na pilha A, enquanto a pilha B estará vazia.

Em caso de erro, como por exemplo no caso de entrada de números repetidos, que não caibam em um inteiro de 4 bytes, ou entradas não numéricas, o programa imprimirá "Error" através da saída padrão de erros (stderr).

Este projeto está conforme os padrões da Norminette (com exceção dos printers e comentários), e de acordo com as regras do desafio, sendo permitidas somente as funções write, read, malloc, free e exit, e proibidas as demais funções e bibliotecas.

Compilação e Execução

  1. Primeiro é necessário compilar:
make
  • A execução do comando make gera o programa push_swap.

O comando deve ser feito na raiz do projeto.

É necessário ter o make e o clang instalados.

  1. Agora é só executar o programa:
./push_swap 895 0 3 12 7

pb
pb
sa
ra
pa
pa
ra

Checker

Para conferir se um conjunto de instruções é válido ou não, pode ser utilizado o checker. Também por meio de linhas de comando (argv), o programa recebe os mesmos números utilizados no Push Swap, e através da entrada padrão (stdin), no terminal, são digitadas as operações. Se a pilha for corretamente ordenada, o Checker imprimirá "OK", caso contrário "KO".

Assim como o Push Swap, imprime "Error" na saída padrão de erros (stderr), e segue os padrões da Norminette e regras do desafio (funções permitidas: write, read, malloc, free e exit).

Compilação e Execução

  1. Primeiro é necessário compilar:
make bonus
  • A execução do comando make bonus gera o programa checker.

O comando deve ser feito na raiz do projeto.

É necessário ter o make e o clang instalados.

  1. Agora é só executar o programa:
  • Digite as instruções, uma a uma, enquanto o progrma estiver em execução.

  • Para interromper o processo, utilize o comando ctrl + D, e o resultado (OK ou KO) será impresso na tela.

./checker 895 0 3 12 7
pb
pb
sa
ra
pa
pa
ra

OK

Se a quantidade de instruções for muito grande, é possível passar a saída do Push Swap diretamente para o Checker:

./push_swap 7358 0 -1 3 | ./checker 7358 0 -1 3

OK

ou ainda:

NUM="7358 0 -1 3"; ./push_swap $NUM | ./checker $NUM

OK

Gerador de números

No terminal, utilize o comando:

shuf -i 0-1000 -n 30 | tr "\n" " "
  • -i (input range): Define o range, entre 0 e 1000.
  • -n (number): Quantidade de números exibidos a partir do primeiro.

Testers utilizados


Visualização

Visualizer

push_swap's People

Contributors

iw90 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.