Obvezna naloga: Uporabnik ugiba število

Naloga

Napiši program, ki si izmisli število med 0 in 63, človek pa ga mora uganiti. Računalnik mu pomaga tako, da mu pove, ali je iskano število večje ali manjše od tistega, ki ga je vpisal uporabnik. Če je enako, pa program izpiše "Bravo, uganil si." in pove, koliko poskusov je človek potreboval.

Vnesi število: 32
Manj
Vnesi število: 16
Več
Vnesi število:  24
Manj
Vnesi število:  20
Manj
Vnesi število:  18
Bravo, uganil si.
Potreboval si 5 poskusov.

Naključno število dobiš tako, da pokličeš randint(0, 63). Da boš lahko klical to funkcijo, moraš na začetek programa napisati from random import randint.

Rešitev

V osnovi želimo narediti tole (s tem, da manjka še kaj spredaj, vmes in zadaj):

while ugib != skrivno_stevilo:
    ugib = int(input("Vnesi število: "))
    if ugib > skrivno_stevilo:
        print("Manj")
    elif ugib < skrivno_stevilo:
        print("Več")

Zanka se mora ponavljati, dokler uporabnikov "ugib" ni enak skrivnemu številu; while ugib != skrivno_stevilo. Ponavljamo pa tole: uporabnika vprašamo po številu in glede na to, v katero smer je zgrešil, izpišemo "Manj" ali "Več".

Preden začnemo, si moramo izmisliti število, ko končamo, pa izpisati, da je uporabnik uganil.

from random import randint

skrivno_stevilo = randint(0, 63)
while ugib != skrivno_stevilo:
    ugib = int(input("Vnesi število: "))
    if ugib > skrivno_stevilo:
        print("Manj")
    elif ugib < skrivno_stevilo:
        print("Več")

print("Bravo, uganil si.")

Program še vedno ne deluje: v trenutku, ko prvič pridemo do while, spremenljivka ugib še nima vrednosti. Najprejprostejša rešitev je, da ji jo damo - in to napačno, tako da se bo zanka gotovo vsaj enkrat izvedla.

from random import randint

skrivno_stevilo = randint(0, 63)
ugib = -1
while ugib != skrivno_stevilo:
    ugib = int(input("Vnesi število: "))
    if ugib > skrivno_stevilo:
        print("Manj")
    elif ugib < skrivno_stevilo:
        print("Več")

print("Bravo, uganil si.")

Zdaj dodajmo še štetje poskusov.

from random import randint

skrivno_stevilo = randint(0, 63)
poskusov = 0
while poskusov == 0 or ugib != skrivno_stevilo:
    ugib = int(input("Vnesi število: "))
    if ugib > skrivno_stevilo:
        print("Manj")
    elif ugib < skrivno_stevilo:
        print("Več")
    poskusov += 1

print("Bravo, uganil si.")
print("Potreboval si", poskusov, "poskusov.")

Mimogrede se znebimo ugib = -1. Ker štejemo poskuse, preprosto dodamo poskus == 0 or. Na ta način se bo zanka prvič izvedla, ne da bi Python preveril pogoj ugib != skrivno_steivlo - in spoznal, da ugib sploh ne obstaja.

Dodatna naloga: Računalnik ugiba število

Naloga

Napiši podoben program, vendar tako, da števila ugiba računalnik, človek pa vpisuje "več" ali "manj". Računalnik naj ugiba po kakem pametnem sistemu.

32? več
48? manj
40? več
44? manj
42? bravo
Potreboval sem 5 poskusov.

Rešitev

Zapomniti si moramo obseg, znotraj katerega je lahko število. Vsakič bomo vprašali po številu, ki je na sredi možnega intervala.

od = 0
do = 63

poskusov = 0
while poskusov == 0 or odg != "bravo":
    vpr = (od + do + 1) // 2
    odg = input(str(vpr) + "? ")
    if odg == "več":
        od = vpr + 1
    elif odg == "manj":
        do = vpr - 1
    poskusov += 1

print("Potreboval sem", poskusov, "poskusov")

Nekaj zanimivega: če odgovore več zamenjamo z 1, odgovore manj pa z 0, in dobljeno zaporedje dopolnimo s toliko ničlami, da ima zaporedje šest členov, dobimo število, ki ga ugibamo, pretvorjeno v dvojiški zapis.

Ugibanje števila in pretvarjanje v dvojiški zapis je ena in ista reč. Pošiljanje podatkov po internetu, bluetoothu, USBju ... je kot ugibanje števila.

Last modified: Tuesday, 10 October 2017, 7:22 PM