Eksamenstrening

Noen av oppgavene under er inspirert fra tidligere eksamensoppgaver.

Oppgave 1: Nest størst

Skriv en funksjon nest_størst som tar 4 ulike tall som argumenter og returnerer det tallet som er nest størst.

Vanskelig ekstraoppgave: La funksjonen ta en liste med tall (ubestemt antall) og et argument (int) som spesifiserer tallet som skal returneres (0 betyr høyeste tall, 1 er nest høyeste tall, 2 er det tredje høyeste tallet osv). Det er ikke lov å bruke sort.

Oppgave 2: Finn feilen

Hva er feil i koden her? Rett opp feilen slik at funksjonen gjør det den skal.

def alle_tall_er_ulike(tall):
    assert type(tall) == list
    
    sjekket = []
    for t in tall:
        if t not in sjekket:
            alle_er_unike = True
        else:
            alle_er_unike = False
        
        sjekket.append(t)

    return alle_er_unike

Oppgave 3: Birthday paradox

Det sies at i skoleklasser er det mer vanlig at det finnes to personer som har bursdag på samme dag enn at det ikke gjør det (birthday paradox).

Vi antar at en skoleklasse består av 30 elever, og at det er 365 dager i året. Simuler noen tusen skoleklasser og avgjør om det ser ut til at påstanden stemmer eller ikke.

Oppgave 4: Menn og kvinner

På et rart øysamfunn har beboerne bestemt seg for at de ønsker større andel jenter, og lager derfor følgende regel:

Eksempel:

Vil det på sikt bli flere jenter enn gutter på denne øya? Eller omvendt? Vi antar 50/50 sannsynlighet for å få jente/gutt. Skriv kode som simulerer scenarioet. Man kan anta at det finnes et visst antall par som genererer barn, og at barna ikke får barn videre osv.

Oppgave 4: Klassediagrammer

Skriv kode som gjør at klassediagrammet (vi tegner på tavla) stemmer og slik at følgende assert fungerer:

bygning = Bygning("Ifi")
bygning.legg_til_rom(Rom("CAML", antall_plasser=72))
bygning.legg_til_rom(Rom("AWK", antall_plasser=16))
assert bygning.finn_storste_rom().hent_navn() == "CAML"

Oppgave 5: Forenkle kode

Gjør følgende kode mer lesbar og enklere ved å introdusere prosedyrer/funksjoner:

# Programmet skal lese navn og alder fra 3 ulike filer og printe navnene sortert
alle_navn = []
f = open("navn1.txt")
for line in f:
    navn = line.strip()
    alle_navn.append(navn)
    
f = open("navn2.txt")
for line in f:
    navn = line.strip()
    alle_navn.append(navn)

f = open("andre_navn.txt")
for line in f:
    navn = line.strip()
    alle_navn.append(navn)

print('\n'.join(sorted(alle_navn)))

Oppgave 6

Skriv en funksjon velg_gave som tar to argumenter mulige_gaver og onskeliste. Funksjonen skal forsøke å finne en gave blant mulige_gaver som er på ønskelisten og returnere den gaven. Hvis det ikke finnes noen match skal en hvilken som helst gave returneres.

Oppgave 7: Fibonacci

Anta at vi lever i en verden der kaniner aldri dør. Alle kaniner som er 2 år eller eldre vil alltid få 1 barn hvert år (vi ignorerer kjønn og par osv).

Anta at vi starter med 2 nyfødte baby-kaniner. Det første året skjer ingenting, men det andre året vil disse generere to barn. Året etter vil de to barna selv ikke generere avkom, mens foreldrene vil fortsette. Året etter vil de første avkommene være gamle nok til å generere barn. Dette blir fort komplisert, men vi kan skrive kode for å holde orden på hvem som får barn når.

Lag en klasse Kanin som har en alder og en klasse Verden som holder orden på kaninene og sørger for at riktige kaniner skal generere barn hvert år. Hvor mange kaniner vil det være etter X antall år?