4255 - Rotire Secvente

From Bitnami MediaWiki
Revision as of 13:12, 3 December 2023 by Miawinator (talk | contribs) (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...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

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