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

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