Funktio – vaikeat tehtävät

Tehtävä 1. Toteuta funktio, joka selvittää, onko annettu merkkijono palindromi.
Palindromi on merkkijono, joka on sama etu- ja takaperin, kun siitä poistetaan välilyönnit. Syötteenä annetaan merkkijono, joka voi sisältää pieniä kirjaimia ja välilyöntejä. Vertailussa älä huomioi välilyöntejä.

Kokeile ovatko nämä merkkijonot palindromeja:
ellan nalle
saippuakauppias
puupää
isä älä myy myymälääsi

Kokeile koodia halutessasi myös muilla merkkijonoilla!

Esimerkki tuloste:
Sana <merkkijono> on palindromi
Sana <merkkijono> ei ole palindromi

""

Koodi:

def selvittaa_palindromin(sana):
    alkuperainen = sana
    sana = sana.replace(" ", "")
    sana_takaperin ="".join(reversed(sana))
    indeksi = 0

    for i in sana:
        if i == sana_takaperin[indeksi]:
            if indeksi == len(sana)-1:
                return f"Sana {alkuperainen} on palindromi"
        else:
            return f"Sana {alkuperainen} ei ole palindromi"
        indeksi = indeksi + 1

print(selvittaa_palindromin("ellan nalle"))
print(selvittaa_palindromin("saippuakauppias"))
print(selvittaa_palindromin("puupää"))
print(selvittaa_palindromin("isä älä myy myymälääsi"))

Tuloste:

Sana ellan nalle on palindromi
Sana saippuakauppias on palindromi
Sana puupää ei ole palindromi
Sana isä älä myy myymälääsi on palindromi

Tehtävä 2. Toteuta seuraavat funktiot. Ensimmäinen funktio muuttaa kymmenjärjestelmän luvun binääriin ja toinen binääristä kymmenjärjestelmään.

Tapa 1.

""

Koodi:

def kymmenen_binaariin(luku):
    binaari = ""
    if luku == 0:
        return "0"
    else:
        while luku > 0:
            binaari = str(luku % 2) + binaari
            luku = luku // 2
    return binaari

def binaari_kymmenen(luku):
    luku_takaperin = reversed(str(luku))
    indeksi = 0
    kymmenjarj = 0
    if luku == 0:
        return "0"
    else:
        for i in luku_takaperin:
            kymmenjarj = kymmenjarj + (int(i)*2**indeksi)
            indeksi = indeksi + 1
    return kymmenjarj

print(kymmenen_binaariin(28))
print(binaari_kymmenen(11100))

Tuloste:

11100
28

Tapa 2.

""

Koodi:

def binaari_kymmenen(luku):
    vastaus = int(str(luku), 2)
    return vastaus

def kymmenen_binaariin(luku):
    vastaus = bin(luku)
    return vastaus

print(kymmenen_binaariin(28))
print(binaari_kymmenen(11100))

Tuloste:

0b11100
28

Tehtävä 3. Toteuta funktio, joka selvittää, onko luku alkuluku vai ei. Jos luku ei ole alkuluku funktio suorittaa toisen funktion, joka ratkaisee luvun tekijät.

Kokeile ovatko annetut luvut alkulukuja.
240
23
-1

Kokeile koodia halutessasi myös muilla numeroilla!

Esimerkki tulosteet:
Luku ei ole alkuluku ja on suurempi tai yhtä suuri kuin 2:
Luvun <luku> tekijät ovat [1, 2,…,n ].

Luku on alkuluku:
Luku <luku> on alkuluku

Luku ei ole alkuluku ja on pienempi kuin 2.
Luku <luku> ei ole alkuluku

Kuvakaappaus Python-koodista. Koodi ja tuloste on luettavissa myös sivun vetolaatikossa tekstimuodossa.
Koodi
import math

def selvita_alkuluku(luku):

    if luku < 2:
        return f"Luku {luku} ei ole alkuluku"
    else:
        for i in range(2, int(math.sqrt(luku))+1):
            if luku % i != 0:
                return f"Luku {luku} on alkuluku"
            else:
                return luvun_tekijat(luku)

def luvun_tekijat(luku):
    tekijat = []
    for j in range(1, int(math.sqrt(luku))+1):
        if luku % j == 0:
            tekijat.append(j)
            if j*j != luku:
                tekijat.append(luku//j)
    tekijat.sort()
    return f"Luvun {luku} tekijät ovat {tekijat}."

print(selvita_alkuluku(240))
print(selvita_alkuluku(23))
print(selvita_alkuluku(-1))
Tuloste

Luvun 240 tekijät ovat [1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 16, 20, 24, 30, 40, 48, 60, 80, 120, 240].
Luku 23 on alkuluku
Luku -1 ei ole alkuluku

Tehtävä 4. Toteuta funktio, joka tulostaa näkyville jokaisen rivin jakoyhtälöstä ja palauttaa suurimman yhteisen tekijän.

Kokeile toimiiko koodi oikein ainakin luvuilla 1819 ja 867. Voit myös halutessasi kokeilla muitakin lukuja.

Esimerkki tuloste:

1819 = 867 * 2 + 85

867 = 85 * 10 + 17

85 = 17 * 5 + 0

Suurin yhteinen tekijä on 17 eli toiseksi viimeinen jakoyhtälön jakojäännös.

Kuvakaappaus Python-koodista. Koodi ja tuloste on luettavissa myös sivun vetolaatikossa tekstimuodossa.

Koodi
def toteuttaa_jakoyhtalo(a, b):
    r = a % b
    jakojaannokset = []

    while r != 0:
        q = a // b
        r = a % b

        print(f"{a} = {b} * {q} + {r}")

        a = b
        b = r

        jakojaannokset.append(r)

    return f"Suurin yhteinen tekijä on {jakojaannokset[len(jakojaannokset)-2]} eli toiseksi viimeinen jakoyhtälön jakojäännös."



print(toteuttaa_jakoyhtalo(1819, 867))
Tuloste

1819 = 867 * 2 + 85
867 = 85 * 10 + 17
85 = 17 * 5 + 0
Suurin yhteinen tekijä on 17 eli toiseksi viimeinen jakoyhtälön jakojäännös.