1936 - Catalin si codul secret: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerința == În banca lui Cătălin există un seif special unde Moș Crăciun își ține ascunse cadourile pentru copiii cei cuminți. Fiind vorba de o persoană așa de importantă, codul seifului nu este unul ușor. Moșului îi este dat un cartonaș cu n numere pe care le parcurge, în ordine, de la al doilea la penultimul, şi verifică pentru fiecare număr dacă cei 2 vecini sunt ori divizori ori multipli ai acestuia. Dacă da, va șterge primul triplet care respe...
 
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
== Cerința ==
== Cerința ==


În banca lui Cătălin există un seif special unde Moș Crăciun își ține ascunse cadourile pentru copiii cei cuminți. Fiind vorba de o persoană așa de importantă, codul seifului nu este unul ușor. Moșului îi este dat un cartonaș cu n numere pe care le parcurge, în ordine, de la al doilea la penultimul, şi verifică pentru fiecare număr dacă cei 2 vecini sunt ori divizori ori multipli ai acestuia. Dacă da, va șterge primul triplet care respectă această regulă (numărul şi vecinii săi), formându-se un nou cod pentru care se reia de la început aplicarea regulii, până când nu mai există pe cartonaș niciun număr care să respecte proprietatea de eliminat.
În banca lui Cătălin există un seif special unde Moș Crăciun își ține ascunse cadourile pentru copiii cei cuminți. Fiind vorba de o persoană așa de importantă, codul seifului nu este unul ușor. Moșului îi este dat un cartonaș cu <code>n</code> numere pe care le parcurge, în ordine, de la al doilea la penultimul, şi verifică pentru fiecare număr dacă cei <code>2</code> vecini sunt ori divizori ori multipli ai acestuia. Dacă da, va șterge primul triplet care respectă această regulă (numărul şi vecinii săi), formându-se un nou cod pentru care se reia de la început aplicarea regulii, până când nu mai există pe cartonaș niciun număr care să respecte proprietatea de eliminat.


La final se vor obține valorile corecte ale codului, care vor fi introduse în ordinea apariției lor sau, în cazul în care s-au șters toate numerele de pe cartonaș, atunci codul va fi mesajul preferat folosit de Moș Crăciun: Merry Christmas.
La final se vor obține valorile corecte ale codului, care vor fi introduse în ordinea apariției lor sau, în cazul în care s-au șters toate numerele de pe cartonaș, atunci codul va fi mesajul preferat folosit de Moș Crăciun: <code>Merry Christmas</code>.


Date fiind cele n numere de pe cartonaş, Moșul vă roagă să aflați codul de care are nevoie pentru a putea deschide seiful în seara de ajun.
Date fiind cele <code>n</code> numere de pe cartonaş, Moșul vă roagă să aflați codul de care are nevoie pentru a putea deschide seiful în seara de ajun.


== Date de intrare ==
= Date de intrare =
Fișierul de intrare <code>codsecretIN.txt</code> conține pe prima linie numărul natural <code>n</code>, iar pe a doua linie se găsesc <code>n</code> numere naturale <code>x[1] x[2] ... x[n]</code>, separate prin câte un spațiu, reprezentând numerele aflate pe cartonaș.


Fișierul de intrare codsecret.in conține pe prima linie numărul natural n, iar pe a doua linie se găsesc n numere naturale x[1] x[2] ... x[n], separate prin câte un spațiu, reprezentând numerele aflate pe cartonaș.
= Date de ieșire =
Fișierul de ieșire <code>codsecretOUT.txt</code> va conține pe prima linie codul pe care Moș Crăciun îl va folosi pentru a deschide seiful. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".


== Date de ieșire ==
= Restricții și precizări =


Fișierul de ieșire codsecret.out va conține pe prima linie codul pe care Moș Crăciun îl va folosi pentru a deschide seiful.
* <code>1 ≤ n ≤ 100.000</code>
* <code>0 < x[i] ≤ 10.000.000</code>


== Restricții și precizări ==
= Exemplul 1: =
<code>codsecretIN.txt</code>
9
2 12 6 3 10 2 4 8 3
<code>codsecretOUT.txt</code>
3 8 3


*1 ≤ n ≤ 100.000
=== Explicație ===
*0 < x[i] ≤ 10.000.000
Numărul <code>12</code> are <code>2</code> vecini, care sunt divizori ai săi deci vom șterge tripletul <code>2 12 6</code>. Noul cod obținut este <code>3 10 2 4 8 3</code>.


== Exemplul 1 ==
În noul cod avem numărul <code>2</code>, care are ca vecini doi multipli de-ai săi, deci vom șterge tripletul <code>10 2 4</code>.


; intrare
Noul cod obținut este <code>3 8 3</code>, căruia nu îi putem face modificări, așa că îl afișăm.


:9
== Exemplul 2: ==
<code>codsecretIN.txt</code>
100001
2 12 6 3 10 2 4 8 3
<code>codsecretOUT.txt</code>
Datele nu corespund restrictiilor impuse


:2 12 6 3 10 2 4 8 3
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
import sys


; iesire
def conditie(a, b, c):
    return (b % a == 0 or a % b == 0) and (b % c == 0 or c % b == 0)


:Datele introduse corespund restrictiilor impuse.
def verifica_restrictii(n, numere):
    if not (1 <= n <= 100000) or any(x <= 0 or x > 10000000 for x in numere):
        print("Datele nu corespund restrictiilor impuse")
        sys.exit()  # Încheie executia programului


