1905 - Snooker 1: Difference between revisions

From Bitnami MediaWiki
Andrada378 (talk | contribs)
Pagină nouă: Jocul de snooker are reguli relativ simple: Doi jucători au la dispoziție 15 bile roșii și 6 bile colorate. Bilele roșii valorează câte 1 punct, iar cele colorate au valori cuprinse între 1 și 6 puncte. De fiecare dată când un jucător intră la masă trebuie să introducă serii de bile, începând cu o bilă roșie apoi una colorată, după fiecare bilă colorată fiind obligat să introducă o bilă roșie. Atunci când un jucător nu introduce nicio bilă sau...
 
Andrada378 (talk | contribs)
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Enunț ==
Jocul de snooker are reguli relativ simple:
Jocul de snooker are reguli relativ simple:


Line 5: Line 6:
Dan și Paul și-au propus să învețe să joace snooker, dar până mai capătă puțină experiență ei nu vor ține cont de absolut toate regulile jocului și vor contoriza punctajele în felul următor: apare valoarea 1 dacă un jucător a introdus o bilă roșie, o valoare cuprinsă între 1 și 6 dacă introduce corect o bilă colorată și valoarea -5 dacă jucătorul comite fault. Când un jucător ratează, pe tabelă apare valoarea 0. De fiecare dată când un jucător comite fault sau ratează, acesta își pierde rândul la masă.
Dan și Paul și-au propus să învețe să joace snooker, dar până mai capătă puțină experiență ei nu vor ține cont de absolut toate regulile jocului și vor contoriza punctajele în felul următor: apare valoarea 1 dacă un jucător a introdus o bilă roșie, o valoare cuprinsă între 1 și 6 dacă introduce corect o bilă colorată și valoarea -5 dacă jucătorul comite fault. Când un jucător ratează, pe tabelă apare valoarea 0. De fiecare dată când un jucător comite fault sau ratează, acesta își pierde rândul la masă.


'''''<u>Cerința</u>'''''
== Cerința ==
 
La sfârșitul jocului cei doi prieteni studiază tabela de scor și își doresc să afle:
La sfârșitul jocului cei doi prieteni studiază tabela de scor și își doresc să afle:


Line 13: Line 13:
b) Care este numărul maxim de bile introduse consecutiv de un jucător fără a comite fault la sfârșitul respectivei serii?
b) Care este numărul maxim de bile introduse consecutiv de un jucător fără a comite fault la sfârșitul respectivei serii?


'''''<u>Date de intrare</u>'''''
== Date de intrare ==
 
Fișierul de intrare snooker1in.txt conține pe prima linie numărul n, reprezentând numărul de lovituri, iar pe a doua linie n numere care ilustrează tabela de scor, cu semnificațiile din enunț.
Fișierul de intrare snooker1.in conține pe prima linie numărul n, reprezentând numărul de lovituri, iar pe a doua linie n numere care ilustrează tabela de scor, cu semnificațiile din enunț.
 
'''''<u>Date de ieșire</u>'''''
 
Fișierul de ieșire snooker1.out va conține pe prima linie răspunsul la cerința a),respectiv numărul 1 dacă Dan a câștigat jocul sau numărul 2 dacă Paul a câștigat. Pe a doua linie se va afișa răspunsul la cerința b).
 
'''''<u>Restricții și precizări</u>'''''
 
1 ≤ n ≤ 1000


Dan este cel care începe mereu jocul
== Date de ieșire ==
Fișierul de ieșire snooker1out.txt va conține pe prima linie răspunsul la cerința a),respectiv numărul 1 dacă Dan a câștigat jocul sau numărul 2 dacă Paul a câștigat. Pe a doua linie se va afișa răspunsul la cerința b).


Se consideră că a câștigat jocul copilul care a strâns cele mai multe puncte și se garantează că în datele de test cei doi copii nu vor avea la final punctaje egale.
== Restricții și precizări ==


'''''<u>Exemplu</u>'''''
* 1 ≤ n ≤ 1000
* Dan este cel care începe mereu jocul
* Se consideră că a câștigat jocul copilul care a strâns cele mai multe puncte și se garantează că în datele de test cei doi copii nu vor avea la final punctaje egale.


snooker1.in
=== '''Exemplu''' ===
snooker1in.txt


