Beholdere og l?kker - l?sningsforslag

SUM OPP TIL TALL

def sum_opp_til(tall):
    """
    F?rst oppretter vi en variabel 'sum' med verdi 0, 
    og s? bruker vi 'for i in range(tall + 1)' for ? 
    gi oss alle tallene fra 0 til og med tallet sent 
    inn som parameter. I l?kken legger vi til ett og
    ett av disse tallene, og returnerer til slutt
    summen.
    """
    sum = 0
    for i in range(tall + 1):
        sum += i
    
    return sum

assert sum_opp_til(10) == 55
assert sum_opp_til(12) == 78

ANTALL FOREKOMSTER

def antall_forekomster(liste):
    """
    F?rst oppretter vi en tom ordbok, og s? bruker vi 
    'for element in beholder' for ? g? gjennom ett og 
    ett element i listen. Deretter sjekker vi om 
    elementet finnes i ordboken v?r fra f?r, og hvis 
    det gj?r det legger vi til 1 til verdien som 
    allerede ligger der. Om elementet ikke finnes i 
    ordboken enn?, legger vi det inn med verdi 1. 
    Til slutt returnerer vi ordboken.
    """
    ordbok = {}
    for element in liste:
        if element in ordbok:
            ordbok[element] += 1
        else:
            ordbok[element] = 1
    
    return ordbok

testliste = [
    'Siri', 'Geir Kjetil', 
    'Roger', 'Omid', 
    'Siri', 'Lars', 
    'Roger', 'Roger'
    ]

print(antall_forekomster(testliste))

VANLIGSTE ELEMENT I LISTE

def finn_vanligste_element(liste):
    """
    F?rst oppretter vi variabler som skal holde p?
    det forel?pige vanligste elementet vi har funnet,
    og hvor mange ganger det forekommer i listen.
    Deretter g?r vi gjennom hvert unike element i 
    listen, ved ? lage en variant av listen som en 
    mengde (siden vi da ikke f?r noen duplikater).
    For hvert av disse unike elementene g?r vi
    gjennom den originale listen og sammenligner
    elementene i den med det unike elementet vi har
    kommet til, og om de er like ?ker vi 
    antall_forekomster med 1. N?r vi har sammenlignet
    med alle elementene i listen, ser vi om det
    gjeldende elementet forekommer oftere enn det
    vi allerede har lagret som det vanligste - og
    oppdaterer det vanligste elementet i s? fall.
    Til slutt returnerer vi det vanligste elementet.
    """
    vanligste_element = None
    flest_forekomster = 0

    for unikt_element in set(liste):
        antall_forekomster = 0
        for element in liste:
            if unikt_element == element:
                antall_forekomster += 1
        
        if antall_forekomster > flest_forekomster:
            vanligste_element = unikt_element
            flest_forekomster = antall_forekomster
    
    return vanligste_element

testliste = [
    'Siri', 'Geir Kjetil', 
    'Roger', 'Omid', 
    'Siri', 'Lars', 
    'Roger', 'Roger',
    ]

print(finn_vanligste_element(testliste))

NAVN I BEHOLDER

def skriv_inn_navn():
    """
    Siden vi skal ende opp med fem _unike_ navn, 
    starter vi med ? opprette en tom mengde. Deretter
    g?r vi inn i en while-l?kke som kj?rer helt til
    mengden inneholder fem ulike navn. Inni l?kken
    tar vi input fra bruker.
    Til slutt itererer vi gjennom mengden og skriver
    ut alle navnene i den, med 'Hei' f?rst.
    """
    navnemengde = set()

    while len(navnemengde) < 5:
        navnemengde.add(input("Skriv inn et navn: "))
    
    for navn in navnemengde:
        print(f"Hei {navn}")

skriv_inn_navn()

NEST ST?RSTE TALL

def finn_nest_stoerste(mengde):
    """
    F?rst finner vi det st?rste tallet i mengden, og
    fjerner det. Deretter finner vi det st?rste som
    er igjen, og returnerer det.
    """

    stoerst = 0
    for tall in mengde:
        if tall > stoerst:
            stoerst = tall
    
    mengde.remove(stoerst)

    nest_stoerst = 0
    for tall in mengde:
        if tall > nest_stoerst:
            nest_stoerst = tall
    
    return nest_stoerst

def finn_nest_stoerste2(mengde):
    """
    Alternativ versjon som gj?r akkurat det samme som den
    over, men bruker 'max()' i stedet for l?kker.
    """
    mengde.remove(max(mengde))
    return max(mengde)
    
assert finn_nest_stoerste({1, 2, 3, 4}) == 3
assert finn_nest_stoerste({11, 5, 18, 19, 1, 0, 0, 34}) == 19

assert finn_nest_stoerste2({1, 2, 3, 4}) == 3
assert finn_nest_stoerste2({11, 5, 18, 19, 1, 0, 0, 34}) == 19

def finn_nest_stoerste3(liste):
    """
    Svar p? bonusoppgaven: dette er nesten et luresp?rsm?l,
    for du kan bare gj?re om listen til en mengde og kalle 
    p? den samme funksjonen vi skrev tidligere.
    """
    return finn_nest_stoerste(set(liste))

assert finn_nest_stoerste3([1, 2, 5, 4, 5]) == 4
assert finn_nest_stoerste3([10000, 45, 10000, 1, 10000, 99, 10000]) == 99

TERNINGKASTSIMULATOR

from random import randint

# 1)
def kast_terninger():
    return randint(1, 6) == 6 and randint(1, 6) == 6

# 2)
def antall_kast_for_seksere():
    antall_kast = 0

    while not kast_terninger():
        antall_kast += 1
    return antall_kast

# 3)
def finn_gjennomsnitt(antall_runder):
    antall_kast_totalt = 0

    for _ in range(antall_runder):
        antall_kast_totalt += antall_kast_for_seksere()
    
    return antall_kast_totalt/antall_runder

# 4)
print(finn_gjennomsnitt(1000))

SUBSTRENG

def substreng(s1, s2):
    """
    Vi begynner med ? g? gjennom hver bokstav i s1, og
    ser om noen av dem er lik f?rste bokstav i s2. Om
    den er det, sjekker vi om neste bokstav i s1 er lik
    neste bokstav i s2, osv helt til vi har g?tt gjennom
    hele s2. Hvis vi kommer oss gjennom hele s2
    returnerer vi True, og ellers returnerer vi False
    """
    returneres = False

    for i in range(len(s1)):
        if s1[i] == s2[0]:
            returneres = True

            for j in range(len(s2)):
                if s1[i + j] != s2[j]:
                    returneres = False
                    break
            break

    return returneres

assert substreng("Hei paa deg!", "paa")
assert not substreng("Hei paa deg!", "p a")

def substreng2(s1, s2):
    """
    Alternativ m?te ? l?se samme problemet p?, som 
    benytter seg av python-n?kkelordet 'in'.
    """
    return s2 in s1

assert substreng2("Hei paa deg!", "paa")
assert not substreng2("Hei paa deg!", "p a")

UTFORDRING: KATTUNGE I ET TRE

Ikke noe l?sningsforslag her, dessverre! Dette er en del av en oblig i IN2010, s? jeg gir bare et hint: det eneste man trenger for ? l?se oppgaven er lister, l?kker, og lesing fra terminal.