4255 - Rotire Secvente

From Bitnami MediaWiki

Cerința[edit | edit source]

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[edit | edit source]

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

Date de ieșire[edit | edit source]

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

Restricții și precizări[edit | edit source]

  • 1 ≤ k < n ≤ 1000, k este divizor al lui n
  • cele n numere citite vor fi mai mici decât 1000

Exemplul 1[edit | edit source]

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[edit | edit source]

Input:

15 76

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

Output:

Restricții neîndeplinite.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> 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()

</syntaxhighlight>