Yliopiston etusivulle Suomeksi
Helsingin yliopisto
5. luentokerran harjoitustehtävät

Yhteystiedot:

Osoite:
Yleisen kielitieteen laitos
PL 9
Siltavuorenpenger 20A
00014 Helsingin yliopisto

Puhelin: +358 (09) 1911 (vaihde)
Faksi: +358 (09) 191 29307

5. luentokerran harjoitustehtävät

  • Tehtävien deadline: 24.2.2005 klo 0 ante meridiem
  • Tehtävien palaute: 1.3.2005 klo 0 post meridiem

Tehtävät ovat jälleen (enimmäkseen) kumulatiivisia, eli ne kannattaa näprätä yhteen ohjelmatiedostoon. Lisäksi ehdotan, että kokeilette funktioita tunnilla esitellyllä tekniikalla (import tiedostonnimireload(tiedostonnimi)), mutta tätä ei tietenkään tarkasteta.

Tehtäviin on merkitty, mitkä ovat käsittääkseni helppoja ja mitkä vaikeita, jotta ette masennu.

  1. (helppo) Kirjoita funktio sisaltyy, joka ottaa kaksi argumenttia, merkkijonon mj ja listan l. Funktion tulee palauttaa 1 (tosi), jos merkkijono mj sisältyy listaan l, muutoin funktion tulee palauttaa 0 (epätosi). Esimerkiksi (=> tarkoittaa tuloksena on):
    sisaltyy("kello", ["koti", "kaipuu", "omena"])             => 0
    sisaltyy("uljas", ["armas", "uljas", "kaino", "vieno"])    => 1
    
  2. (helppo) Kirjoita funktio vaihtoehto, joka ottaa kaksi argumenttia, merkkijonon mj ja listan l. Se palauttaa merkkijonon: mikäli merkkijono mj ei sisälly listaan l, palautettu merkkijono on yksinkertaisesti mj, mutta mikäli merkkijono mj sisältyy listaan l, palautetaankin listan l sattumanvarainen elementti.

    Funktion idea on tämä: listassa l on keskenään jollain tavoin vaihtoehtoisia sanoja (esim. synonyymeja). Funktiolle voi antaa mielivaltaisen merkkijonon, ja mikäli se sattuu lukeutumaan vaihtoehtoisten sanojen joukkoon, palautetaan sille satunnainen vaihtoehto. Muuten annettu merkkijono palautetaan sellaisenaan. Esimerkiksi:

    vaihtoehto("kankea", ["koti", "kaipuu", "omena"])          => "kankea"
    vaihtoehto("koti", ["koti", "kaipuu", "omena"])            => "kaipuu"
    # satunnaisuuden vuoksi funktio voi palauttaa muitakin listan sanoja:
    vaihtoehto("koti", ["koti", "kaipuu", "omena"])            => "koti"
    
  3. (vaikea) Kirjoita funktio vaihda_sanoja, joka ottaa kaksi argumenttia, merkkijonon mj ja sanavaihtoehtojen listan l. Funktio palauttaa uuden merkkijonon, jossa jokainen sanavaihtoehtojen listaan kuuluva sana on korvattu jollain sanavaihtoehdolla. Esimerkiksi:
    vaihda_sanoja("kielteinen koti on kurja", ["koti", "kaipuu", "omena"])
    => "kielteinen omena on kurja"  # (yksi mahdollisuus)
    => "kielteinen koti on kurja"   # (toinen mahdollisuus, jne)
    vaihda_sanoja("kielteinen koti on kurja", ["kielteinen", "kurja", "kiva"])
    => "kurja koti on kiva"         # (yksi mahdollisuus)
    

    Yksi etenemistapa olisi jakaa mj sanoihin ja rakentaa uusi merkkijono for-silmukassa kutsumalla vaihda_sanoja-funktiota kullekin sanalle vuorollaan.

  4. (vaikea) Kirjoita funktio vaihda_erilaisia_sanoja, joka ottaa kaksi argumenttia, merkkijonon mj ja vaihtoehtolistojen listan l (kyllä, listat voivat sisältää toisia listoja). Funktio palauttaa merkkijonon, jossa kaikki sanat, jotka löytyvät jostakin vaihtoehtolistasta, on korvattu satunnaisella kyseisen vaihtoehtolistan sanalla. (Toteutuksessa voipi käyttää tai olla käyttämättä edellistä vaihda_sanoja-funktiota.) Esimerkiksi:
    vaihda_erilaisia_sanoja("koira rakastaa luita mutta kissa vihaa palloja",
            [["koira", "kissa", "kani", "norsu", "ihminen"],
             ["rakastaa", "vihaa", "nakertaa"]])
    => "kani vihaa luita mutta koira vihaa palloja"   # (yksi mahdollisuus)
    
  5. (helppo) Kirjoita funktio, joka kysyy käyttäjältä tiedostonnimen, lukee kyseisen tiedoston ja tulostaa sen näytölle korvaillen sieltä sanoja siten, että lopputulos pysyy kieliopillisena. Korvausten materiaalina voit käyttää vaikkapa runogeneraattorin sanalistoja.
  6. (puolivaikea) Esitieto: hajautuksilla on palvelu has_key, jolla voi tarkistaa, onko hajautuksessa tietyn avaimen kohdalla talletettuna jotain vai ei. Esimerkiksi:
    sanakirja = { "makkara": "suomalaiskansallinen kasvis" }
    sanakirja.has_key("makkara")      => 1
    sanakirja.has_key("kuutio")       => 0
    sanakirja["kuutio"] = "matemaattinen negatiivisesti symmetrinen funktio"
    sanakirja.has_key("kuutio")       => 1
    

    has_key:lle on käyttöä, koska on virhe indeksoida hajautusta avaimella, jonka kohdalla hajautuksessa ei ole mitään. Toisin sanoen, jos yritämme hakea sanakirjasta sanaa, jolle ei ole selitystä, seurauksena on virhe, josta Python valittaa.

    Ajatelkaamme nyt, että haluammekin sanakirjan, jossa voi olla useampia selityksiä yhden sanan kohdalla. Tämä on järkevää mallintaa siten, että sanakirjassa on aina avainsanan kohdalla sanan selitysten lista (kyllä, hajautukset voivat sisältää listoja). Tehkäämme funktio, jolla voi lisätä sanakirjaan selityksiä.

    Kirjoita funktio lisaa_selitys, joka ottaa kolme argumenttia, avaimen avainsana, arvon selitys ja hajautuksen sanakirja. Mikäli avainsana löytyy sanakirja:sta, lisätään uusi selitys vanhojen selitysten listaan ja pannaan tulos sanakirja:an avainsana:n kohdalle. Muutoin (eli siis jos sanalla ei ole vanhastaan yhtään selitystä) sijoitetaan avainsana:n kohdalle lista, jossa on vain yksi selitys, selitys.

    Ensi luennolla käytettäneen tätä uutta funktiota apuna.

Hae laitoksen sivuilta:

Yleisen kielitieteen laitos | Humanistinen tiedekunta | Helsingin yliopisto
Copyright © 2003-2004 Helsingin yliopisto. Kaikki oikeudet pidätetään.