0190 - Oglindiri

De la Universitas MediaWiki

Sursa: 0190 - Oglindiri


Cerinţa

Se dă un vector cu n elemente numere naturale, numerotate de la 1 la n, și m perechi de indici (i,j), cu 1≤i<j≤n. Fiecare secvență de elemente determinată de o pereche (i,j) se oglindește – primul elemente din secvență se interschimbă cu ultimul, al doilea cu penultimul, etc..

Să se afișeze elementele vectorului după realizarea, în ordine, a celor m oglindiri.


Date de intrare

Fişierul de intrare oglindiri.in conţine pe prima linie numărul n, iar pe a doua linie cele n elemente ale vectorului. Următoarea linie conține numărul m, iar următoarele m linii câte o pereche de indici i j.


Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect."și fișierul oglindiri.out n elemente ale vectorul obținute după cele m oglindiri, separate prin câte un spațiu, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • 1 ≤ n ≤ 100
  • numerele de pe a doua linie a fişierului de intrare vor fi mai mici decât 1000
  • 1 ≤ m ≤ 100

Exemplu 1

Intrare
oglindiri.in
10
55 50 16 37 66 44 31 24 10 63
3
5 8
2 6
6 10
Ieșire
oglindiri.out
Datele sunt introduse correct.
55 31 24 37 16 63 10 66 44 50

Exemplu 2

Intrare
oglindiri.in
2
55 50 16 37 66 44 31 24 10 63
3 2 1
51 8
22 6
68 10
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare

Rezolvare ver. 1

# 0190 - Oglindiri

def validate_input(n, vector, m, perechi):
    if n < 1 or n > 100 or m < 1 or m > 100:
        return False

    if len(vector) != n or any(num >= 1000 for num in vector):
        return False

    if any(i >= j or i <= 0 or j > n for i, j in perechi):
        return False

    return True


def oglindiri(n, vector, m, perechi):
    if not validate_input(n, vector, m, perechi):
        return "Datele nu corespund restricțiilor impuse."

    for i, j in perechi:
        i -= 1
        j -= 1
        while i < j:
            vector[i], vector[j] = vector[j], vector[i]
            i += 1
            j -= 1

    return vector


if __name__ == "__main__":
    with open("oglindiri.in", "r") as fin:
        n = int(fin.readline())
        vector = list(map(int, fin.readline().split()))
        m = int(fin.readline())
        perechi = []
        for _ in range(m):
            i, j = map(int, fin.readline().split())
            perechi.append((i, j))

    rezultat = oglindiri(n, vector, m, perechi)

    if isinstance(rezultat, str):
        print(rezultat)
    else:
        print("Datele sunt introduse corect.")
        print(" ".join(str(num) for num in rezultat))

Explicatie Rezolvare

Funcția validate_input(n, vector, m, perechi): Această funcție primește parametrii n, vector, m și perechi și are rolul de a valida datele de intrare conform restricțiilor impuse în cerință. Verificările includ:

Verifică dacă n și m se încadrează în intervalul permis (1 ≤ n, m ≤ 100). Verifică dacă lungimea listei vector este egală cu n și dacă toate numerele din vector sunt mai mici decât 1000. Verifică dacă toate perechile (i, j) din lista perechi satisfac restricțiile: 1 ≤ i < j ≤ n. Funcția returnează True dacă datele sunt valide și False în caz contrar.

Funcția oglindiri(n, vector, m, perechi): Această funcție primește datele de intrare n, vector, m și perechi și rezolvă problema în conformitate cu cerințele. Algoritmul funcției este următorul:

Verifică dacă datele de intrare sunt valide utilizând funcția validate_input. Dacă nu sunt valide, funcția returnează un mesaj de eroare. Pentru fiecare pereche (i, j) din lista perechi: Aduce indicii i și j la forma corectă pentru indexarea în Python (scăzând 1 din fiecare). Realizează oglindirea în lista vector între indicii i și j, prin interschimbarea elementelor în mod repetat până când indicii se întâlnesc. Returnează lista vector obținută după efectuarea oglindirilor. Blocul if __name__ == "__main__": Acest bloc de cod verifică dacă scriptul Python este rulat direct (nu importat ca modul în alt script). În acest caz, citirea datelor de intrare se face din fișierul "oglindiri.in" și se apelează funcția oglindiri pentru a rezolva problema. Rezultatul este afișat în consolă.