1878 - Nr Asoc

De la Universitas MediaWiki

Sursă: [1]

Cerinţa

Se consideră un șir ai cărui termeni sunt numere naturale nenule, de o singură cifră. Numim număr asociat al acestui șir un număr natural format cu termenii șirului, în ordinea în care aceștia apar în șir. Se cere determinarea unui șir obținut prin eliminarea a doi termeni situați pe poziții consecutive în șirului dat, astfel încât numărul asociat șirului obținut să fie maxim.

Date de intrare

Fișierul de intrare nrasoc.in conține pe prima linie o succesiune de cifre, separate prin câte un spațiu, reprezentând termenii șirului dat.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.". Fișierul de ieșire nrasoc.out va conține pe prima linie un șir de cifre, separate prin câte un spațiu, reprezentând șirul corespunzător numărului asociat maxim. Î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 80 de cifre.

Exemple

Exemplu 1

nrasoc.in
9 8 5 7 6 2 3 4
nrasoc.out
9 8 6 2 3 4

Explicatie

Numerele asociate șirurilor care se pot obține sunt 576234, 976234, 986234, 2985234, 985734, 985764, 985762. Fișierul de ieșire va conține: 9 8 6 2 3 4

Rezolvare

def citeste_șir():
    while True:
        try:
            with open('nrasoc.in') as fin:
                a = [int(x) for x in fin.read().split()]
                if len(a) <= 80:
                    print("Datele sunt corecte.")
                    return a
                else:
                    print("Datele nu sunt conform restricțiilor impuse.")
        except ValueError:
            print("Trebuie introduse doar numere întregi.")

def nrasoc():
    a = citeste_șir()
    n = len(a)
    max_numar = -1
    for i in range(1, n - 1):
        numar = int(str(a[i - 1]) + str(a[i + 1]))
        if numar > max_numar:
            max_numar = numar
            poz = i
    rezultat = [str(x) for i, x in enumerate(a) if i != poz and i != poz + 1]
    with open('nrasoc.out', 'w') as fout:
        fout.write(' '.join(rezultat))

if _name_ == '_main_':
    nrasoc()

Explicații

Acest cod este o implementare în Python a problemei "Numărul asociat" (nrasoc). În esență, problema cere să se elimine două elemente consecutive dintr-un șir de cifre, astfel încât numărul format din restul cifrelor să fie maxim.
În primul rând, există două funcții definite în cod: citeste_k() și nrasoc().
Funcția citeste_k() este utilizată pentru a citi valoarea cifrei k din consolă și pentru a verifica dacă aceasta respectă restricțiile impuse (să fie între 0 și 9). Funcția returnează k doar dacă acesta este valid.
Funcția nrasoc() este funcția principală a programului și se ocupă de citirea datelor din fișierul de intrare (nrasoc.in), prelucrarea lor și scrierea rezultatelor în fișierul de ieșire (nrasoc.out).
În interiorul acestei funcții, se deschid fișierele de intrare și de ieșire utilizând o clauză with, ceea ce înseamnă că acestea vor fi automat închise la finalul blocului de cod. Datele din fișierul de intrare sunt citite și stocate într-un array numit a.
Apoi, se aplică algoritmul descris în enunț pentru a găsi șirul corespunzător numărului asociat maxim. Se parcurge șirul de la primul element până la penultimul și se calculează două numere p și q format din câte două cifre, începând de la elementul curent și următorul. Dacă p este mai mic decât q și acesta este primul astfel de caz întâlnit, se trece peste elementul următor și se memorează acest lucru în variabila cnt. În caz contrar, elementul curent este scris în fișierul de ieșire.
La final, se verifică dacă s-a ajuns la ultimele două elemente din șir (penultimul și ultimul). Dacă da și cnt este încă 0, atunci se scrie ultimul element în fișierul de ieșire.
În main, se apelează cele două funcții pentru a rezolva problema.
În general, acest cod respectă bunele practici de programare, cum ar fi folosirea de variabile cu denumiri sugestive, comentarea codului acolo unde este necesar, respectarea indentării și utilizarea unor funcții separate pentru a împărți sarcinile în codul mai mic.