Naloge - drugi teden

A-javost nizov

Napiši program, ki mu uporabnik vpiše niz in pove, koliko črk a je v njem.

Rešitev

niz = input('Vpišite niz: ') 
stevec = 0 
for crka in niz: 
    if crka =='a': 
        stevec += 1 
print('Število a-jev:', stevec) 

Lahko pa uporabimo metodo count

print('Število a-jev:', niz.count('a'))

Najmanjši pozitivec

Napiši program, ki v danem seznamu števil (lahko ga zapišete kar na začetek programa, npr. l = [5, 4, -7, 2, 12, -3, -4, 11, 7]) poišče in izpiše najmanjše pozitivno število v njem. Za gornji seznam tako izpiše 2.

Rešitev

xs = [5, 4, -7, 2, 12, -3, -4, 11, 7] 
min_pos = float("inf") 
for x in xs: 
    if 0 < x < min_pos: 
        min_pos = x 
print(min_pos) 

Nalogo bi sam rešil tako, da bi se najprej znebil negativnih stevil, nato pa uporabil pythonov min.

print(min(x for x in xs if x > 0))

Najtežji ven!

Imamo seznam tež, na primer teze = [66, 72, 84, 68, 96, 73, 80]. Napiši program, ki iz seznama pobriše največjo težo. Od gornjega seznama mora tako ostati [66, 72, 84, 68, 73, 80].

Namig: uporabi enumerate, da boš imel indeks in težo, takole, for i, teza in enumerate(teze):. Nadaljuj tako, kot smo delali, ko smo iskali največji element seznama (največjo vrednost delnice), le da si poleg teže zapomni tudi indeks tega elementa. Denimo, da si ga shranil v najvecji_i; program v tem primeru končaš tako, da pobrišeš ta element, del teze[najvecji_i].

Rešitev

teze = [66, 72, 84, 68, 96, 73, 80] 
najvecji_i = 0 
for i, teza in enumerate(teze): 
    if teza > teze[najvecji_i]: 
        najvecji_i = i 
del teze[najvecji_i] 

Lahko pa uporabimo bližnjico:

del teze[teze.index(max(teze))]

Povprečje brez najtežjega

Dopolni prejšnji program tako, da bo po tem, ko iz seznama odstrani "najtežji element", izračunal povprečno težo.

Rešitev

teze = [66, 72, 84, 68, 96, 73, 80] 
najvecji_i = 0 
vsota = 0 
for i, teza in enumerate(teze): 
    vsota += teza 
    if teza > teze[najvecji_i]:
        najvecji_i = i 
vsota -= teze[najvecji_i] 
del teze[najvecji_i]
print(vsota / len(teze))

Padajoča povprečja

Dopolni prejšnji program tako, da odstrani najtežjega, izračuna povprečje ... in to ponavlja (spet odstrani najtežjega, izračuna povprečje, odstrani najtežjega, izračuna povprečje ...) dokler seznam ni prazen.

Namig: okrog vsega, kar si napisal prej, bo potrebno dodati še eno zanko - for ali while, poskusi z obema!

Rešitev

teze = [66, 72, 84, 68, 96, 73, 80] 
while teze: 
    najvecji_i = 0 
    vsota = 0 
    for i, teza in enumerate(teze): 
        vsota += teza 
        if teza > teze[najvecji_i]: 
            najvecji_i = i 
    vsota -= teze[najvecji_i] 
    del teze[najvecji_i] 
    if teze: print(vsota / len(teze))

Indeks telesne teže

Imejmo seznam trojk ime osebe, teža, višina, na primer:

podatki = [
    ["Ana", 55, 165], 
    ["Berta", 60, 153],
]

Napiši program, ki izpiše imena oseb in njihove indekse telesne teže.

Rešitev

podatki = [ ["Ana", 55, 165], ["Berta", 60, 153], ] 
for ime, teza, visina in podatki: 
    print(ime, teza / (visina / 100)**2) 

Fršlusanje zmagovalcev

V Planici so zgradili novo, dvojno skakalnico, s katero lahko izvajajo meddržavna tekmovanja v paralelnih skokih. Stvar je preprosta: skakalci se paroma odganjajo z dveh skakalnic, eni z ene, drugi z druge. Država, katere skakalec je skočil dlje, dobi točko. Zmaga država, ki dobi več točk. Napiši program, ki pove, katera država je zmagala.

