0190 - Oglindiri: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
 
(2 intermediate revisions by one other user not shown)
Line 12: Line 12:


== Date de ieșire ==  
== 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:  
Dacă datele sunt introduse corect, pe ecran se va afișa:  
'''"Datele sunt introduse corect."''', apoi pe un rând nou '''numărul c''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''.
'''"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 ==
== Restricţii şi precizări ==
* 1 ≤ n ≤ 100
* 1 ≤ n ≤ 100
* numerele de pe a doua linie a fişierului de intrare vor fi mai mici decât 1000
* numerele de pe a doua linie a fişierului de intrare vor fi mai mici decât 1000
* 1 ≤ m ≤ 100
* 1 ≤ m ≤ 100
== Exemplu ==
== Exemplu ==
; Intrare
; Intrare
: oglindiri.in
: 10
: 10
: 55 50 16 37 66 44 31 24 10 63  
: 55 50 16 37 66 44 31 24 10 63  
Line 28: Line 30:
: 6 10  
: 6 10  
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: oglindiri.out
: Datele sunt introduse correct.
: Datele sunt introduse correct.
: 55 31 24 37 16 63 10 66 44 50  
: 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 ==  
Line 37: Line 52:
# 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())
    if len(vector) != n or any(num >= 1000 for num in vector):
        queries = []
        return False
        for i in range(m):
 
            i, j = map(int, input().split())
    if any(i >= j or i <= 0 or j > n for i, j in perechi):
            queries.append((i, j))
         return False
         return n, v, m, queries
 
     except:
     return True
        print("Datele nu corespund restrictiilor impuse.")
 


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


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


    return vector


def validate_output(result):
    print(*result)


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


if __name__ == '__main__':
     rezultat = oglindiri(n, vector, m, perechi)
     input_data = read_input()
    output_data = solve(*input_data)
    if output_data:
        validate_output(output_data)


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

Latest revision as of 22:03, 14 May 2023

Sursa: 0190 - Oglindiri


Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<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[edit | edit source]

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