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.