Dolžine skokov so zbrane v dveh seznamih, ki jih lahko napišete kar na začetek programa, na primer takole:

finska = [153, 141, 152, 160, 135]
danska = [148, 148, 148, 148, 148]

(se zdijo Danci še komu dolgočasni? :) V tekmi so zmagali Finci, saj so bili boljši v treh skokih, Danci pa le v dveh.

Rešitev

finska = [153, 141, 152, 160, 135] 
danska = [148, 148, 148, 148, 148] 
stevec = 0 
for finec, danec in zip(finska, danska): 
    if finec > danec: 
        stevec += 1 
    elif finec < danec: 
        stevec -= 1 

if stevec > 0: print('Finec') 
elif stevec < 0: print('Danec') 
else: print('Izenaceno')

Dobički

Pravila neke igre so takšna: igralci dobivajo vprašanja, za katera dobijo različno količino denarja. Ko prvič napačno odgovori, za kar seveda dobi 0 evrov, je igre zanj konec. V seznamu so zapisani dobički za posamezne odgovore, na primer takole

l = [4, 5, 8, 0, 4, 1, 2, 0, 0, 0, 4, 6, 10, 0, 5, 0, 12, 1, 0]

Napišite program, ki izpiše dobičke posameznih tekmovalcev, pri čemer preskoči tiste, ki niso zaslužili ničesar. Za gornji seznam mora izpisati

17 
7 
20 
5 
13

Rešitev

xs = [4, 5, 8, 0, 4, 1, 2, 0, 0, 0, 4, 6, 10, 0, 5, 0, 12, 1, 0]
sestevek = 0 
for x in xs: 
    if x != 0: 
        sestevek += x 
    elif sestevek != 0:
        print(sestevek) 
        sestevek = 0

Seznam dobičkov

Spremeni gornji program tako, da dobičkov ne izpiše, temveč jih zapiše v nov seznam in ga izpiše. V gornjem primeru, recimo, mora izpisati

[17, 7, 20, 5, 13]

Rešitev

xs = [4, 5, 8, 0, 4, 1, 2, 0, 0, 0, 4, 6, 10, 0, 5, 0, 12, 1, 0] 
ys = [] 
sestevek = 0 
for x in xs: 
    if x != 0: 
        sestevek += x 
    elif sestevek != 0: 
        ys.append(sestevek) 
        sestevek = 0 
print(ys)

Oklepaji

Imamo izraz zapisan kot niz, ki je sestavljen samo iz oklepajev in zaklepajev. Napišite program, ki ugotovi regularnost takega izraza, oz. če se vsi oklepaji ustrezno zaprejo z zaklepaji.

Primeri regularnih izrazov: "()", "(())", "(()()())()".

In neregularnih: "((", ")(", "(()()))"

Rešitev

s = "((()(()))())"

oklepajev = 0
for c in s:
    if c == "(":
        oklepajev += 1
    else:
        oklepajev -= 1
        if oklepajev<0:
            break
if oklepajev == 0:
    print("Izraz je OK")
else:
    print("Izraz NI ok")

Malo bolj kompleksni oklepaji

Ta naloga je podobna prvi, s to razliko, da imamo zdaj več tipov oklepajev. Naj vsaka črka angleške abecede predstavlja en tip oklepaja, kjer velika črka odpira oklepaj in mala črka zapira (zaklepaj). Pri tej nalogi je treba paziti, da se vgnezdeni oklepaji zaprejo pred zunanjimi. Na primer, niz "ABba" je pravilen, a "ABab" pa ne, ker se oklepaj tipa B ne zapre pred oklepajem tipa A.

Primeri regularnih: "Aa", "AaBb", "AaBbACBbDdcDda".

In neregularnih: "ABC", "aB", "aA", "ABCabc".

Rešitev

s = "ABCcBbDEedba"

sklad = []
for c in s:
    if c.isupper():
        sklad.append(c)
    elif not sklad or sklad.pop().lower() != c:
        print("Napaka pri znaku", c)
        break
else:
    if sklad:
        print("Nekateri tagi niso zaprti (%s)" % ", ".join(sklad))
    else:
        print("Niz je pravilen")

Zadnja sprememba: sreda, 9. november 2022, 12.52