Kirjautuminen

Haku

Tehtävät

Joulukalenteri 2009: J

Kirjoittaja: Antti Laaksonen (22.12.2009)

J on 1990-luvun alussa syntynyt ohjelmointikieli, joka on saanut vaikutteita toisaalta APL-kielestä (taulukkojen käsittely) ja toisaalta FP- ja FL-kielistä (funktioiden käsittely).

J:ssä yksittäisten lukujen ja kaikkien taulukon lukujen käsittely muistuttaa toisiaan: samalla funktiolla voi laskea yhteen kaksi lukua tai kaikki taulukossa olevat luvut. Tämän ansiosta J soveltuu hyvin lukumuotoisen tiedon käsittelyyn.

Esimerkki: Tekstin tulostus

Seuraava funktio tulostaa tekstiä:

   joulu =: 'Hauskaa joulua!'

Funktiota kutsutaan seuraavasti:

   joulu
Hauskaa joulua!

Esimerkki: Fibonaccin luvut

Määritellään seuraavat funktiot:

   vikat =: + / @: (_2 & {.)
   uusi =: , vikat
   kelpaa =: 100 & >
   lista =: (uusi ^: (kelpaa @: vikat)) ^: _

Nyt voidaan laskea Fibonaccin luvut, jotka ovat alle 100:

   lista 0 1
0 1 1 2 3 5 8 13 21 34 55 89

Funktio vikat kertoo taulukon kahden viimeisen luvun summan, funktio uusi lisää taulukkoon seuraavan Fibonaccin luvun, funktio kelpaa tarkistaa, onko luku alle 100, ja funktio lista lisää taulukkoon Fibonaccin lukuja niin kauan, kuin kahden viimeisen luvun summa on alle 100.

Esimerkki: Taulukot ja funktiot

Seuraavat komennot laskevat ensin kahden luvun summan, sitten kahden taulukon vastaavissa kohdissa olevien lukujen summat ja lopuksi taulukon kaikkien lukujen summan.

   3 + 5
8
   2 7 3 + 5 5 1
7 12 4
   + / 7 1 3 4 4
19

Seuraava funktio tupla kaksinkertaistaa sille annetun luvun. Määrittely tarkoittaa, että toinen kerrottava luku on 2 ja toinen on funktion parametri (merkintä &).

   tupla =: 2 & *
   tupla 8
16
   tupla 7 1 3 4 4
14 2 6 8 8

Seuraava funktio keskiarvo laskee taulukon lukujen keskiarvon. Funktio kytkee yhteen kolme muuta funktiota: + / laskee lukujen summan, # laskee lukujen määrän ja keskellä oleva % tarkoittaa jakolaskua.

   keskiarvo =: + / % #
   keskiarvo 7 1 3 4 4
3.8

Kilpailu

J-ohjelman voi saada mahtumaan hyvin pieneen tilaan. Seuraavassa on lyhyempi versio Fibonaccin lukujen etsinnästä (42 merkkiä):

lista =: }:@:(((,(+/@:(_2&{.)))^:((100&>)@:{:))^:_)

Jos pystyt parempaan, lähetä ohjelmasi minulle sähköpostilla!

Linkkejä

Tietoa sivustosta