1329 – Șir Zigzag

From Bitnami MediaWiki

Sursa: [1]


Cerința[edit | edit source]

Un şir se numeşte şir zigzag, dacă monotonia elementelor pe poziții succesive alternează între strict crescător și strict descrescător, adică a[1]>a[2]<a[3]>a[4] ... sau a[1]<a[2]>a[3]<a[4].... Se citeşe un şir cu n elemente. Să se verifice dacă este şir zigzag.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, iar apoi n numere naturale, reprezentând elementele șirului.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran unul dintre mesajele DA sau NU după cum șirul dat este şir zigzag sau nu.

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

  • 3 ≤ n ≤ 1000
  • 0 ≤ elementele şirului ≤ 1 000 000 000

Exemplu 1[edit | edit source]

Intrare
5
1 5 3 7 5
Ieșire
DA

Explicație[edit | edit source]

Avem relațiile 1 < 5 > 3 < 7 > 5, deci e vorba de un șir zigzag.

Exemplu 2[edit | edit source]

Intrare
5
4 3 5 1 2
Ieșire
DA

Explicație[edit | edit source]

Avem relațiile 4 > 3 < 5 > 1 < 2, deci e vorba de un șir zigzag.

Exemplu 3[edit | edit source]

Intrare
5
4 3 2 1 2
Ieșire
NU

Explicație[edit | edit source]

Primele trei elemente ale șirului nu își schimbă monotonia, deci nu e șir zigzag.

Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<syntaxhighlight lang="python" line> def citeste_numar_elemente():

   numar_elemente = int(input("Introduceti numarul de elemente din sir: "))
   if numar_elemente < 3 or numar_elemente > 1000:
       print("Numarul de elemente trebuie sa fie intre 3 si 1000")
       exit()
   return numar_elemente

def citeste_sir(numar_elemente):

   sir = list(map(int, input("Introduceti sirul de numere: ").split()))
   for numar in sir:
       if numar < 0 or numar > 1000000000:
           print("Numerele trebuie sa fie intre 0 si 1 000 000 000")
           exit()
   if len(sir) != numar_elemente:
       print(f"Numarul de elemente din sir trebuie sa fie {numar_elemente}")
       exit()
   return sir

def este_zigzag(sir):

   for i in range(1, len(sir) - 1):
       if not ((sir[i-1] < sir[i] and sir[i] > sir[i+1]) or (sir[i-1] > sir[i] and sir[i] < sir[i+1])):
           return False
   return True

if __name__ == "__main__":

   numar_elemente = citeste_numar_elemente()
   sir = citeste_sir(numar_elemente)
   print("Datele sunt introduse corect.")
   if este_zigzag(sir):
       print("DA")
   else:
       print("NU")
   print("Datele sunt introduse corect.")

</syntaxhighlight>

Rezolvare ver. 2[edit | edit source]

<syntaxhighlight lang="python" line>

  1. citim numarul de elemente din sir

numar_elemente = int(input("Introduceti numarul de elemente din sir: "))

  1. validam daca numarul de elemente se afla in intervalul permis

if numar_elemente < 3 or numar_elemente > 1000:

   print("Numarul de elemente trebuie sa fie intre 3 si 1000")
   exit()
  1. citim sirul de numere si validam ca fiecare element se afla in intervalul permis

sir = list(map(int, input("Introduceti sirul de numere: ").split())) for numar in sir:

   if numar < 0 or numar > 1000000000:
       print("Numerele trebuie sa fie intre 0 si 1 000 000 000")
       exit()
  1. initializam o variabila care va retine daca sirul este zigzag sau nu

este_zigzag = True

  1. parcurgem sirul si verificam monotonia triplurilor de elemente consecutive

for i in range(1, numar_elemente - 1):

   if not ((sir[i-1] < sir[i] and sir[i] > sir[i+1]) or (sir[i-1] > sir[i] and sir[i] < sir[i+1])):
       este_zigzag = False
       break

print("Datele sunt introduse corect.")

  1. afisam rezultatul

if este_zigzag:

   print("DA")

else:

   print("NU")

print("Datele sunt introduse corect.")

</syntaxhighlight>