1875 - Platou 1

De la Universitas MediaWiki

Sursă: [1]

Cerinţa

Se consideră un șir de cifre. Să se determine lungimea maximală a unei secvențe din șir formată din cifre egale.

Date de intrare

Fișierul de intrare platou1.in conține pe prima linie cifrele reprezentând termenii șirului, separate prin câte un spațiu.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.". Fișierul de ieșire platou1.out va conține pe prima linie două numere naturale k x, separate printr-un singur spațiu, k reprezentând lungimea secvenței determinate, iar x reprezentând termenul șirului din care este formată secvența. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricții și precizări

  • fișierul de intrare conține cel mult 1.000 de cifre, separate prin câte un spațiu, reprezentând termenii șirului dat;
  • dacă șirul conține mai multe secvențe cu lungimea maximală, se va afișa cel mai mic termen ce formează o astfel de secvență.

Exemple

Exemplu 1

platou1.in
3 8 8 8 8 9 9 9 2 5 5 5 5 7 6 6 6 6 8 8
'platou1.out
4 5

Explicatie

În fișierul de intrare sunt 3 secvențe cu lungimea maximă k=4, termenul cel mai mic fiind x=5.

Rezolvare

def verificare():
    numere = []
    with open('platou1.in', 'r') as fin:
        while True:
            numar = fin.readline().strip()
            if not numar:
                break
            try:
                numar = int(numar)
                if numar == 0:
                    break
                elif numar > 0 and numar < 1000:
                    print("Datele sunt corecte.")
                    numere.append(numar)
                else:
                    print("Datele nu sunt conform restricțiilor impuse.")
            except ValueError:
                print("Trebuie respectate cerintele.")
    return numere

def platou1(numere):
    with open('platou1.out', 'w') as fout:
        xmin = 10
        k = 0
        lg = 1
        x = numere[0]
        for y in numere[1:]:
            if x == y:
                lg += 1
            else:
                if k < lg:
                    k = lg
                    xmin = x
                elif k == lg and xmin > x:
                    xmin = x
                lg = 1
                x = y
        with open('platou1.out', 'w') as fout:
            fout.write(f"{k} {xmin}\n")

if _name_ == '_main_':
    numere = verificare()
    platou1(numere)

Explicații

Acest cod este scris în limbajul Python și constă din două funcții, verificare() și platou1(), și o secțiune if _name_ == '_main_'. Scopul programului este de a găsi cea mai lungă secvență consecutivă de numere identice dintr-o listă de numere citită dintr-un fișier și de a afișa lungimea acelei secvențe și cel mai mic număr din acea secvență.
Funcția verificare() primește datele de intrare din fișierul "platou1.in". Fiecare linie este citită și verificată dacă poate fi convertită într-un număr întreg. Numerele întregi pozitive mai mici decât 1000 sunt adăugate într-o listă numere, în timp ce numerele care nu îndeplinesc această cerință sunt ignorate. Dacă se întâlnește numărul zero, citirea se oprește și lista numere este returnată.
Funcția platou1() primește lista numere și deschide fișierul "platou1.out" pentru a scrie rezultatul. Folosind o buclă for, funcția compară fiecare element din listă cu elementul anterior. Dacă cele două elemente sunt identice, variabila lg este incrementată. Dacă nu sunt identice, variabila k este actualizată cu lungimea maximă de până acum a secvenței și variabila xmin este actualizată cu cel mai mic număr din secvența curentă dacă aceasta are aceeași lungime ca și secvența maximă până în acel moment. Lungimea secvenței curente este resetată la 1 și se trece la următorul număr din listă.
La final, funcția deschide fișierul "platou1.out" și scrie rezultatul sub formă de linie unică, care conține lungimea secvenței maxime și cel mai mic număr din acea secvență.
Secțiunea if _name_ == '_main_' verifică dacă acest script este rulat direct sau este importat ca modul în altă parte. Dacă este rulat direct, funcția verificare() este apelată pentru a citi datele din fișier și a construi lista de numere, iar apoi funcția platou1() este apelată cu această listă pentru a calcula și scrie rezultatul în fișierul "platou1.out".