0190 - Oglindiri: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
Line 33: Line 33:
: 55 31 24 37 16 63 10 66 44 50  
: 55 31 24 37 16 63 10 66 44 50  


== Exemplu 1 ==
== Exemplu 2 ==
; Intrare
; Intrare
: oglindiri.in
: oglindiri.in
Line 43: Line 43:
: 68  10  
: 68  10  
; Ieșire
; Ieșire
: oglindiri.out
: Datele nu corespund restricțiilor impuse.
: Datele nu corespund restricțiilor impuse.


Line 52: Line 51:
# 0190 - Oglindiri
# 0190 - Oglindiri


def read_input():
def validate_input(n, vector, m, perechi):
     try:
     if n < 1 or n > 100 or m < 1 or m > 100:
        n = int(input())
         return False
        v = list(map(int, input().split()))
        m = int(input())
        queries = []
        for i in range(m):
            i, j = map(int, input().split())
            queries.append((i, j))
         return n, v, m, queries
    except:
        print("Datele nu corespund restrictiilor impuse.")


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


def solve(n, v, m, queries):
    if any(i >= j or i <= 0 or j > n for i, j in perechi):
    try:
         return False
        for i, j in queries:
            i, j = i-1, j-1
            while i < j:
                v[i], v[j] = v[j], v[i]
                i += 1
                j -= 1
         return v
    except:
        print("Datele nu corespund restrictiilor impuse.")


    return True


def validate_output(result):
    print(*result)


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


if __name__ == '__main__':
    for i, j in perechi:
    input_data = read_input()
        i -= 1
    output_data = solve(*input_data)
        j -= 1
    if output_data:
        while i < j:
        validate_output(output_data)
            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))


</syntaxhighlight>
</syntaxhighlight>
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==
rima funcție, read_input(), citește datele de intrare și le returnează ca un tuplu.
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:


A doua funcție, solve(), primește datele de intrare și efectuează cele m operații de oglindire asupra vectorului v. În interiorul buclei while, interschimbăm elementele de la indicii i și j, apoi incrementăm i și decrementăm j. De notat că în Python indexarea începe de la 0, așa că trebuie să scădem 1 din fiecare dintre indicii i și j.
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.


A treia funcție, validate_output(), afișează elementele vectorului rezultat, separate prin spațiu.
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:


În final, dacă programul rulează ca script, citim datele de intrare cu read_input(), rezolvăm problema cu solve() și validăm rezultatul cu validate_output()
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ă.

Revision as of 21:11, 14 May 2023

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

Fişierul de ieşire oglindiri.out va conţine: Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou 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

<syntaxhighlight lang="python" line>

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

</syntaxhighlight>

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