0522 - kSecventa1: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/522/ksecventa1 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 == Programul va afișa pe ecran numerele i j, i < j reprezentând pozițiile...)
 
Fără descriere a modificării
 
(Nu s-au afișat 5 versiuni intermediare efectuate de același utilizator)
Linia 6: Linia 6:
Programul citește de la tastatură numerele n și k, iar apoi n numere naturale, reprezentând elementele vectorului.
Programul citește de la tastatură numerele n și k, iar apoi n numere naturale, reprezentând elementele vectorului.
== Date de ieșire ==  
== Date de ieșire ==  
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, sau mesajul NU, dacă nu există două astfel de secvențe.
Dacă datele sunt introduse corect, pe ecran se va afișa:
Dacă există mai multe perechi de secvențe identice se vor considera cele cu numerele de ordine i j minime.
'''"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 ==
== Restricţii şi precizări ==
* 1 ≤ k < n ≤ 1000, k este divizor al lui n
* 1 ≤ k < n ≤ 1000, k este divizor al lui n
* cele n numere citite vor fi mai mici decât 1000
* cele n numere citite vor fi mai mici decât 1000
== Exemplu ==
== Exemplu 1 ==
; Intrare
; Intrare
: 12 5
: 12 5
: 2 3 1 1 4 3 1 1 4 3 8 8  
: 2 3 1 1 4 3 1 1 4 3 8 8  
; Ieșire
; Ieșire
: Datele sunt introduse corect.
: 2 6
: 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 ==  
Linia 22: Linia 31:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# 0522 - kSecventa1
# 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."


n, k = map(int, input().split())
def valideaza_date_intrare(n, k, v):
v = list(map(int, input().split()))
    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.")


found = False
</syntaxhighlight>
 
== Explicatie Rezolvare ==
for i in range(n - k + 1):
    for j in range(i + 1, n - k + 1):
        if v[i:i+k] == v[j:j+k]:
            print(i+1, j+1)
            found = True
            break
    if found:
        break


if not found:
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.
    print("NU")


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.


</syntaxhighlight>
Î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.".

Versiunea curentă din 14 mai 2023 20:02

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

# 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.")

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