Rešitve s komentarji
1. Določanje spola
Zanima nas torej, ali je trimestno število, ki se začne pri deveti števki, večje ali enako 500. To število sicer res dobimo z int(emso[9:12])
, pa vendar gre še enostavneje. Spomniti se moramo le, da se trimestna števila, ki so večja ali enaka 500, vobče začenjajo s števko, ki je večja ali enaka 5, torej je rešitev prve naloge huronsko preprosta.
2. Srečni gostje
Naloga ni zahtevna, le precej pogojev je v rešitvi. Motita nas dve stvari.
Ker je miza okrogla, moramo zadnjega gosta obravnavati posebej. Naj bo
n
število gostov (torejn = len(razpored)
. Potem bi morali najbrž pisati zankofor i in range(n-1)
(pazite, n-1, gremo torej samo do vključno predzadnjega gosta, tistega z indeksomn-2
) in potem ugotavljamo srečoi
-tega gosta tako, da ga primerjamo z gostomai-1
ini+1
. Zadnjega gosta obravnavamo posebej - gostan-1
primerjamo z gostomn-2
in gostom0
.Trik, ki ga lahko uporabimo, da se temu izognemo, je preprost: gosta
i
primerjamo z gostomai-1
in(i+1)%n
. Dokler jei
manjši odn-1
, je(i+1)%n
isto koti+1
. Pri nerodnem zadnjem gostu, ko jei
enakn-1
, pa je(i+1)%n
enakon%n
torej 0!Pogoji so malo zoprni: če je
i
-ti ženska, morata biti soseda moška. Če jei
-ti moški, morata biti sosedi ženski. Vendar se da to povedati veliko preprostje: spoli
-tega mora biti drugačen od spola sosedov. Torej: funkcijajeŽenska
, ki smo jo napisali v prejšnji nalogi, mora vračati drugačno vrednost za soseda.
C'est tout! Če se trikov ne domislimo, je rešitev nekoliko daljša, a v osnovi nič težja.
3. Razporedi
Trik je povedal vse: najprej naredimo seznam žensk in seznam moških. Potem jih izmenično dodajamo v seznam, na koncu pa oddamo še nepoparjene.
V gornjem programu smo si privoščili le en mali trik, predzadnjo vrstico: eden od seznamov, ki ju prištevamo, moski[parov:]
ali pa zenske[parov:]
je v resnici prazen.
Nalogo rešimo še malo elegantneje.
Gre seveda tudi krajše, celo v eni vrstici, a tale rešitev je še povsem elegantna in vsaj eno študentko sem videl pisati nekaj v tem slogu.
Sicer pa ta naloga nudi še nekaj lepih možnih rešitev. Spodnji bi naredil veliko krivico, če je ne bi objavil:
4. Enaka razporeda
Dva razporeda sta enaka, če enega lahko "preobrnemo" v drugega, tako, da postavimo vse goste od i-tega naprej na začetek. To nam da skoraj pravilno rešitev naloge:
Težave imamo le še, če sta obe mizi prazni. V tem primeru sta namreč enaki, vendar ne uspemo priti do return True
, saj se zanka nikoli ne izvede. To lahko rešimo tako, da na začetek funkcije, damo if not razpored1 and not razpored2: return True
. Če hočemo krajši program, pa to zrinemo v return
: četudi znotraj zanke nismo vrnili True
, je pravilni odgovor še vedno True
, če sta oba seznama prazna.
Nekoliko daljša, a hitrejša rešitev ne uporablja zanke (vsaj ne v Pythonu), ker ugane, koliko je treba zavrteti mizo:
5. Hosts
Program ni vreden komentarja.
6. Iskanje URLjev
Tudi ta ne.
Tudi, če ste izpustili \b
na začetku (o tem se res nismo pogovarjali), ne bom hud. Nekateri ste nalogo rešili brez regularnih izrazov. Tudi prav.