Løsningsforslag 5

Oppgave 1
# 1a
def multiply_5_minus_pi(my_number):
    return (my_number * 5) - 3.14

# 1b
def shout(text):
    return f"{text}!"

# 1c
def name_age(name, gender, age):
    return f"{name} er {gender} og er {age} år gammel."

#1d
def kinetic_energy(m,v):
    return 0.5 * m * (v ** 2)
Oppgave 2
# 1a
def conc_from_pH(ph):
    return 10**(-ph)

# alternativ løsning med math module
from math import pow
def conc_from_pH(pH):
    conc = pow(10, -pH)
    return conc

from math import log10
def find_acidity(conc):
    ph = -log10(conc)

    if ph > 7:
        return "basic"
    if ph == 7:
        return "neutral"
    # hvis de 2 første if setningene er false.
    # trenger vi ikke å sjekke siste betingelse.
    return "acidic"
Oppgave 3
def will_work(city, salary):
    bergen_lim = 400000
    anywhere_lim = 600000
    oslo_lim = 950000

    if city == "Bergen":
        return salary >= bergen_lim
    if city == "Oslo":
        return salary >= oslo_lim
    if city == "Verdensrommet":
        return salary >= 0
    
    return salary >= anywhere_lim
Oppgave 4
# 4a
def cross_sum(n):
    sum = 0
    for c in str(n):
        sum += int(c)
    return sum

# 4b
def nth_number_with_cross_sum_x(n, x):
    counter = 0
    i = 0
    while True:
        if cross_sum(i) == x:
            counter += 1
        if counter == n:
            return i
        i += 1
Bonus 1
def is_even_positive_int(x):
    if type(x) != int:
        return False
    
    if x % 2 == 0:
        return True
    
    return False

# eller

def is_even_positive_int(x):
    return type(x) == int and x%2 == 0
Bonus 2
def is_legal_triangle(a, b, c):
    # Dette er som å gjøre en if/else
    # Men vi lagrer resultatet i en variabel. 
    a_valid = type(a) == int or type(a) == float # Disse evaluerer til True/False.
    b_valid = type(b) == int or type(b) == float 
    c_valid = type(c) == int or type(c) == float

    all_valid = (a_valid and b_valid and c_valid)
    # Sjekk at alle har riktig type
    if all_valid:
        check_a = a < (b+c) # sjekk om a er mindre en b + c
        check_b = b < (a+c)
        check_c = c < (a+b)
        # sjekk om hver enkelt side er mindre en summen av de 2 andre sidene.
        check_all = (check_a and check_b and check_c)
        return check_all

    # i alle andre tilfeller
    return False
Bonus 3
def joker(x1, x2, x3, x4, x5):
    for x in (x1, x2, x3, x4, x5):
        print("opp" if x <= 4 else "ned")

# alternativ løsning IKKE pensum
# Hvis funksjonen tar et parameter med "*"
# Vil funksjonen ta uendlige mange verdier.
# Som kan behandles som en liste 
def joker(*args):
    for x in args:
        print("opp" if x <= 4 else "ned")
Bonus 4
# 4a
def point_in_rectangle(x1, y1, x2, y2, x, y):
    return (min(x1, x2) <= x <= max(x1, x2) 
        and min(y1, y2) <= y <= max(y1, y2))
# 4b

def rectangles_overlap(x0, y0, x1, y1, x2, y2, x3, y3):
    # må sjekke alle 4 kombi av x2/3 y2/3:
    if point_in_rectangle(x0, y0, x1, y1, x2, y2):
        return True
    if point_in_rectangle(x0, y0, x1, y1, x3, y3):
        return True    
    if point_in_rectangle(x0, y0, x1, y1, x2, y3):
        return True    
    if point_in_rectangle(x0, y0, x1, y1, x3, y2):
        return True

    return False

# 4c

# avstand mellom 2 punkt
def distance(x1, y1, x2, y2):
    dx2 = (x1-x2)**2
    dy2 = (y1-y2)**2
    return (dx2 + dy2)**0.5

def circle_overlaps_rectangle(x0, y0, x1, y1, x2, y2, r2):

    left = min(x0, x1)
    right = max(x0, x1)
    upper = min(y0, y1)
    lower = max(y0, y1)

    # senteret er i rektangel
    if point_in_rectangle(x0, y0, x1, y1, x2, y2):
        return True

    # senteret ligger utenfor rektangelen + radius
    if not point_in_rectangle((left - r2), (upper + r2), (right + r2), (lower - r2), x2, y2):
        return False

    if left <= x2 <= right:
        return True
    if upper <= y2 <= lower:
        return True

    # hjørnene
    if (distance(x0, y0, x2, y2) < r2
        or distance(x1, y1, x2, y2) < r2
        or distance(x0, y1, x2, y2) < r2
        or distance(x1, y0, x2, y2) < r2
        ):
        return True

    return False