mirror of https://github.com/01-edu/public.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
4.8 KiB
164 lines
4.8 KiB
5 years ago
|
## push-swap
|
||
|
|
||
|
### Objectives
|
||
|
|
||
|
Push_swap is a very simple and highly effective algorithm.You have at your disposal a list of `int` values, two stacks (`a` and `b`) and a set of instructions.
|
||
|
|
||
5 years ago
|
You will have to write 2 programs:
|
||
5 years ago
|
|
||
|
- **push_swap**, which calculates and displays on the standard output the smallest program using push_swap instruction language that sorts integer arguments received.
|
||
|
- **checker**, which takes integer arguments and reads instructions on the standard output. Once read, checker executes them and displays `OK` if integers are sorted. Otherwise, it will display `KO`.
|
||
|
|
||
|
As said before, you will have two stacks at your disposal. Your goal is to sort stack `a`, that will contain the `int` values received, in ascending order, using both stacks and a set of instructions.
|
||
|
|
||
|
These are the instructions that you can use to sort the stack :
|
||
|
|
||
|
- `pa` push the top first element of stack `b` to stack `a`
|
||
|
- `pb` push the top first element of stack `a` to stack `b`
|
||
|
- `sa` swap first 2 elements of stack `a`
|
||
|
- `sb` swap first 2 elements of stack `b`
|
||
|
- `ss` execute `sa` and `sb`
|
||
|
- `ra` rotate stack `a` (shift up all elements of stack `a` by 1, the first element becomes the last one)
|
||
|
- `rb` rotate stack `b`
|
||
|
- `rr`execute `ra` and `rb`
|
||
5 years ago
|
- `rra` reverse rotate `a` (shift down all elements of stack `a` by 1, the last element becomes the first one)
|
||
5 years ago
|
- `rrb` reverse rotate `b`
|
||
|
- `rrr` execute `rra` and `rrb`
|
||
|
|
||
|
#### Example
|
||
|
|
||
|
```console
|
||
|
Init a and b :
|
||
|
2
|
||
|
1
|
||
|
3
|
||
|
6
|
||
|
8
|
||
|
5
|
||
|
= =
|
||
|
a b
|
||
|
---------------------------------------
|
||
|
Exec sa :
|
||
|
1
|
||
|
2
|
||
|
3
|
||
|
6
|
||
|
8
|
||
|
5
|
||
|
= =
|
||
|
a b
|
||
|
---------------------------------------
|
||
|
Exec pb pb pb :
|
||
|
6 3
|
||
|
8 2
|
||
|
5 1
|
||
|
= =
|
||
|
a b
|
||
|
---------------------------------------
|
||
5 years ago
|
Exec rb :
|
||
|
6 2
|
||
|
8 1
|
||
|
5 3
|
||
5 years ago
|
= =
|
||
|
a b
|
||
|
---------------------------------------
|
||
|
Exec rra and rrb (equivalent to rrr):
|
||
5 years ago
|
5 3
|
||
5 years ago
|
6 2
|
||
5 years ago
|
8 1
|
||
5 years ago
|
= =
|
||
|
a b
|
||
|
---------------------------------------
|
||
|
Exec pa pa pa:
|
||
|
1
|
||
|
2
|
||
|
3
|
||
|
5
|
||
|
6
|
||
|
8
|
||
|
= =
|
||
|
a b
|
||
|
```
|
||
|
|
||
|
This project will help you learn about :
|
||
|
|
||
|
- the use of basic algorithms
|
||
|
- the use of sorting algorithms
|
||
|
- the use of stacks
|
||
|
|
||
|
#### The push_swap program
|
||
|
|
||
|
- You have to write a program named push_swap, which will receive as an argument the stack a formatted as a list of integers. The first integer should be at the top of the stack.
|
||
|
- The program must display the smallest list of instructions possible to sort the stack `a`, with the smallest number being at the top.
|
||
|
- Instructions must be separated by a `\n` and nothing else.
|
||
|
- The goal is to sort the stack with the minimum possible number of operations.
|
||
|
- In case of error, you must display `Error` followed by a `\n` on the standard error. Errors are understood as: some arguments aren’t integers and/or there are duplicates.
|
||
|
- In case of there are no arguments the program displays nothing (0 instructions).
|
||
|
|
||
|
```console
|
||
5 years ago
|
student$ ./push_swap "2 1 3 6 5 8"
|
||
5 years ago
|
sa
|
||
|
pb
|
||
|
pb
|
||
|
pb
|
||
|
sa
|
||
|
pa
|
||
|
pa
|
||
|
pa
|
||
5 years ago
|
student$ ./push_swap "0 one 2 3"
|
||
5 years ago
|
Error
|
||
5 years ago
|
student$ ./push_swap
|
||
5 years ago
|
student$
|
||
|
```
|
||
|
|
||
|
#### The checker program
|
||
|
|
||
|
- You have to write a program named checker, which will get as an argument the stack `a` formatted as a list of integers. The first argument should be at the top of the stack (be careful about the order). If no argument is given, checker stops and displays nothing.
|
||
|
- Checker will then read instructions on the standard input, each instruction will be followed by `\n`. Once all the instructions have been read, checker will execute them on the stack received as an argument.
|
||
|
- If after executing those instructions, stack `a` is actually sorted and `b` is empty, then checker must display "OK" followed by a `\n` on the standard output. In every other case, checker must display "KO" followed by a `\n` on the standard output.
|
||
|
- In case of error, you must display Error followed by a `\n` on the standard error. Errors include for example: some arguments are not integers, there are duplicates, an instruction don’t exist and/or is incorrectly formatted.
|
||
|
- In case of there are no arguments the program displays nothing.
|
||
|
|
||
|
```console
|
||
5 years ago
|
student$ ./checker "3 2 1 0"
|
||
|
sa
|
||
|
rra
|
||
|
pb
|
||
|
KO
|
||
|
student$ echo -e "rra\npb\nsa\n" | ./checker "3 2 one 0"
|
||
|
Error
|
||
5 years ago
|
student$ echo -e "rra\npb\nsa\nrra\npa"
|
||
5 years ago
|
rra
|
||
|
pb
|
||
|
sa
|
||
|
rra
|
||
|
pa
|
||
5 years ago
|
student$ echo -e "rra\npb\nsa\nrra\npa" | ./checker "3 2 1 0"
|
||
5 years ago
|
OK
|
||
5 years ago
|
student$ ./checker
|
||
5 years ago
|
student$
|
||
|
```
|
||
|
|
||
5 years ago
|
### Allowed packages
|
||
|
|
||
|
- Only the [standard go](https://golang.org/pkg/) packages are allowed
|
||
|
|
||
5 years ago
|
### Instructions
|
||
|
|
||
|
- Your project must be written in **Go**.
|
||
5 years ago
|
- The code must respect the [**good practices**](https://public.01-edu.org/subjects/good-practices.en).
|
||
5 years ago
|
- It is recommended that the code should present a **test file**.
|
||
|
- The first executable file must be named **checker** and the second **push_swap**.
|
||
|
- You have to be able to handle the errors.
|
||
|
|
||
|
### Usage
|
||
|
|
||
|
```console
|
||
5 years ago
|
student$ ARG="4 67 3 87 23"; ./push_swap "$ARG" | wc -l
|
||
5 years ago
|
6
|
||
5 years ago
|
student$ ARG="4 67 3 87 23"; ./push_swap "$ARG" | ./checker "$ARG"
|
||
5 years ago
|
OK
|
||
|
```
|
||
|
|
||
|
If the program checker displays KO, it means that your **push_swap** came up with a list of instructions that doesn't sort the list.
|