0520 - Secventa2: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
Line 34: Line 34:
# 0520 - Secventa2
# 0520 - Secventa2


def validate_input(n, x):
def gaseste_secventa(x, y):
  if n < 1 or n > 1000:
    n = len(x)
  print("Datele nu corespund restricțiilor impuse.")
    m = len(y)
  return False
    cnt = 0
  if not any(num % 2 == 1 for num in x):
    for i in range(n-m+1):
  print("vectorul trebuie sa contina cel putin un element impar")
        j = 0
  return False
        while j < m and x[i+j] == y[j]:
for num in x:
            j += 1
  if num < 1 or num > 1000000:
        if j == m:
  print("Datele nu corespund restricțiilor impuse.")
            cnt += 1
  return False
    return cnt
return True


def sum_odd_elements(n, x):
if __name__ == "__main__":
first_odd = -1
    n = int(input())
last_odd = -1
    x = list(map(int, input().split()))
for i in range(n):
    m = int(input())
  if x[i] % 2 == 1:
    y = list(map(int, input().split()))
  if first_odd == -1:
    if n < m:
  first_odd = i
        print("Datele nu corespund restricțiilor impuse.")
  last_odd = i
    else:
return sum(x[first_odd:last_odd+1])
        cnt = gaseste_secventa(x, y)
        print("Datele sunt introduse corect.")
        print(cnt)


def read_input():
try:
n = int(input("Introduceti valoarea lui n: "))
x = list(map(int, input("Introduceti valorile vectorului, separate prin spatiu: ").split()))
if not validate_input(n, x):
print("Datele nu corespund restricțiilor impuse.")
return None, None
print("Datele sunt introduse corect.")
return n, x
except ValueError:
print("Datele nu corespund formatului așteptat.")
return None, None
if name == 'main':
n, x = read_input()
if n is not None and x is not None:
print(sum_odd_elements(n, x))




</syntaxhighlight>
</syntaxhighlight>
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==
Funcția citire() citește datele de intrare și le returnează ca o tuplă.
Codul implementează o funcție find_sequence care primește două liste de numere și returnează numărul de apariții ale celui de-al doilea vector în primul vector. Funcția începe prin a verifica dacă lungimea celui de-al doilea vector este mai mare decât cel dintâi, caz în care returnează 0 deoarece vectorul căutat nu poate fi mai lung decât vectorul în care căutăm.


Funcția secventa_in_x(n, x, m, y) primește dimensiunile și vectorii x și y și returnează numărul de apariții ale secvenței y în x.
În continuare, se parcurge vectorul x cu o buclă for și se verifică pentru fiecare element al lui x dacă acesta este egal cu primul element din vectorul y. Dacă da, se verifică dacă o secvență de lungime m începe din acel punct în vectorul x. Dacă secvența este găsită, se crește contorul count cu 1.


Funcția validare(cnt) afișează numărul de apariții ale secvenței y în x.
La final, se returnează valoarea contorului count, care reprezintă numărul de apariții ale secvenței y în vectorul x.


La final, avem blocul if __name__ == "__main__": care se ocupă de apelarea funcțiilor în ordinea necesară.
Funcția main citește datele de intrare, verifică dacă acestea corespund restricțiilor impuse, și apoi apelează funcția find_sequence pentru a găsi numărul de apariții ale secvenței. În funcție de rezultatul returnat de aceasta, afișează mesajul corespunzător.

Revision as of 21:10, 13 May 2023

Sursa: 0520 - Secventa2


Cerinţa

Se dă un vector x cu n elemente, numere naturale și un vector y cu m elemente, numere naturale. Să se determine de câte ori este vectorul y secvență în vectorul x.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n numere naturale, elementele vectorului x, apoi numărul m, iar apoi m numere naturale, elementele vectorului y.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou va afișa pe ecran numărul C, reprezentând valoarea cerută, 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 ≤ m ≤ n ≤ 1000

Exemplu 1

Intrare
10
8 5 8 5 8 3 8 5 8 6
3
8 5 8
Ieșire
Datele sunt introduse corect.
3

Exemplu 2

Intrare
11
2 3 4 5 7 1 8 3 2
2
1 2 1
Ieșire
Datele nu corespund restricțiilor impuse.
3

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 0520 - Secventa2

def gaseste_secventa(x, y):

   n = len(x)
   m = len(y)
   cnt = 0
   for i in range(n-m+1):
       j = 0
       while j < m and x[i+j] == y[j]:
           j += 1
       if j == m:
           cnt += 1
   return cnt

if __name__ == "__main__":

   n = int(input())
   x = list(map(int, input().split()))
   m = int(input())
   y = list(map(int, input().split()))
   if n < m:
       print("Datele nu corespund restricțiilor impuse.")
   else:
       cnt = gaseste_secventa(x, y)
       print("Datele sunt introduse corect.")
       print(cnt)


</syntaxhighlight>

Explicatie Rezolvare

Codul implementează o funcție find_sequence care primește două liste de numere și returnează numărul de apariții ale celui de-al doilea vector în primul vector. Funcția începe prin a verifica dacă lungimea celui de-al doilea vector este mai mare decât cel dintâi, caz în care returnează 0 deoarece vectorul căutat nu poate fi mai lung decât vectorul în care căutăm.

În continuare, se parcurge vectorul x cu o buclă for și se verifică pentru fiecare element al lui x dacă acesta este egal cu primul element din vectorul y. Dacă da, se verifică dacă o secvență de lungime m începe din acel punct în vectorul x. Dacă secvența este găsită, se crește contorul count cu 1.

La final, se returnează valoarea contorului count, care reprezintă numărul de apariții ale secvenței y în vectorul x.

Funcția main citește datele de intrare, verifică dacă acestea corespund restricțiilor impuse, și apoi apelează funcția find_sequence pentru a găsi numărul de apariții ale secvenței. În funcție de rezultatul returnat de aceasta, afișează mesajul corespunzător.