4256 - Oglindire Secvente

From Bitnami MediaWiki
Revision as of 06:19, 11 December 2023 by Miawinator (talk | contribs)
(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 in secvențe disjuncte de lungime k. Să se oglindească elementele (primul element din secvență se interschimbă cu ultimul, al doilea cu penultimul, etc.) din fiecare dintre cele n/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
  • oglindire, care oglindește elementele unei secvențe dinr-un vector precizate 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 7 4 6 3 7 6 4 6 6 5 4 4 6 6

Explicație:

Vectorul se împarte în 3 secvențe de lungime 5: (3 6 4 7 6), (6 6 4 6 7)și (6 6 4 4 5). Elementele din fiecare dintre ele se oglindesc și se obține secvențele (6 7 4 6 3), (7 6 4 6 6) și (5 4 4 6 6).

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: "))
   
   # Read the entire line, split it into a list of strings, and convert each string to an integer
   vector = list(map(int, input().split()))
   return n, k, vector

def afisare(vector):

   print(" ".join(map(str, vector)))

def oglindire(st, dr, vector):

   while st < dr:
       vector[st], vector[dr] = vector[dr], vector[st]
       st += 1
       dr -= 1

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)
   # Oglindire si afisare vector modificat
   for i in range(0, n, k):
       st = i
       dr = min(i + k - 1, n - 1)
       oglindire(st, dr, vector)
   print("Vectorul dupa oglindire:")
   afisare(vector)

if __name__ == "__main__":

   main()

</syntaxhighlight>