45
45
Line 37: Line 32:
0 0 1 0 1 3 1 4 0 1 0 1 0 1 0 1 0 1 0 0 0 1 4  1 1 1 5 -5 0 1 5 1 6 1 6 0 0 1 6 1 2 3 0 4 5
0 0 1 0 1 3 1 4 0 1 0 1 0 1 0 1 0 1 0 0 0 1 4  1 1 1 5 -5 0 1 5 1 6 1 6 0 0 1 6 1 2 3 0 4 5


snooker1.out
snooker1out.txt


2
2
Line 43: Line 38:
6
6


'''''<u>Explicație</u>'''''
== Explicație ==
 
Paul a câștigat partida deoarece a acumulat 52 de puncte, în timp ce Dan a acumulat 13 puncte.
Paul a câștigat partida deoarece a acumulat 52 de puncte, în timp ce Dan a acumulat 13 puncte.


Paul introduce 6 bile consecutiv, fără a comite fault după introducerea acestora: 1 5 1 6 1 6
Paul introduce 6 bile consecutiv, fără a comite fault după introducerea acestora: 1 5 1 6 1 6


'''''<u>Rezolvare</u>'''''<syntaxhighlight lang="python">
== '''Rezolvare''' ==
# Deschide fișierul de intrare pentru citire
<syntaxhighlight lang="python">
def validare_n(n):
    if 1 <= n <= 1000:
        return True
    else:
        print("Valoare invalidă pentru 'n'. N trebuie sa fie intre 1 ≤ n ≤ 1000.")
        return False
 
def proceseaza_element(v, i, juc, s1, s2, k1, k2, maxim):
    if i < len(v):
        if v[i] != 0 and juc % 2 == 1:
            s1 += v[i]
            k1 += 1
 
        if v[i] != 0 and juc % 2 == 0:
            s2 += v[i]
            k2 += 1
 
        if v[i] == 0 or v[i] == -5:
            if k1 > maxim and v[i] != -5:
                maxim = k1
            if k2 > maxim and v[i] != -5:
                maxim = k2
            juc += 1
            k1, k2 = 0, 0
    else:
        print(f"Index i out of range for list 'v'")
 
    return juc, s1, s2, k1, k2, maxim
 
with open("snooker1in.txt", "r") as f:
with open("snooker1in.txt", "r") as f:
    # Citește prima linie, care conține valoarea lui 'n'
     n = int(f.readline())
     n = int(f.readline())
    # Citește a doua linie, care conține elementele array-ului 'v'
     v = list(map(int, f.readline().split()))
     v = list(map(int, f.readline().split()))


# Inițializează variabile
juc, s1, s2, k1, k2, maxim = 1, 0, 0, 0, 0, 0
juc, s1, s2, k1, k2, maxim = 1, 0, 0, 0, 0, 0


# Iterează prin elementele array-ului 'v'
for i in range(n):
for i in range(n):
     # Verifică condițiile și actualizează variabilele corespunzător
     juc, s1, s2, k1, k2, maxim = proceseaza_element(v, i, juc, s1, s2, k1, k2, maxim)
    if v[i] != 0 and juc % 2 == 1:
        s1 += v[i]
        k1 += 1
 
    if v[i] != 0 and juc % 2 == 0:
        s2 += v[i]
        k2 += 1
 
    if v[i] == 0 or v[i] == -5:
        if k1 > maxim and v[i] != -5:
            maxim = k1
        if k2 > maxim and v[i] != -5:
            maxim = k2
        juc += 1
        k1, k2 = 0, 0


# Verifică și actualizează 'maxim'
if k1 > maxim:
if k1 > maxim:
     maxim = k1
     maxim = k1
Line 85: Line 88:
     maxim = k2
     maxim = k2


# Deschide fișierul de ieșire pentru scriere
with open("snooker1out.txt", "w") as g:
with open("snooker1out.txt", "w") as g:
    # Scrie rezultatul comparării dintre 's1' și 's2'
     if s1 > s2:
     if s1 > s2:
         g.write("1\n")
         g.write("1\n")
Line 93: Line 94:
         g.write("2\n")
         g.write("2\n")


    # Scrie valoarea lui 'maxim'
     g.write(str(maxim))
     g.write(str(maxim))
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 16:29, 4 January 2024

Enunț[edit | edit source]

Jocul de snooker are reguli relativ simple:

