Naloga

Vislice

Pri reševanju te naloge se striktno držite navodil: funkcije naj imajo natančno takšna imena, kot jih zahteva naloga in tudi izpis igre (naloga za 9) naj bo natančno tak, kot je podan.
za oceno 6
Napiši funkcijo getCharPos(word, char), ki vrne seznam mest v besedi word, na katerih nastopa podana črka char. Funkcija naj ne izpisuje ničesar, le rezultat naj vrača! >>> getCharPos("PONUDNIK","N") [2, 5] >>> getCharPos("RABARBARA", "R") [0, 4, 7] >>> getCharPos("AMFITEATER", "O") []

za oceno 7
Napiši funkcijo haveAllChars(word, chars), ki pove, ali množica chars vsebuje vse črke, ki se pojavijo v besedi word. Opomba: množica sme vsebovati tudi črke, ki se v besedi ne pojavijo. >>> haveAllChars("AMFITEATER", {"A", "M"}) False >>> haveAllChars("AMFITEATER", {"A", "M", "F", "I", "T", "E"}) False >>> haveAllChars("AMFITEATER", {"A", "M", "F", "I", "T", "E", "R"}) True >>> haveAllChars("AMFITEATER", {"A", "M", "F", "I", "T", "E", "R", "X", "O", "B", "L"}) True

za oceno 8
Napiši funkcijo showChars(word, chars), ki kot argument sprejme besedo word in množico (set) črk chars. Funkcijo mora vrniti besedo, v kateri so vse črke, ki ne nastopajo v množici chars, spremenjene v pike. >>> showChars("PONUDNIK", {"O", "N"}) '.ON..N..' >>> showChars("PONUDNIK", {"O", "I", "K"}) '.O....IK' >>> showChars("PONUDNIK", set()) '........' >>> showChars("PONUDNIK", {"P", "O", "N", "I", "K", "U"}) 'PONU.NIK'

za oceno 9
Napiši igro "vislice". Pri tem uporabljajte funkcije, ki ste jih napisali za ocene 6-8. Igra poteka tako, da računalnik izbere naključno besedo iz datoteke s samostalniki. Nato izpisuje besedo tako, da črke, ki jih igralec še ni uganil, zamenja s piko. Igralec vnese znak (pri čemer pazite na to, da lahko vnaša tudi male tiskane črke - spremenite jih v velike). Če beseda vsebuje vnešeni znak, se ti znaki v besedi "razkrijejo". Če beseda ne vsebuje želenega znaka, pa igralec "izgubi eno življenje". V začetku ima igralec 6 življenj; življenja se izpisujejo za besedo, med besedo in številom življenj mora biti en presledek. Igre je konec, ko igralec bodisi ugane vse črke, ki jih vsebuje beseda, bodisi izgubi vseh šest življenj. V prvem primeru mora računalnik izpisati "Bravo!" v drugem pa "Konec, iskana beseda je RESITEV.", kjer namesto RESITEV izpise besedo, ki smo jo (neuspešno) ugibali. Uspešna igra naj bo videti takole: ...... 6 a .A.... 6 e .A.... 5 i .A.... 4 o .A..O. 4 r .A..O. 3 l .A..O. 2 k .A..O. 1 t .A.TO. 1 s .ASTO. 1 n NASTO. 1 p NASTOP 1 Bravo! Neuspešna pa bo takšna. ....... 6 a ....... 5 b ....... 4 c ....... 3 d D...D.. 3 e D...DE. 3 f D...DE. 2 g D.G.DE. 2 h D.G.DE. 1 i Konec, iskana beseda je DOGODEK. ...... 6 .A.... 6 .A.... 5 .A.... 4 .A..O. 4 .A..O. 3 .A..O. 2 .A..O. 1 .A.TO. 1 .ASTO. 1 NASTO. 1 NASTOP 1 Bravo! in ....... 6 ....... 5 ....... 4 ....... 3 D...D.. 3 D...DE. 3 D...DE. 2 D.G.DE. 2 D.G.DE. 1 Konec, iskana beseda je DOGODEK.

