2283 - Caraghios: Difference between revisions

From Bitnami MediaWiki
Cata (talk | contribs)
 
(2 intermediate revisions by one other user not shown)
Line 11: Line 11:
==Date de ieșire==
==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.
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==
==Restricții și precizări==
* Șirul S va conține maxim 1.000.000 de cifre
* Șirul S va conține maxim 1.000.000 de cifre
==Exemplu==
==Exemplu==
caraghios.in
; caraghios.in
 
: 28113
28113
; caraghios.out
caraghios.out
: 3
 
; Consolă
3
: Input valid!
==Explicație==
==Explicație exemplu==
Toate secvențele lui S sunt: 2, 28, 281, 2811, 28113, 8, 81, 811, 8113, 1, 11, 113, 1, 13, 3
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
Există 3 secvențe care au asociate numere caraghioase: 81, 1, 1
81 = (8+1)*(8+1), 1 = 1*1, 1 = 1*1
: 81 = (8+1)*(8+1), 1 = 1*1, 1 = 1*1


==Rezolvare==
==Rezolvare==
Line 56: Line 57:




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


</syntaxhighlight>
</syntaxhighlight>
Line 81: Line 80:
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.
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 funcției 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.
Î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.
 
Sper că această descriere te ajută să înțelegi mai bine funcționarea programului.

Latest revision as of 20:53, 4 May 2023

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[edit | edit source]

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[edit | edit source]

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

Date de ieșire[edit | edit source]

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[edit | edit source]

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

Exemplu[edit | edit source]

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

Explicație exemplu[edit | edit source]

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[edit | edit source]

<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[edit | edit source]

Î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.