1994 - Vanatoare
Enunț
Vânătorul şef al regelui Arthur a primit însărcinare să vâneze primele raţe ce se întorc din ţările calde. Regele fiind un tip cu idei fixe i-a cerut vânătorului să vâneze raţele albe cu săgeţi albe, iar raţele negre cu săgeţi negre. Raţele vin în stoluri din ce în ce mai mari: mai întâi una, apoi două, trei , cinci, opt ş.a.m.d. Raţele fiind nişte creaturi ordonate zboară în rânduri lungi, în care nu vei putea găsi două raţe de aceeaşi culoare alăturate, fiecare rând începînd cu o raţă albă. Vânătorul ştie că dacă a început să doboare un rând de raţe trebuie să le doboare pe toate deoarece supravieţuitoarele vor alerta celelalte raţe şi ele nu se vor mai întoarce niciodată, iar vânătorul nostru îşi va pierde slujba.
Cerința
Ştiind că vânătorul a primit ka săgeţi albe şi kb săgeţi negre trebuie să determinaţi câte rânduri de raţe a doborât şi câte săgeţi de fiecare tip i-au rămas ştiind că el vrea să-şi păstreze slujba.
Date de intrare
Se citesc de la tastatură numerele ka şi kb (în această ordine).
Date de ieșire
Se va afişa pe prima linie a ecranului numărul de rânduri doborâte, pe a doua linie numărul de săgeți albe rămase, iar pe cea de-a treia numărul de săgeți negre.
Restricții și precizări
0 ≤ ka, kb ≤ 2.000.000.000
Exemplu:
Intrare 9 10
Ieșire 4 2 6
Rezolvare
<syntaxhighlight lang="python" line> def validare(ka, kb):
if ka < 0 or kb < 0: return False return True
def citire():
ka = int(input()) kb = int(input()) return ka, kb
def main():
ka, kb = citire() if not validare(ka, kb): print("Date de intrare invalide") return r = 0 while ka >= r+1 and kb >= r: r += 1 ka -= r kb -= r-1 print(r) print(ka) print(kb)
if __name__ == "__main__":
main()
</syntaxhighlight>
Explicatie
Programul primește ca input numerele ka și kb reprezentând numărul de săgeți albe și negre pe care le are vânătorul. Se verifică dacă valorile introduse sunt valabile, adică pozitive. Dacă da, se folosește o buclă while pentru a determina numărul de rânduri doborâte, r. La fiecare rând doborât, numărul de săgeți albe scade cu valoarea rândului, iar numărul de săgeți negre scade cu valoarea rândului minus unu. Când nu mai sunt suficiente săgeți pentru a doborî întregul rând, programul iese din buclă și afișează răspunsul: numărul de rânduri doborâte, urmat de numărul de săgeți albe rămase și de numărul de săgeți negre rămase.