4255 - Rotire Secvente
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 luin, a luikși celenelemente ale tablouluiafisare, care afișează pe ecran elementele tabloului, separate prin exact un spațiupermutare, care permută circular cu o poziție spre stânga elementele unei secvențe din tablou precizata prin cele două extremitățistșidr.
Î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,keste divizor al luin- cele
nnumere citite vor fi mai mici decât1000
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
<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>