4255 - Rotire Secvente

De la Universitas MediaWiki
Versiunea din 3 decembrie 2023 13:12, autor: Miawinator (discuție | contribuții) (Pagină nouă: = Cerința = Se dă un vector cu <code>n</code> elemente, numere naturale, și un număr <code>k</code>, divizor al lui <code>n</code>. Se împarte vectorul în <code>k</code> secvențe disjuncte, numerotate de la <code>1</code> la <code>k</code>. Să se permute circular cu o poziție spre stânga elementele din fiecare dintre cele <code>k</code> secvențe și să se afișeze pe ecran vectorul rezultat în urma acestor modificări. Se vor defini și apela următoarele subpro...)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

Cerința

Se dă un vector cu n elemente, numere naturale, și un număr k, divizor al lui n. Se împarte vectorul în k secvențe disjuncte, numerotate de la 1 la k. Să se permute circular cu o poziție spre stânga elementele din fiecare dintre cele k secvențe și să se afișeze pe ecran vectorul rezultat în urma acestor modificări.

Se vor defini și apela următoarele subprograme:

  • citire, care citește de la tastatură valoarea lui n, a lui k și cele n elemente ale tabloului
  • afisare, care afișează pe ecran elementele tabloului, separate prin exact un spațiu
  • permutare, care permută circular cu o poziție spre stânga elementele unei secvențe din tablou precizata prin cele două extremități st și dr.

În programele C/C++ nu se vor folosi variabile globale.

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

Se vor afișa pe ecran elementele tabloului după modificarea cerută, separate prin exact un spațiu.

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

Exemplul 1

Input:

15 5

3 6 4 7 6 6 6 4 6 7 6 6 4 4 5

Output:

6 4 3 6 6 7 4 6 6 6 6 7 4 5 4

Exemplul 2

Input:

15 76

3 6 4 7 6 6 6 4 6 7 6 6 4 4 5

Output:

Restricții neîndeplinite.

Rezolvare

def validate_input(n, k, vector):
    if not (1 < k < n <= 1000) or any(x >= 1000 for x in vector):
        print("Restricții neîndeplinite.")
        return False
    if n % k != 0:
        print("k trebuie să fie divizor al lui n.")
        return False
    return True

def citire():
    n = int(input("Introduceți n: "))
    k = int(input("Introduceți k: "))
    vector = list(map(int, input().split()))
    return n, k, vector

def afisare(vector):
    print(" ".join(map(str, vector)))

def permutare(st, dr, vector):
    lungime = dr - st + 1
    temp = vector[st:dr + 1]
    for i in range(st, dr + 1):
        vector[i] = temp[(i - st - 1) % lungime]

def main():
    n, k, vector = citire()

    # Verificare validitate input
    if not validate_input(n, k, vector):
        return

    # Afisare vector initial
    print("Vectorul initial:")
    afisare(vector)

    # Permutare si afisare vector modificat
    for _ in range(k):  
        for i in range(1, k + 1):
            st = (i - 1) * (n // k)
            dr = i * (n // k) - 1
            permutare(st, dr, vector)

    print("Vectorul dupa permutari:")
    afisare(vector)

if __name__ == "__main__":
    main()