Cornișoni afumați

Time limit: 0.2s Memory limit: 64MB Input: Output:

Î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 NN 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 NN pași de urmat, reprezentați prin numere de la 00 la N1N - 1, și salvați în vectorul VV (elementele V[0],,V[N1]V[0], \dots, V[N - 1]), 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 AA, BB, CC, DD și EE (inițial, toate variabilele au valoarea 00). Adițional, variabilele constante ZZ și NN conțin valoarea 00, respectiv NN, numărul de pași de urmat.

Instrucțiunile pe care le poate efectua robotul sunt:

  • IF_LESS_GOTO r1 r2 x — dacă valoarea variabilei r1 este mai mică decât valoarea variabilei r2, atunci următoarea operație pe care o execută robotul este x;
  • IF_DIFF_GOTO r1 r2 x — dacă valoarea lui r1 este diferită de valoarea lui r2, atunci următoarea operație pe care o execută robotul este x;
  • IF_SAME_GOTO r1 r2 x — dacă valoarea lui r1 este egală cu valoarea lui r2, atunci următoarea operație pe care o execută robotul este x;
  • ASSIGN r1 r2 — se salvează în r1 valoarea lui r2. Variabila r1 trebuie să fie neconstantă (i.e. diferită de ZZ și NN).
  • INC r și DEC 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ția r (r devine V[V[r]]). Valoarea lui r trebuie să fie cuprinsă între 00 și N1N - 1.
  • PSWAP r1 r2 — se interschimbă valorile din V[V[r1]] și V[V[r2]] (i.e. V[V[r1]] devine V[V[r2]] și vice-versa). Valorile din r1 și r2 trebuie să fie cuprinse între 00 și N1N - 1 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 NN, lungimea vectorului VV.

Date de ieșire

Se afișează un program care să ordoneze vectorul VV cu cei NN 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

  • 2n100 0002 \le n \le 100\ 000
  • Programul generat nu poate efectua mai mult de 51065 \cdot 10^6 operații.
  • Programul generat nu poate avea mai mult de 1 0001\ 000 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 N=3N=3
2 15 N=4N=4
3 15 N15N\le 15
4 20 N100N\le 100
5 20 N5 000N\le 5\ 000
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 V={1,0}V = \{1,0\}. Operațiile efectuate de robot sunt următoarele:

  1. Linia executată este 00. ASSIGN A N.
  • V={1,0}V = \{ 1, 0 \}
  • A=2A = 2, B=0B = 0, C=0C = 0, D=0D = 0, E=0E = 0
  1. Linia executată este 11. DEC A.
  • V={1,0}V = \{ 1, 0 \}
  • A=1A = 1, B=0B = 0, C=0C = 0, D=0D = 0, E=0E = 0
  1. Linia executată este 33. ASSIGN C A.
  • $V = { 1, 0 }
  • A=1A = 1, B=0B = 0, C=1C = 1, D=0D = 0, E=0E = 0
  1. Linia executată este 44. ASSIGN D B.
  • V={1,0}V = \{ 1, 0 \}
  • A=1A = 1, B=0B = 0, C=1C = 1, D=0D = 0, E=0E = 0
  1. Linia executată este 55. PLOAD C.
  • V={1,0}V = \{ 1, 0 \}
  • A=1A = 1, B=0B = 0, C=0C = 0, D=0D = 0, E=0E = 0
  1. Linia executată este 66. PLOAD D.
  • V={1,0}V = \{ 1, 0 \}
  • A=1A = 1, B=0B = 0, C=0C = 0, D=1D = 1, E=0E = 0
  1. Linia executată este 77. IF_DIFF_GOTO N Z 9.
  • NN este diferit de ZZ (202 \neq 0), așa că sărim la instrucțiunea 99.
  • V={1,0}V = \{ 1, 0 \}
  • A=1A = 1, B=0B = 0, C=0C = 0, D=1D = 1, E=0E = 0
  1. Linia executată este 99. IF_LESS_GOTO C D 11.
  • CC este mai mic decât DD, așa că sărim la instrucțiunea 1111. V={1,0}V = \{ 1, 0 \}.
  • A=1A = 1, B=0B = 0, C=0C = 0, D=1D = 1, E=0E = 0
  1. Linia executată este 1111. PSWAP A B.
  • V={0,1}V = \{ 0, 1 \}
  • A=1A = 1, B=0B = 0, C=0C = 0, D=1D = 1, E=0E = 0
  1. Execuția programului se oprește, iar vectorul V={0,1}V = \{0, 1\} 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

Log in or sign up to be able to send submissions!