R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Mitä hyötyä on ohjelmoinnin osaamisesta?

Pääsin vähän aikaa sitten perustelemaan alakoululaisille, miksi ohjelmoinnista on hyötyä. Yritin alunperin lähestyä asiaa hyvin samanlaisilla argumenteilla kuin Elisan hubin artikkelia ja perustella Reaktorin blogin linjoilta, miksi monet ohjelmointiin liittyvät käsitykset ovat värittyneitä. Ei oikein toiminut. Yhteinen tarttumapinta löytyi kuitenkin koulukirjasta. Onnekkaasti matematiikan kirjassa (Tuhattaituri 6a) oli seuraava tehtävä (uudelleen muotoiltuna):

70 [] 70 [] 70 = 71 ,

jossa [] merkitsee jotakin laskutoimitusta *, /, + tai -. Kutakin laskutoimitusta sai käyttää kaavassa vain kerran.

Oikea vastaushan on tietokoneella mahdollista löytää esimerkiksi ns. brute force menetelmällä, jossa kokeillaan kaikki mahdolliset laskutoimitusten yhdistelmät, ja valitaan ne, jotka antavat oikean lopputuloksen. Yllä annetun esimerkkitehtävän tapauksessa vastaus oli toki mahdollista myös päätellä.

Brute force -menetelmällä olisi pitänyt käydä läpi korkeintaan 4 * 4 = 16 vaihtoehtoa oikean löytämiseksi. Ehto, että laskutoimituksia sai kutakin olla vain yksi, olisi rajannut joukon pienemmäksikin, mutta kattava brute force on tässä tapauksessa jopa helpompi toteuttaa ohjelmallisesti. Vaikeammissa laskuissa olisi pitänyt käydä läpi 256 eri vaihtoehtoa, mikä ei ole tietokoneelle temppu eikä mikään, mutta olisi ollut työlästä tehdä käsin.

R:llä yllä oleva tehtävä olisi ratkennut vaikkapa seuraavasti:

# Luodaan laskutoimitusyhdistelmät
e <- expand.grid(c("*", "-", "+", "/"),c("*", "-", "+", "/")) 
 
# Muodostetaan kaavat
p <- paste(70, e$Var1, 70, e$Var2, 70)
 
# Lasketaan kaavojen tulokset
res <- lapply(p, function(x) eval(parse(text=x)))
 
# Verrataan tuloksia oikeaan ja poimitaan kaavat
p[which(res == 71)]
 
# Vastauksia on itse asiassa kaksi!

Tämänkaltainen mahdollisesti työtä säästävä sovellus tuntui uppoavan hyötyohjelmoinnin välittömänä esimerkkinä kaikkein parhaiten. Mainittakoon vielä, että tämä ratkaisuesimerkkikoodi on laadittu vasta sen jälkeen, kun tehtävä oli jo ensin ratkaistu käsipelillä.


Category