0522 - kSecventa1

From Bitnami MediaWiki
Revision as of 20:02, 14 May 2023 by Flaviu (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursa: 0522 - kSecventa1


Cerinţa

Se dă un vector cu n elemente, numere naturale, și un număr k. Să se stabilească dacă în vector există două secvențe de lungime k identice.

Date de intrare

Programul citește de la tastatură numerele n și k, iar apoi n numere naturale, reprezentând elementele vectorului.

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 Programul va afișa pe ecran numerele i j, i < j reprezentând pozițiile de început a două secvențe de lungime k identice, dacă există două astfel de secvențe, 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 ≤ k < n ≤ 1000, k este divizor al lui n
  • cele n numere citite vor fi mai mici decât 1000

Exemplu 1

Intrare
12 5
2 3 1 1 4 3 1 1 4 3 8 8
Ieșire
Datele sunt introduse corect.
2 6

Exemplu 2

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


Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 0522 - kSecventa1

def gaseste_secvente_identice(n, k, v):

   if n % k != 0:
       return "Datele nu corespund restricțiilor impuse."
   
   for i in range(0, n-k+1):
       if v[i:i+k] in [v[j:j+k] for j in range(i+1, n-k+1)]:
           return f"{i+1} {v.index(v[i:i+k], i+1)+1}"
   
   return "Nu exista secvente identice."

def valideaza_date_intrare(n, k, v):

   if not (1 <= k < n <= 1000 and n % k == 0):
       return False
   if any(x >= 1000 for x in v):
       return False
   return True

if __name__ == "__main__":

   n, k = map(int, input().split())
   v = list(map(int, input().split()))
   
   if valideaza_date_intrare(n, k, v):
       print("Datele sunt introduse corect.")
       print(gaseste_secvente_identice(n, k, v))
   else:
       print("Datele nu corespund restricțiilor impuse.")

</syntaxhighlight>

Explicatie Rezolvare

Funcția gaseste_secvente_identice primește trei argumente: n - numărul de elemente din șirul dat, k - lungimea secvenței identice și v - șirul de numere. Dacă n nu este un multiplu de k, funcția returnează un mesaj de eroare. Apoi, cu ajutorul două loop-uri, caută toate secvențele de lungime k și le compară cu toate secvențele de lungime k din dreapta sa. Dacă găsește o secvență identică, returnează pozițiile unde a fost găsită. Dacă nu găsește nicio secvență identică, funcția returnează un mesaj corespunzător.

Funcția valideaza_date_intrare primește aceleași argumente ca și gaseste_secvente_identice și verifică dacă datele de intrare corespund cerințelor problemei. Dacă nu respectă aceste condiții, funcția returnează False. Altfel, returnează True.

În if __name__ == "__main__": se citește de la tastatură valorile lui n, k și șirul v. Apoi, se verifică dacă datele sunt introduse corect cu ajutorul funcției valideaza_date_intrare. Dacă da, se afișează mesajul "Datele sunt introduse corect." și se apelează funcția gaseste_secvente_identice. Dacă nu, se afișează mesajul "Datele nu corespund restricțiilor impuse.".