1905 - Snooker 1: Difference between revisions
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ă. | ||
== 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? | ||
== 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 | |||
Dan | == 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). | |||
== Restricții și precizări == | |||
* 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''' === | |||
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 | ||
snooker1out.txt | |||
2 | 2 | ||
Line 43: | Line 38: | ||
6 | 6 | ||
== 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 | ||
''' | == '''Rezolvare''' == | ||
<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: | ||
n = int(f.readline()) | n = int(f.readline()) | ||
v = list(map(int, f.readline().split())) | v = list(map(int, f.readline().split())) | ||
juc, s1, s2, k1, k2, maxim = 1, 0, 0, 0, 0, 0 | juc, s1, s2, k1, k2, maxim = 1, 0, 0, 0, 0, 0 | ||
for i in range(n): | for i in range(n): | ||
juc, s1, s2, k1, k2, maxim = proceseaza_element(v, i, juc, s1, s2, k1, k2, maxim) | |||
if k1 > maxim: | if k1 > maxim: | ||
maxim = k1 | maxim = k1 | ||
Line 85: | Line 88: | ||
maxim = k2 | maxim = k2 | ||
with open("snooker1out.txt", "w") as g: | with open("snooker1out.txt", "w") as g: | ||
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") | ||
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>