Kirjoittaja: Antti Laaksonen
Markkinoille on tullut uusi ohjelmointikieli, jonka suunnittelijalle on sattunut ikävä unohdus: kielestä puuttuu mahdollisuus laskea jakojäännöksiä. Puutteen korvaa kuitenkin jotenkuten hyvä säännöllisten lausekkeiden tuki. Ohjelmoinnissa täytyy usein tutkia, onko luku jaollinen jollain toisella luvulla. Kuinka tällaisen tarkistuksen voisi toteuttaa säännöllisellä lausekkeella?
Tässä tehtävässä tutkitaan jaollisuutta luvuilla 2, 3, 4, 5, 6, 7, 8, 9 ja 10. Tehtävänä on laatia kullekin luvulle oma säännöllinen lauseke, joka hyväksyy ne merkkijonot, joiden ilmaisemat luvut ovat jaollisia kyseisellä luvulla. Esimerkiksi jaollisuutta luvulla 3 tutkivan säännöllisen lausekkeen täytyy hyväksyä merkkijonot "3", "9", "123" ja "57772169838894" mutta hylätä merkkijonot "5", "19", "220" ja "2384502719621".
Säännöllisen lausekkeen laadinnassa saa olettaa, että kaikki tutkittavat luvut ovat positiivisia kokonaislukuja. Säännöllisen lausekkeen ei siis tarvitse erikseen tarkistaa, että luku on muodoltaan kelvollinen, vaan sen täytyy ainoastaan tutkia sen jaollisuutta. Kuitenkaan luvun pituudesta ei saa tehdä lisäoletuksia: säännöllisen lausekkeen täytyy pystyä käsittelemään yhtä hyvin kaksinumeroisia kuin tuhatnumeroisiakin lukuja.
Säännöllinen lauseke täytyy ilmaista laajennetussa POSIX-muodossa, jolloin käytössä ovat mm. seuraavat merkinnät: []
ja [^]
(merkkijoukko), ?
, *
ja +
(merkkien toisto), |
(vaihtoehto) sekä ()
(ryhmitys). Jos säännölliset lausekkeet ovat päässeet unohtumaan, niitä voi kerrata vaikkapa sivustolla Regular-Expressions.info.
Vastauksen jokaiselle riville tulee luku, jonka jaollisuutta tutkitaan, ja tähän tarkoitukseen laadittu säännöllinen lauseke.
Vastaus voisi näyttää seuraavalta:
3 [0369]*
8 4*|8*
Nämä säännölliset lausekkeet eivät kuitenkaan toimi oikein: Luku 123 on jaollinen 3:lla, vaikka se ei muodostukaan numeroista 0, 3, 6 ja 9. Luku 44 ei ole jaollinen 8:lla, vaikka siinä on pelkkää numeroa 4. Luku 64 on jaollinen 8:lla, vaikka se ei muodostukaan yksin numerosta 4 tai 8.
59 henkilöllä on tulos. Suluissa oleva luku tarkoittaa oikein laadittujen säännöllisten lausekkeiden määrää.
VilleP (9), FooBat (9), Sisuaski (9), Pekka Karjalainen (9), Metabolix (9), Konvehti (9), Jepso (9), os (9), Torgo (9), jlaire (9), Jhuunhym (9), lukujenVihaaja (8), Ruokauuni (8), isashkar (8), zebraze (8), malaire (7), mleino (7), dancek (7), öppis (7), Deewiant (6), Grez (6), Päärynämies (6), Chiman (6), henkkeli (6), TapaniS (6), membolic (6), tonberry1 (5), Megant (5), Sami (5), Jogge (5), mikaelh (5), arcatan (5), Andu (5), Laitinen (5), Legu (5), tkok (5), copyrite (5), Matti Holopainen (5), Moiman (5), Kuha (5), Seriffi (4), L2-K2 (4), Niko (4), teksturi (4), JrPr (4), qalle (4), Shiona (4), temu92 (4), Juice (3), Bermod (3), teemuho (3), Laakeri (3), qwerty12302 (3), jannej (3), Kaukainen amatööri (3), putkaphp (3), Eax (2), Oskuz (2), Jaska (2)
Kirjaudu sisään Ohjelmointiputkaan, niin voit lähettää vastauksen tehtävään.
Katso myös Putkaposti 17: Jaollisuuslauseke.