2283 - Caraghios

From Bitnami MediaWiki

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

<syntaxhighlight lang="python"> 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))

</syntaxhighlight>

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.