4255 - Rotire Secvente

De la Universitas MediaWiki

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

Explicație:

Vectorul se împarte în 5 secvențe: (3 6 4), (7 6 6), (6 4 6), (7 6 6) și (4 4 5). Elementele din fiecare dintre ele se permută circular cu o poziție spre stânga și se obține secvențele (6 4 3), (6 6 7), (4 6 6), (6 6 7) și (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()