Doi jucători au la dispoziție 15 bile roșii și 6 bile colorate. Bilele roșii valorează câte 1 punct, iar cele colorate au valori cuprinse între 1 și 6 puncte. De fiecare dată când un jucător intră la masă trebuie să introducă serii de bile, începând cu o bilă roșie apoi una colorată, după fiecare bilă colorată fiind obligat să introducă o bilă roșie. Atunci când un jucător nu introduce nicio bilă sau nu introduce o bilă corectă, la masă urmează adversarul său. Loviturile nepermise se penalizează cu 5 puncte. De fiecare dată când este introdusă o bilă colorată, aceasta se repune pe masă. Când nu mai există bile roșii, bilele colorate se vor introduce în ordinea valorii lor, de la 1 la 6.

Dan și Paul și-au propus să învețe să joace snooker, dar până mai capătă puțină experiență ei nu vor ține cont de absolut toate regulile jocului și vor contoriza punctajele în felul următor: apare valoarea 1 dacă un jucător a introdus o bilă roșie, o valoare cuprinsă între 1 și 6 dacă introduce corect o bilă colorată și valoarea -5 dacă jucătorul comite fault. Când un jucător ratează, pe tabelă apare valoarea 0. De fiecare dată când un jucător comite fault sau ratează, acesta își pierde rândul la masă.

Cerința[edit | edit source]

La sfârșitul jocului cei doi prieteni studiază tabela de scor și își doresc să afle:

a) Care dintre ei a câștigat partida?

b) Care este numărul maxim de bile introduse consecutiv de un jucător fără a comite fault la sfârșitul respectivei serii?

Date de intrare[edit | edit source]

Fișierul de intrare snooker1in.txt conține pe prima linie numărul n, reprezentând numărul de lovituri, iar pe a doua linie n numere care ilustrează tabela de scor, cu semnificațiile din enunț.

Date de ieșire[edit | edit source]

Fișierul de ieșire snooker1out.txt va conține pe prima linie răspunsul la cerința a),respectiv numărul 1 dacă Dan a câștigat jocul sau numărul 2 dacă Paul a câștigat. Pe a doua linie se va afișa răspunsul la cerința b).

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

  • 1 ≤ n ≤ 1000
  • Dan este cel care începe mereu jocul
  • Se consideră că a câștigat jocul copilul care a strâns cele mai multe puncte și se garantează că în datele de test cei doi copii nu vor avea la final punctaje egale.

Exemplu[edit | edit source]

snooker1in.txt

45

0 0 1 0 1 3 1 4 0 1 0 1 0 1 0 1 0 1 0 0 0 1 4  1 1 1 5 -5 0 1 5 1 6 1 6 0 0 1 6 1 2 3 0 4 5

snooker1out.txt

2

6

Explicație[edit | edit source]

Paul a câștigat partida deoarece a acumulat 52 de puncte, în timp ce Dan a acumulat 13 puncte.

Paul introduce 6 bile consecutiv, fără a comite fault după introducerea acestora: 1 5 1 6 1 6

Rezolvare[edit | edit source]

<syntaxhighlight lang="python"> def validare_n(n):

   if 1 <= n <= 1000:
       return True
   else:
       print("Valoare invalidă pentru 'n'. N trebuie sa fie intre 1 ≤ n ≤ 1000.")
       return False

def proceseaza_element(v, i, juc, s1, s2, k1, k2, maxim):

   if i < len(v):
       if v[i] != 0 and juc % 2 == 1:
           s1 += v[i]
           k1 += 1
       if v[i] != 0 and juc % 2 == 0:
           s2 += v[i]
           k2 += 1
       if v[i] == 0 or v[i] == -5:
           if k1 > maxim and v[i] != -5:
               maxim = k1
           if k2 > maxim and v[i] != -5:
               maxim = k2
           juc += 1
           k1, k2 = 0, 0
   else:
       print(f"Index i out of range for list 'v'")
   return juc, s1, s2, k1, k2, maxim

with open("snooker1in.txt", "r") as f:

   n = int(f.readline())
   v = list(map(int, f.readline().split()))

juc, s1, s2, k1, k2, maxim = 1, 0, 0, 0, 0, 0

for i in range(n):

   juc, s1, s2, k1, k2, maxim = proceseaza_element(v, i, juc, s1, s2, k1, k2, maxim)

if k1 > maxim:

   maxim = k1

if k2 > maxim:

   maxim = k2

with open("snooker1out.txt", "w") as g:

   if s1 > s2:
       g.write("1\n")
   else:
       g.write("2\n")
   g.write(str(maxim))

</syntaxhighlight>