1905 - Snooker 1
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>