2102 - Robot 3
Paul dorește să învețe cum să programeze un robot. Pentru început s-a gândit să construiască un robot format dintr-un mâner, 10
butoane aranjate circular şi un ecran. Pe butoane sunt scrise, în ordine crescătoare, cifrele de la 0
la 9
, ca în figură.
stanga|miniatura
Un roboprogram va fi format dintr-o secvenţă de instrucţiuni. Instrucțiunile pot fi:
Iniţial mânerul robotului este plasat în dreptul butonului 0
, iar ecranul este gol.
De exemplu, în urma executării roboprogramului D4AS1AAD6AT
robotul apasă butoanele pe care sunt scrise cifrele 4, 3, 3, 9,
iar pe ecran va apărea 4339
.
Cerințe[edit | edit source]
Să se scrie un program care rezolvă următoarele cerinţe:
Date de intrare[edit | edit source]
Fişierul de intrare robot3.in
conţine pe prima linie un număr natural C
, reprezentând cerinţa care urmează să fie rezolvată (1, 2 sau 3)
. Dacă C=1
sau C=2
, pe a doua linie a fişierului se află un roboprogram. Dacă C=3
, pe a doua linie a fişierului de intrare se află numărul natural N
.
Date de ieșire[edit | edit source]
Fişierul de ieşire robot3.out
va conţine o singură linie. Dacă C=1
, pe prima linie se va scrie un număr natural reprezentând numărul de cifre afişate pe ecran după executarea roboprogramului din fişierul de intrare.
Dacă C=2
, pe prima linie vor fi scrise cifrele afișate pe ecran în urma executării roboprogramului din fişierul de intrare. Dacă C=3
, pe prima linie va fi scris roboprogramul solicitat de cerinţa 3
.
Restricții și precizări[edit | edit source]
• 0 ≤ N ≤ 1000000000
• Lungimea roboprogramului citit din fişierul de intrare sau scris în fişierul de ieşire este cel mult 1000
de caractere.
• Dacă mânerul este plasat în dreptul butonului 0
şi se deplasează spre dreapta, se va îndrepta către butonul 1
; dacă deplasarea este spre stânga, se va îndrepta către butonul 9
.
• Pentru rezolvarea corectă a primei cerinţe se acordă 10 puncte, pentru rezolvarea corectă a celei de a doua cerințe se acordă 30 de puncte, iar pentru rezolvarea corectă a celei de a treia cerințe se acordă 50 de puncte. 10 puncte se acordă din oficiu.
Exemplul 1:[edit | edit source]
robot3.in
1 D1AD2AS1AT
robot3.out
3
C=1
, pentru acest test se rezolvă cerința 1
.
Se afişează pe ecran 3 cifre (132)
Exemplul 2:[edit | edit source]
robot3.in
2 S0AD2AS1AT
robot3.out
021
C=2
, pentru acest test se rezolvă cerința 2
.
Mânerul robotului se deplasează cu 0
unități la stânga, deci rămâne în dreptul butonului 0
și apasă, apoi se deplasează 2
unități spre dreapta şi ajunge în dreptul butonului 2
, apasă, apoi se deplasează 1
unitate la stânga și ajunge în dreptul butonului 1
și apasă acest buton → 021
.
Exemplul 3:[edit | edit source]
robot3.in
3 19332
robot3.out
D1AS2AD4AAS1AT
C=3
, pentru acest test se rezolvă cerința 3
. Pentru a afișa cifra 1
, mânerul robotului se deplasează 1
unitate la dreapta după care apasă (D1A)
. Pentru a afișa cifra 9
, din poziția curentă mânerul robotului se deplasează 2
unități la stânga şi apasă (S2A)
. Pentru a afișa cifra 3
, din poziția curentă mânerul robotului se deplasează 4
unități la dreapta după care apasă (D4A)
. Pentru a afișa a doua cifra 3
, mânerul robotului rămâne în poziția curentă și apasă butonul. Pentru a afișa cifra 2
, din poziția curentă mânerul robotului se deplasează 1
unitate la stânga după care apasă (S1A)
. Programul se termină cu instrucțiunea T → D1AS2AD4AAS1AT
<syntaxhighlight lang="python3">
def main():
# Deschidem fisierul de intrare si iesire with open("robot.in", "r") as fin, open("robot.out", "w") as fout: # Citim numarul de cazuri de test 'numar_c'. numar_c = int(fin.readline().strip())
# Citim sirul 'numar_a' de caractere A, S, D. numar_a = fin.readline().strip()
# Definim functia 'rezultat' care va scriem rezultatul in fisier in functie de diferenta dintre doua caractere. def rezultat(a, b): if a == b: fout.write('A') elif a < b: if b - a <= (a + 10 - b) % 10: fout.write(f'D{b - a}A') elif b - a > (a + 10 - b) % 10: fout.write(f'S{(a + 10 - b) % 10}A') else: if a - b < (b + 10 - a) % 10: fout.write(f'S{a - b}A') else: fout.write(f'D{(b + 10 - a) % 10}A')
# Verificam tipul de operatie specificat de 'numar_c'. if numar_c == 1: # Calculam numarul de A-uri si il scriem in fisier. numar = numar_a.count('A') fout.write(str(numar)) elif numar_c == 2: # Calculam pozitia finala in functie de operatiile S si D si o scriem in fisier. pozitie = 0 for i in range(len(numar_a)): if numar_a[i] == 'S': variabila = int(numar_a[i + 1]) pozitie = (pozitie + 10 - variabila) % 10 elif numar_a[i] == 'D': variabila = int(numar_a[i + 1]) pozitie = (pozitie + variabila) % 10 elif numar_a[i] == 'A': fout.write(str(pozitie)) elif numar_c == 3: # Calculam rezultatul pentru fiecare pereche de caractere si scriem 'T' la final. rezultat(0, int(numar_a[0])) for i in range(1, len(numar_a)): rezultat(int(numar_a[i - 1]), int(numar_a[i])) fout.write('T')
if __name__ == "__main__":
main()
</syntaxhighlight>