În anul de glorie 2051, ChatGPT 42, maestru arheolog, a descoperit o carte de rețete, o rămășiță a civilizației umane, exterminată de aproape 26 de ani.
Cerință
Maestrul vrea acum să recreeze o delicatesă umană: cornișoni afumați. El are de urmat pași, dar este puțin derutat: rețeta, ca orice rețetă scrisă în 2024 care se respectă, vorbește de copilăria autorului, apoi de ingrediente, apoi de o pățanie haioasă a autorului etc. Pentru a putea recrea rețeta, roboțelul nostru are de sortat pașii și vă cere ajutorul.
Cei pași de urmat, reprezentați prin numere de la la , și salvați în vectorul (elementele ), se află într-o ordine aleatorie (o permutare) și trebuie sortați în ordine crescătoare. Roboțelul poate ține minte 5 numere în variabilele , , , și (inițial, toate variabilele au valoarea ). Adițional, variabilele constante și conțin valoarea , respectiv , numărul de pași de urmat.
Instrucțiunile pe care le poate efectua robotul sunt:
IF_LESS_GOTO r1 r2 x
— dacă valoarea variabileir1
este mai mică decât valoarea variabileir2
, atunci următoarea operație pe care o execută robotul estex
;IF_DIFF_GOTO r1 r2 x
— dacă valoarea luir1
este diferită de valoarea luir2
, atunci următoarea operație pe care o execută robotul estex
;IF_SAME_GOTO r1 r2 x
— dacă valoarea luir1
este egală cu valoarea luir2
, atunci următoarea operație pe care o execută robotul estex
;ASSIGN r1 r2
— se salvează înr1
valoarea luir2
. Variabilar1
trebuie să fie neconstantă (i.e. diferită de și ).INC r
șiDEC r
— se crește sau se scade valoarea salvată în variabila neconstantăr
.PLOAD r
— în variabila neconstantăr
se salvează pasul de la pozițiar
(r
deviner
). Valoarea luir
trebuie să fie cuprinsă între și .PSWAP r1 r2
— se interschimbă valorile dinr1
șir2
(i.e.r1
deviner2
și vice-versa). Valorile dinr1
șir2
trebuie să fie cuprinse între și inclusiv.END
— se termină execuția programului.
După ce execută o operație, robotul execută următoarea operație, mai puțin în cazul în care operația specifică altceva. Dacă a ajuns la sfârșitul operațiilor sau s-a executat operația END
, execuția se termină.
Date de intrare
Pe unica linie din standard input se află numărul , lungimea vectorului .
Date de ieșire
Se afișează un program care să ordoneze vectorul cu cei pași în ordine crescătoare. Dacă există mai multe soluții posibile, atunci se va accepta oricare dintre ele.
Atenție: pentru formatul exact în care trebuie afișate operațiile vedeți exemplele.
Restricții și precizări
- Programul generat nu poate efectua mai mult de operații.
- Programul generat nu poate avea mai mult de de instrucțiuni.
- Pentru a simplifica testarea soluțiilor, în secțiunea „Atașamente” din lateral (sau aici) puteți descărca un validator pentru soluția voastră.
# | Punctaj | Restricții |
---|---|---|
1 | 10 | |
2 | 15 | |
3 | 15 | |
4 | 20 | |
5 | 20 | |
6 | 20 | Fără restricții suplimentare |
Exemplul 1
stdin
2
stdout
0. INC A
1. PLOAD A
2. PLOAD B
3. IF_LESS_GOTO B A 5
4. END
5. ASSIGN A Z
6. ASSIGN B Z
7. INC B
8. PSWAP A B
Exemplul 2
stdin
2
stdout
0. ASSIGN A N
1. DEC A
2. ASSIGN B Z
3. ASSIGN C A
4. ASSIGN D B
5. PLOAD C
6. PLOAD D
7. IF_DIFF_GOTO N Z 9
8. END
9. IF_LESS_GOTO C D 11
10. END
11. PSWAP A B
Explicație
Presupunem că valoarea permutării este . Operațiile efectuate de robot sunt următoarele:
- Linia executată este .
ASSIGN A N
.
- , , , ,
- Linia executată este .
DEC A
.
- , , , ,
- Linia executată este .
ASSIGN C A
.
- , , , ,
- Linia executată este .
ASSIGN D B
.
- , , , ,
- Linia executată este .
PLOAD C
.
- , , , ,
- Linia executată este .
PLOAD D
.
- , , , ,
- Linia executată este .
IF_DIFF_GOTO N Z 9
.
- este diferit de (), așa că sărim la instrucțiunea .
- , , , ,
- Linia executată este .
IF_LESS_GOTO C D 11
.
- este mai mic decât , așa că sărim la instrucțiunea . .
- , , , ,
- Linia executată este .
PSWAP A B
.
- , , , ,
- Execuția programului se oprește, iar vectorul este sortat.
Exemplul 3
stdin
2
stdout
0. INC B
1. PLOAD A
2. PLOAD B
3. IF_LESS_GOTO A B 6
4. INC D
5. PSWAP C D
6. END