torstai 3. heinäkuuta 2014

Kexlerus ja koodaus

Pitäisikö koulussa opettaa esimerkiksi matematiikan opetuksen yhteydessä myös ohjelmointia, tai kuten tunnutaan sanovan, koodausta? Muutama suomalainen yritys on menestynyt tietokonepelien kehittämisessä ja tämä on luonut toiveita uudesta menestysalasta, joka ehkä auttaisi Suomea nousemaan taloudellisista vaikeuksista.  Tämä ei kuitenkaan riitä perusteeksi opettaa jokainen suomalainen koodaamaan, varsinkin kun menestyspelin tekemiseen tarvitaan muutakin kuin koodaustaitoja.

Ohjelmoinnin idean ymmärtäminen saattaisi kuitenkin hyvinkin kuulua yleissivistävän koulun opetussuunnitelmaan. Sehän muodostaa pohjan tietotekniikan mahdollisuuksien ymmärtämiseen jo yleisten kansalaistaitojen tasolla. Lisäksi se avaa uusia näkökulmia matematiikkaan, jolloin opettaminen matematiikan yhteydessä olisi paikallaan. Toki opetus voidaan järjestää paremmin tai huonommin (kuten mikä tahansa asia), mutta ajatusta sinänsä ei pitäisi torjua, vaan pyrkiä löytämään hyvä toteutustapa.

Esimerkkinä matematiikan ja ohjemoinnin suhteesta tarjoilen Suomen ensimmäisen matematiikan professorin Simon Kexleruksen matematiikan tehtävän, jonka olen joskus löytänyt Turun Aboa Vetus & Ars Nova -museon jostakin näyttelystä. Tarkempaa referenssiä minulla ei ole; kysyin museosta vuosia myöhemmin käyttäessäni esimerkkiä jossakin yhteydessä, mutta eivät enää osanneet sanoa, mistä esimerkki oli näyttelyyn löytynyt.

Näin siis Kexlerus: Sinulla on viinejä, jotka maksavat 3, 5, 8 ja 10 markkaa pullolta. Ota yhteensä kymmenen täyttä pulloa ja tee niistä sekoitus, joka maksaa 6 markkaa pullolta. Montako pulloa kutakin viinilajia on otettava?

En tiedä, miten Kexlerus on tehtävänsä ratkaissut. Jotakin voi toki arvella. Koodaustaitoinen henkilö panee kuitenkin hetkessä tietokoneen töihin ja saa helposti kaikki seitsemän ratkaisua. Jos tarvittavat pullomäärät ovat $a$, $b$, $c$ ja $d$, täytyy olla ensinnäkin
\[
a+b+c+d = 10.
\] Koko annoksen hinnaksi tulee 60 markkaa, jolloin tulee olla
\[
3a+5b+8c+10d = 60.
\] Kyse on siten tämän yhtälöparin ei-negatiivisista kokonaislukuratkaisuista. Enempää ajattelematta voi päätellä, että mitään viinilajia ei oteta kymmentä pulloa enempää. Seuraava koodinpätkä siis tuottaa ratkaisut:
for a=0 to 10
for b=0 to 10
for c=0 to 10
for d=0 to 10
if a+b+c+d=10 and 3*a+5*b+8*c+10*d=60 then
print a,b,c,d
end if
next d
next c
next b
next a

Ohjelmointikieli on periaatteessa Basicia ja lukija voi syöttää sen esimerkiksi verkkosivulle http://www.compileonline.com/execute_basic_online.php ja ajaa. Tai sitten muuntaa helposti joksikin toiseksi kieleksi. Vähänkin ohjelmointia tuntevalle koodin merkitys selittyy vaivatta.

Ratkaisua voi luonnehtia raa'alla voimalla tehdyksi: käydään lävitse $11^4 = 14641$ mahdollisuutta, ja katsotaan, mitkä niistä toteuttavat yhtälöt.  Matemaattisesti ei kovin eleganttia, mutta menettelytapa, joka toimii, kun tietokone on riittävän nopea. Toki on helppoa löytää tehtäviä, joissa raaka voima ei riitä. Tällaisten näkökulmien oppiminen kuuluu mielestäni nykymaailman yleissivistykseen.