3287 - cifrazecmax

De la Universitas MediaWiki

Sursa: -cifrazecmax


Cerinţa

Se consideră un şir vector de cel puțin 11 şi cel mult 10.000 de numere naturale, despărțite prin câte un spațiu. Fiecare număr are cel puțin două şi cel mult nouă cifre. Primul termen al şirului are numărul de ordine 1, al doilea are numărul de ordine 2 etc. Se citeşte şirul din fişier şi se cere să se determine numărul de ordine al unui termen al şirului care este precedat în fişier de un număr maxim de valori care au cifra zecilor egală cu a sa. Dacă sunt mai mulți termeni cu această proprietate se afişează numărul de ordine al primului.

Date de intrare

Fișierul de intrare cifrazecmax.in conține pe prima linie cel puțin 11 şi cel mult un 10.000 de numere naturale, despărțite prin câte un spațiu.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fişierul de ieșire cifrazecmax.out va conține pe prima linie numărul de ordine al termenului care este precedat în fişier de un număr maxim de valori care au cifra zecilor egală cu a sa. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări

  • numerele din fișierul de intrare cifrazecmax.in au cel puțin 2 cifre și sunt mai mici decât 1.000.000.000
  • în fișier sunt cel mult 10000 de numere

Exemple

Exemplul 1

cifrazecmax.in
12 36 265 18 139 19 32 34 112 14 68
Ieșire
Datele sunt corecte.
cifrazecmax.out
10

Explicatie

10 este numărul de ordine al termenului 14. Pe poziția zecilor sunt 5 cifre de 1, 4 cifre de 3 și 2 cifre de 6. Cel mai mare este 5 corespunzător cifrei 1. Ultimul termen al șirului care are cifra zecilor 1 este 14 și are numărul de ordine 10.

Exemplul 2

cifrazecmax.in
12 63 265 88 139 19 32 34 68 112 74
Ieșire
Datele sunt corecte.
cifrazecmax.out
8

Explicatie

8 este numărul de ordine al termenului 34. Pe poziția zecilor sunt 3 cifre de 1, 3 cifre de 3, 3 cifre de 6, o cifră de 8 și una de 7. Contorul cel mai mare este 3 corespunzător cifrelor 1, 3 și 6. Primul termen care este precedat în fişier de un număr maxim de valori care au cifra zecilor egală cu a sa este 34 și are numărul de ordine 8.

Exemplul 3

cifrazecmax.in
2 3 4 5 6
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare

# 3287 - cifrazecmax

def cifrazecmax(vector):
    f = open("cifrazecmax.out", "w")
    cifre = [0] * len(vector)
    for i in range(len(vector)):
        element = vector[i]
        cifre[i] = element % 100 // 10
    maxim = 0
    pozfinala = int()
    for i in range(0, 10):
        contor = 0;
        poz = int()
        for j in range(len(vector)):
            if cifre[j] == i:
                contor += 1
                poz = j
        if contor > maxim:
            maxim = contor
            pozfinala = poz
        if contor == maxim and poz < pozfinala:
            pozfinala = poz
    f.write(str(pozfinala + 1))


def conform_restrictiilor():
    vector = list()
    with open('cifrazecmax.in') as f:
        lines = f.readlines()
        for line in lines:
            for c in line.split():
                if c.isdigit() == True:
                    vector.append(int(c))
    if len(vector) > 10000 or len(vector) < 11:
        print("Datele nu sunt comform restricțiilor impuse.")
        exit()
    for x in vector:
        if x < 10 or x > 1000000000:
            print("Datele nu sunt comform restricțiilor impuse.")
            exit()
    print("Datele sunt corecte.")
    return vector


if __name__ == '__main__':
    vector = conform_restrictiilor()
    cifrazecmax(vector)

Explicaţie cod

Funcția conform_restrictiilor() verifică dacă datele de intrare sunt conforme cu cerințele problemei. Mai precis, programul verifică dacă vectorul are între 11 și 10000 de elemente, iar fiecare element este între 10 și 10^9. Dacă aceste condiții nu sunt îndeplinite, programul va afișa un mesaj de eroare și va ieși din program. Dacă datele sunt conforme, funcția va returna vectorul.

Funcția cifrazecmax(vector) primește vectorul ca parametru și găsește poziția primei cifre zecimale care apare cel mai des în numerele vectorului. Pentru aceasta, se parcurge fiecare element al vectorului și se extrage cifra zecimală corespunzătoare (adică a doua cifră de la dreapta). Aceste cifre sunt stocate într-un alt vector numit cifre.

Se parcurg apoi cifrele de la 0 la 9 și se numără câte elemente din cifre au cifra zecimală egală cu cifra rezultata. Dacă numărul de apariții este mai mare decât valoarea maximă găsită până în acel moment, atunci se actualizează valoarea maximă și poziția din vector corespunzătoare. Dacă numărul de apariții este egal cu valoarea maximă și poziția curentă este mai mică decât poziția anterioară, atunci se actualizează poziția anterioară.

Funcția va scrie poziția primei cifre zecimale care apare cel mai des în fișierul cifrazecmax.out.