:3 8 3
def citire():
    global v, k
    n = int(input())
    numere = list(map(int, input().split()))
    verifica_restrictii(n, numere)  # Verificăm restricțiile pentru datele de intrare
    v = []
    k = 0
    for x in numere:
        v.append(x)
        k += 1
        if k >= 3 and conditie(v[k - 3], v[k - 2], v[k - 1]):
            k -= 3
            v = v[:-3]


== Exemplul 2 ==
def rezolva():
 
    if k <= 0:
; intrare
        print("Crăciun Fericit")
 
    else:
:1
        for i in range(k):
 
            print(v[i], end=" ")
:9 2 5 16 8 4 7 8 2
 
; iesire
 
:Datele de intrare nu corespund restrictiilor impuse.
 
== Rezolvare ==
<syntaxhighlight lang="python3" line="1"
 
#1936 - Catalin si codul secret


def obtine_cod(cartonas):
def main():
     while True:
     sys.stdin = open("codsecretIN.txt", "r", encoding='utf-8')
        gasit = False
    sys.stdout = open("codsecretOUT.txt", "w", encoding='utf-8')
        for i in range(1, len(cartonas) - 1):
    citire()
            if (cartonas[i - 1] % cartonas[i] == 0 or cartonas[i] % cartonas[i - 1] == 0) and (
    rezolva()
                cartonas[i + 1] % cartonas[i] == 0 or cartonas[i] % cartonas[i + 1] == 0
            ):
                del cartonas[i - 1:i + 2]
                gasit = True
                break


        if not gasit:
if __name__ == "__main__":
            break
     main()
 
    if not cartonas:
        return "Merry Christmas"
     else:
        return cartonas


print(rezultat)
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 19:47, 23 February 2024

Cerința[edit | edit source]

În banca lui Cătălin există un seif special unde Moș Crăciun își ține ascunse cadourile pentru copiii cei cuminți. Fiind vorba de o persoană așa de importantă, codul seifului nu este unul ușor. Moșului îi este dat un cartonaș cu n numere pe care le parcurge, în ordine, de la al doilea la penultimul, şi verifică pentru fiecare număr dacă cei 2 vecini sunt ori divizori ori multipli ai acestuia. Dacă da, va șterge primul triplet care respectă această regulă (numărul şi vecinii săi), formându-se un nou cod pentru care se reia de la început aplicarea regulii, până când nu mai există pe cartonaș niciun număr care să respecte proprietatea de eliminat.

La final se vor obține valorile corecte ale codului, care vor fi introduse în ordinea apariției lor sau, în cazul în care s-au șters toate numerele de pe cartonaș, atunci codul va fi mesajul preferat folosit de Moș Crăciun: Merry Christmas.

Date fiind cele n numere de pe cartonaş, Moșul vă roagă să aflați codul de care are nevoie pentru a putea deschide seiful în seara de ajun.

Date de intrare[edit | edit source]

Fișierul de intrare codsecretIN.txt conține pe prima linie numărul natural n, iar pe a doua linie se găsesc n numere naturale x[1] x[2] ... x[n], separate prin câte un spațiu, reprezentând numerele aflate pe cartonaș.

Date de ieșire[edit | edit source]

Fișierul de ieșire codsecretOUT.txt va conține pe prima linie codul pe care Moș Crăciun îl va folosi pentru a deschide seiful. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări[edit | edit source]

  • 1 ≤ n ≤ 100.000
  • 0 < x[i] ≤ 10.000.000

Exemplul 1:[edit | edit source]

codsecretIN.txt

9
2 12 6 3 10 2 4 8 3

codsecretOUT.txt

3 8 3

Explicație[edit | edit source]

Numărul 12 are 2 vecini, care sunt divizori ai săi deci vom șterge tripletul 2 12 6. Noul cod obținut este 3 10 2 4 8 3.

În noul cod avem numărul 2, care are ca vecini doi multipli de-ai săi, deci vom șterge tripletul 10 2 4.

Noul cod obținut este 3 8 3, căruia nu îi putem face modificări, așa că îl afișăm.

Exemplul 2:[edit | edit source]

codsecretIN.txt

100001
2 12 6 3 10 2 4 8 3

codsecretOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> import sys

def conditie(a, b, c):

   return (b % a == 0 or a % b == 0) and (b % c == 0 or c % b == 0)

def verifica_restrictii(n, numere):

   if not (1 <= n <= 100000) or any(x <= 0 or x > 10000000 for x in numere):
       print("Datele nu corespund restrictiilor impuse")
       sys.exit()  # Încheie executia programului

def citire():

   global v, k
   n = int(input())
   numere = list(map(int, input().split()))
   verifica_restrictii(n, numere)  # Verificăm restricțiile pentru datele de intrare
   v = []
   k = 0
   for x in numere:
       v.append(x)
       k += 1
       if k >= 3 and conditie(v[k - 3], v[k - 2], v[k - 1]):
           k -= 3
           v = v[:-3]

def rezolva():

   if k <= 0:
       print("Crăciun Fericit")
   else:
       for i in range(k):
           print(v[i], end=" ")

def main():

   sys.stdin = open("codsecretIN.txt", "r", encoding='utf-8')
   sys.stdout = open("codsecretOUT.txt", "w", encoding='utf-8')
   citire()
   rezolva()

if __name__ == "__main__":

   main()

</syntaxhighlight>