4255 - Rotire Secvente

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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()