Naloga: Ruleta

Naloga: Ruleta

Avtor: Andrej Pavšič

Besedilo naloge

Janez rad igra ruleto. Ker nima rad pretiranega tveganja, uporablja le stavo na barvo. Pri stavi na barvo je važno le, ali se kroglica ustavi na rdeči ali črni barvi. Če se ustavi na zeleni barvi (zelena je na ruleti le številka 0), vsi izgubijo. Če se kroglica ustavi na barvi, na katero smo stavili, dobimo dvojno vsoto tiste, ki smo jo stavili (torej je naš dobiček enak stavljenemu znesku), če pa na nasprotni (ali pa na zeleni 0), stavljeno vsoto izgubimo. Pri odločanju, na katero barvo bo stavil, Janez uporablja naslednjo strategijo: vedno stavi žeton za 10 evrov na barvo, različno od tiste, ki je bila izžrebana v prejšnjem krogu. V prvem krogu ali pa, če je v prejšnjem krogu bila izžrebana zelena 0, vedno stavi na redečo barvo. Prav tako nikoli ne igra več kot 12 iger. Denimo, da potek dogajanja opišemo s številom. To je sestavljeno iz števk 1, 2 in 3. Števka 1 na i-tem mestu števila (od leve) pomeni, da je bila v i-tem krogu izžrebana rdeča, 2 črna in 3 zelena. Napiši program, ki prebere število, sestavljeno iz števk 1, 2 in 3, in zanj izpiše, koliko denarja je Janez priigral (oziroma izgubil).

Primera:

  • 1112232212 −> zaslužek = −20 Razlaga: zaslužki so bili: +10,−10,−10, +10,−10,−10,−10,−10, +10, +10.
  • 12213331212 −> zaslužek = 30
    Razlaga: zaslužki so bili: +10, +10,−10, +10,−10,−10,−10, +10, +10, +10, +10. (Opomba: tvoja rešitev naj izpiše le skupni zaslužek po koncu vseh krogov, ne pa tudi zaslužkov v posameznih krogih.)

Opis problema in ideja rešitve

Sestaviti moramo program, ki glede na barvo, kjer se kroglica ustavi, izkupičku prišteje ali odšteje deset (v našem primeru evrov). Glede na to, da so barve opisane od 1 do 3, lahko parameter, ki ga program sprejme, nastopa kot število. Ker Janez igra največ 12 iger, bomo omejili vneseno število na 12 števk. Po števkah od leve proti desni bomo spustili zanko in preverjali ali je Janez stavo dobil ali izgubil. Janezova strategija stavljenja je opisan v navodilih. Na koncu bo program vrnil izkupiček, ki ga je Janez priigral oz. izgubil.

Razlaga algoritma

Definirali bomo metodo ruleta(n), kjer je n parameter, ki ga vnašamo kot celo število, ki pa je sestavljeno iz največ dvanajstih števk 1, 2 in 3. Te pogoje definiramo z assert stavki:

  • v 5. vrstici: n mora biti vnesen kot celo število,
  • v 7. vrstici: n je dvanajst ali manj mestno število,
  • v 8. vrstici: števke vnesenega števila so lahko 1, 2 ali 3.

Pred prvim krogom je naš izkupiček enak nič in stavimo na rdečo, kar opišemo v 9. in 10. vrstici. Števec st definiramo kot dolžino niza števila n, in ustvarimo zanko, ki teče dokler je števec večji od 0. V vsakem koraku zanke dobimo barvo kot skrajno levo števko števila n in nato primerjamo s stavami. Ločimo dva primera:

  • Janez zmeraj stavi le na rdečo ali črno, tako da v primeru, da pade zelena izgubi 10 € in stavi na rdečo.
  • Če pade rdeča ali črna lahko zadane (20. vrstica) ali izgubi (23. vrstica). V vsakem primeru pa v naslednjem krogu stavi na barvo, ki ni padla v zadnjem krogu (25. vrstica). Ker rdečo in črno označujeta števki 1 in 2, lahko stavo za naslednji krog izračunamo tako, da števko barve delimo po modulu 2 in prištejemo 1. Tako iz 1 dobimo 2 in iz 2 dobimo 1.

Čisto na koncu zanke številu n odrežemo skrajno levo števko in števec zmanjšamo za 1. Ko se zanka izteče samo še vrnemo izkupiček, ki ga je Janez priigral oz. zapravil.

Koda v Pythonu

from types import *

def ruleta(n):
    
S številom, sestavljenim iz števk 1,2 in 3, opišemo potek igre rulete.
    assert type(n)==int and n==int(n), 'Potek igre opišemo s celim številom!'
    st=len(str(n)) # števec
    assert st<=12, 'Janez ne igra več kot 12 iger!'
    assert int(max(str(n)))<4 and int(min(str(n)))>0, 'Na ruleti so le tri možne barve: rdeča(1), črna(2) in zelena(3).'
    stava=1 # V prvem krogu zmeraj stavimo na rdečo.
    izkupicek=0

    while st>0: # dokler je števec večji od nič - v vsakem koraku zanke ga bomo za 1 zmanjšali
        barva=n//10**(st-1)
        if barva==3: # v primeru, da pade zelena izgubimo 10€ in v naslednjem krogu stavimo na rdečo
            izkupicek-=10
            stava=1

        else: # pade rdeča ali črna
            if barva==stava: # v primeru, da stavo zadanemo
                izkupicek+=10

            else: # vprimeru, da stave ne zadanemo
                izkupicek-=10

            stava=barva%2+1 #v naslednjem krogu stavimo na barvo, različno od tiste, ki je bila izžrebana v tem krogu

        n%=10**(st-1) # številu odrežemo skrajno levo števko
        st-=1 # števec zmanjšamo za 1
    return izkupicek

print(ruleta(1112232212)==-20)
print(ruleta(12213331212)==30)

Testni primeri

Za testna primera si izberemo kar primera iz navodil in jih napišemo pod programom. Za oba primera nam izpiše da sta pravilna. Ta dva testna primera sta dovolj dobra, saj v številu, ki ga vnesemo kot parameter n, nastopajo vse tri števke, kar kaže na to, da se program dobro obnaša pri vsaki števki.

Vir

0%
0%