1329 – Șir Zigzag

De la Universitas MediaWiki

Sursa: [1]


Cerința

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

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

Date de ieșire

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

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

Exemplu 1

Intrare
5
1 5 3 7 5
Ieșire
DA

Explicație

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

Exemplu 2

Intrare
5
4 3 5 1 2
Ieșire
DA

Explicație

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

Exemplu 3

Intrare
5
4 3 2 1 2
Ieșire
NU

Explicație

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

Rezolvare

Rezolvare ver. 1

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.")

Rezolvare ver. 2

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

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

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

# initializam o variabila care va retine daca sirul este zigzag sau nu
este_zigzag = True

# 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.")
# afisam rezultatul
if este_zigzag:
    print("DA")
else:
    print("NU")
print("Datele sunt introduse corect.")