0190 - Oglindiri: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/190/oglindiri 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. == D...
 
 
(3 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 pe prima linie cele n elemente ale vectorul obținute după cele m oglindiri, separate prin câte un spațiu.
 
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 ==
== Restricţii şi precizări ==
Line 18: Line 20:
* 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 27: Line 30:
: 6 10  
: 6 10  
; Ieșire
; Ieșire
: oglindiri.out
: 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 34: Line 52:
# 0190 - Oglindiri
# 0190 - Oglindiri


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


    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):
     for i, j in queries:
        return False
         i, j = i-1, j-1
 
    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:
         while i < j:
             v[i], v[j] = v[j], v[i]
             vector[i], vector[j] = vector[j], vector[i]
             i += 1
             i += 1
             j -= 1
             j -= 1
     return v
 
     return vector




def validate_output(result):
if __name__ == "__main__":
    print(*result)
    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 __name__ == '__main__':
    if isinstance(rezultat, str):
    input_data = read_input()
        print(rezultat)
     output_data = solve(*input_data)
     else:
    validate_output(output_data)
        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]

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]

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]

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]

  • 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]

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]

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]

Rezolvare ver. 1[edit]

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

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