1905 - Snooker 1

From Bitnami MediaWiki

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>