Za oceno 10
Zelo dobra rešitev naloge 9. Recimo takšna, ki riše vislice. Tudi če oddajate nalogo za 10, obvezno oddajte tudi nalogo za 9, ki ima natanko tak izpis, kot je podan v nalogi.

Za oceno 10-14
Napišite program, ki igra vislice tako, da si besedo izmisli človek (igra je omejena na besede, ki imajo vsaj šest črk in ne vsebujejo šumnikov). Pri tem naj računalnik igra inteligentno, ne s slepim ugibanjem! Izkažite se z domiselnostjo!

Svarilo

Tale reč zna pa malo zasvojiti, ko imaš igro enkrat napisano. :) Računalnik si zna namreč izmisliti kar zanimive besede. Tole je bilo kar napeto. :) ............. 6 A ............A 6 E .E.E..E.....A 6 I .E.E..E.....A 5 O .E.E..E..O..A 5 R .E.E..E.RO..A 5 D .EDE..E.RO..A 5 J .EDE..E.RO..A 4 K .EDE..E.RO.KA 4 N .EDE..E.RO.KA 3 V .EDE..E.ROVKA 3 T .EDE..ETROVKA 3 P .EDE..ETROVKA 2 L .EDE..ETROVKA 1 S SEDE..ETROVKA 1 M SEDEMMETROVKA 1

Rešitev

Pozicije črk

def getCharPos(beseda, crka): mesta = [] for i in range(len(beseda)): if beseda[i] == crka: mesta.append(i) return mesta

Vse črke?

Tole je čista klasika: zanka, v kateri nekaj preverjaš in ki se tako prekine, ko naletiš na to, kar iščeš... Kot, recimo, praštevila (spet!).

def haveAllChars(beseda, crke): for c in beseda: if not c in crke: return False return True

Pomembno pri tem programu je, da mora biti return True izven zanke.

Pokaži črke

Tule je možnih več podobno dobrih rešitev, ena je tale.

def showChars(beseda, crke): bes = "" for c in beseda: if c in crke: bes += c else: bes += "." return bes

Najprej sestavimo prazen niz bes. Nato gremo čez dano besedo, črko za črko. Če je določena črka v množici, v bes dodamo to črko, sicer dodamo namesto nje samo piko.

Kratke rešitve

def getCharPos(beseda, crka): return [i for i, c in enumerate(beseda) if c==crka] def haveAllChars(beseda, crke): return set(beseda) <= crke def showChars(beseda, crke): print "".join((c if c in crke else ".") for c in beseda)

Prva funkcija temelji na dveh preprostih trikih, ki ju bomo morda spoznali na predavanjih. Tretja funkcija je čisto lepa, ko jo znaš enkrat prebrati.

Drugo funkcijo pa bi morali pravzaprav znati napisati tudi sami! Funkcija le sestavi množico, ki vsebuje vse črke besede in preveri, ali je ta množica podmnožica dane množice črk (operator <= lahko uporabimo tudi za preverjanje podmnožic).

Vislice

besede = open("samostalniki.txt").read().strip().split() import random def igra(): beseda = random.choice(besede) izbrane = set() zivljenj = 6 while zivljenj: print(showChars(beseda, izbrane), zivljenj) if haveAllChars(beseda, izbrane): print("Bravo!") break crka = input().upper() if not getCharPos(beseda, crka): zivljenj -= 1 izbrane.add(crka) if not zivljenj: print("Konec, iskana beseda je {}.".format(beseda))

V programu smo se potrudili uporabiti vse tri funkcije, ki smo jih napisali poprej. Vse povsem logično sodijo v program, razen, morda, getCharPos. Funkcija nam vrne seznam mest, kjer se v besedi pojavi črka, ki jo je vpisal uporabnik. Če je ta seznam prazen, se črka v besedi ne pojavlja, in lahko zmanjšamo število življenj. Namesto tega bi seveda lahko pisali if crka not in beseda:.

Last modified: Sunday, 13 November 2011, 12:27 AM