2102 - Robot 3

De la Universitas MediaWiki

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

Image.png

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

Să se scrie un program care rezolvă următoarele cerinţe:

Date de intrare

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

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

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:

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:

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:

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

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()