2283 - Caraghios

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Se consideră un șir S de cifre nenule. O secvență a șirului S este o succesiune de cifre din S care apar pe poziții consecutive. Un număr n asociat unei secvențe din S este numărul în baza 10 care se formează cu toate cifrele din secvența respectivă, în ordinea în care apar în aceasta.

Un număr n se numește caraghios dacă este egal cu pătratul sumei cifrelor lui n.

Cerința

Dându-se un șir S de cifre nenule, să se determine câte dintre secvențele din S au numere asociate caraghioase.

Date de intrare

Fișierul de intrare caraghios.in conține pe prima linie șirul S de cifre nenule.

Date de ieșire

Fișierul de ieșire caraghios.out va conține pe prima linie numărul de secvențe din S care au asociate numere caraghioase. În acest caz, în consolă se va afișa un mesaj de validare a datelor "Input valid!". În caz contrar pe consolă se va afișa "Input invalid! Numărul de cifre trebuie să fie mai mic sau egal cu 1.000.000."

Restricții și precizări

  • Șirul S va conține maxim 1.000.000 de cifre

Exemplu

caraghios.in
28113
caraghios.out
3
Consolă
Input valid!

Explicație exemplu

Toate secvențele lui S sunt: 2, 28, 281, 2811, 28113, 8, 81, 811, 8113, 1, 11, 113, 1, 13, 3 Există 3 secvențe care au asociate numere caraghioase: 81, 1, 1

81 = (8+1)*(8+1), 1 = 1*1, 1 = 1*1

Rezolvare

def validate_input(input_str):
    """
    Verifică dacă input-ul are maxim 1.000.000 de cifre.
    :param input_str: șirul de caractere de verificat
    :return: True dacă input-ul este valid, False în caz contrar
    """
    return len(input_str) <= 1000000


def count_caraghios(input_str):
    """
    Calculează numărul de apariții a cifrei 1 într-un șir dat.
    :param input_str: șirul de caractere de analizat
    :return: numărul de apariții a cifrei 1, conform cerințelor specifice
    """
    nr = 0
    x = input_str[0]
    if x == '1':
        nr += 1
    for y in input_str[1:]:
        if y == '1':
            nr += 1
            if x == '8':
                nr += 1
        x = y
    return nr


if __name__ == "__main__":
    input_file = "caraghios.in"
    output_file = "caraghios.out"
    with open(input_file, "r") as f:
        input_str = f.read().strip()
    if not validate_input(input_str):
        print("Input invalid! Numărul de cifre trebuie să fie mai mic sau egal cu 1.000.000.")
        return
    else:
        print("Input valid!")
    nr = count_caraghios(input_str)
    with open(output_file, "w") as f:
        f.write(str(nr))

Explicație cod

În cadrul programului, se utilizează două funcții:

Funcția validate_input primește un șir de caractere input_str și returnează True dacă șirul are cel mult 1.000.000 de caractere.

Funcția count_caraghios primește un șir de caractere input_str și calculează numărul de apariții a cifrei 1 în șir, respectând condiția specifică legată de cifra 8.

În cadrul blocului main se deschide fișierul de intrare caraghios.in, se citește conținutul său într-un șir de caractere și se validează input-ul folosind funcția validate_input. Dacă input-ul este invalid, se afișează un mesaj corespunzător și programul se încheie. În caz contrar, se calculează numărul de apariții a cifrei 1 folosind funcția count_caraghios, iar rezultatul este scris în fișierul de ieșire caraghios.out.