Datatähti 2011: Alkukilpailu

Tehtävä 1: DNA-sekvenssien samuus

Vuoden 2001 alkukilpailun ensimmäisessä ohjelmointitehtävässä pitää tehdä ohjelma, jonka avulla voidaan verrata kahta DNA-sekvenssiä ja laskea niiden "samanlaisuus". DNA-sekvenssejä ajatellaan tässä tehtävässä merkkijonoiksi, jotka koostuvat kirjaimista A (adeniini), C (sytosiini), T (tymiini) ja G (guaniini).

DNA-sekvenssien "samuudella" halutaan ilmaista niiden operaatioiden vähyyttä (ja harvinaisuutta), joita evoluutio on kohdistanut DNA-sekvensseihin.

1. Yleiskuvaus

Tässä ongelmassa ajatellaan, että DNA-sekvensseihin voi kohdistua neljänlaisia operaatioita:

Luonnollisesti jotkin sekvenssien osat ovat voineet säilyä muuttumattomina.

Edelliset operaatiot vaikuttavat johonkin sekvenssin tai sekvenssien osaan. Mihin tahansa sekvenssin kirjaimeen voi kohdistua vain yksi operaatio. Erityisesti, peilikuvan mihinkään merkkiin ei voi kohdistua muita operaatioita.

Kullakin edellisistä operaatioista on kustannus: yhden merkin lisäyksellä, poistolla ja muuttumisella toiseksi sekä mielivaltaisen pituisella peilauksella on kustannus 1 (yksi).

Tehtävässä on on annettuna kaksi DNA-sekvenssiä R[1...r] ja S[1...s] ja sinun tulee laskea sekvenssien samuusarvo, joka on minimaalinen kustannus edellä kuvattuja operaatioita kohdistettuna R:ään niin, että R muuttuu sekvenssiksi S. (Minimaalinen kustannus R:n muuttamiseksi S:ksi on aina sama kuin minimaalinen kustannus S:n muuttamiseksi R:ksi.)

Esimerkiksi sekvenssien CATTGTGCAT ja TTACGATGCCT samuusarvo on 3, joka saadaan soveltamalla seuraavia operaatioita:

2. Rajoitukset

3. Syötteet

Ohjelmasi tulee lukea syötteensä oletushakemiston tekstitiedostosta DNACMP.IN. Tiedoston sisältö on seuraava:

4. Tulosteet

Ohjelmasi tulosteena tulee olla oletushakemistossa tekstitiedosto DNACMP.OUT. Tiedoston loppua pitää edeltää rivinvaihto, mutta muuten tiedostossa ei saa olla muita rivinvaihtoja ja välilyöntejä kuin mitä alla on sanottu.

Huomaa, että optimaalista samuusarvoa kohti voi olla useita erilaisia operaatiojonoja. Sinun riittää löytää niistä mikä tahansa.

5. Esimerkki syötteestä ja oikeasta tuloksesta

Jos tiedostossa DNACMP.IN on

10 11 5
CATTGTGCAT
TTACGATGCCT

jolloin tulos on DNACMP.OUT:

3
M 1 4 CATT -> TTAC
- 5 G
I A
- 6 T
- 7 G
- 8 C
R 9 A -> C
- 10 T

Toinen esimerkki, DNACMP.IN:

5 4 3
CAAGT
AACT

jolloin tulos on DNACMP.OUT:

2
M 1 3 CAA -> AAC
D 4 G
- 5 T

Ratkaisun palautus ja arvostelu

Tehtävän ratkaisuna sinun pitää palauttaa asianmukaisesti kommentoitu lähdekielinen ohjelma. Sallittuja ohjelmointikieliä ovat Pascal, C ja C++. Laita ohjelmasi alkuun kommentiksi yhteystietosi ja mahdolliset ohjeet ohjelman kääntämistä varten. Ohjelmalla pitää olla vain edellä määritellyt syötteet ja tulosteet. Erityisesti sen ei pidä lukea mitään näppäimistöltä tai tulostaa mitään näyttöruudulle.

Arvosteluvaiheessa ohjelmasi käännetään (Unix-ympäristössä) ja suoritetaan useilla erilaisilla testisyötteillä. Pisteitä saa käännetyn ohjelman oikeasta ja nopeasta toiminnasta joukolla testisyötteitä. Lähdekielistä ohjelmaa ei siis arvostella, kunhan vain sen käännös onnistuu. Siirrettävyysongelmien välttämiseksi pitäydy kielen peruspiirteissä.

Testausympäristössä on kääntäjinä käytettävissä ainakin GNU C/C++ ja Pascal sekä Free Pascal (jonka pitäisi olla Turbo Pascal -yhteensopiva). Käännökset tehdään kääntäjien oletusarvoisilla optioilla. Jos käytät ohjelmien tekemiseen Turbo Pascal:a tai C++:aa, kerro se palauttaessasi ohjelmaa. Jos käytettävissä olevista kielen piirteistä tms. on epäselvyyttä, kysy asiasta sähköpostitse. Seuraa myös sivua http://www2.cs.utu.fi/datatahti/DTalku-01/tiedoituksia.htm, jolle tarpeen mukaan tulee tiedoituksia koskien tehtäviä.

Testisyötteistä osa testaa vain ohjelman oikeellisuutta. Kustakin tällaisesta syötteestä saa tietyn määrän pisteitä, jos ohjelma tuottaa oikean tulosteen kohtuullisessa ajassa. Syötteiden koot ja aikarajat valitaan siten, että hitaallakin ohjelmalla saa pisteitä, kunhan se on muuten toimiva. Osa testisyötteistä testaa ohjelman tehokkuutta. Näillä syötteillä ohjelman saama pistemäärä vähenee sitä mukaa, kun suoritusaika kasvaa. Testisyötteet ovat aina tarkalleen ylläolevan kuvauksen mukaisia. Pisteytyksen yksityiskohtia ja tarkkoja aikarajoja ei tässä vaiheessa julkisteta. Vertailukohdaksi voidaan kuitenkin antaa, että tehtävän laatijan ratkaisu vaatii alle 500 kilotavua muistia ja vie suurimmilla testisyötteillä alle yhden sekunnin suoritusaikaa (GNU C, Linux, 667 MHz Pentium III).

Palauta ratkaisusi mieluiten sähköpostiviestinä osoitteeseen Ville.Leppanen@cs.utu.fi. Älä käytä yli 80 merkin rivejä! Voit myös toimittaa ratkaisusi 3,5 tuuman DOS-formatoidulla levykkeellä osoitteeseen

Ville Leppänen Turun yliopisto Tietojenkäsittelyoppi Lemminkäisenkatu 14A, Datacity 20520 Turku

Pakkaa levyke huolellisesti ja laita mielellään toinen samansisältöinen mukaan varmuuskopioksi. Talleta ohjelmasi juurihakemistoon nimellä dt2001a.pas, dt2001a.c tai dt2001a.cpp.

Tehtävä 2: Taikaneliön muodostaminen

Alkukilpailun toisessa ohjelmointitehtävässä pitää tehdä ohjelma, jonka avulla muodostetaan ns. taikaneliö.

1. Yleiskuvaus

Tässä tehtävässä taikaneliöllä tarkoitetaan nxn -muotoista numeroista koostuvaa neliötä, johon on sijoiteltu numerot 1, 2, ..., n*n (kukin numero esiintyy tasan kerran) ja jolle on voimassa seuraava: kunkin vaakarivin alkioiden summa on sama ja lisäksi kunkin pystyrivin alkioiden summa on sama. (Yleisesti, mutta ei tässä tehtävässä, taikaneliöissä vaaditaan vielä päädiagonaaleistakin samaa.)

Taikaneliö on tiettävästi olemassa kaikille neliön sivun koon arvoille n paitsi arvolle n=2. Triviaalisti 1 muodostaa tällaisen taikaneliön. Tapauksessa n=3 eräs taikaneliö on seuraava:

4 3 8
9 5 1
2 7 6

jonka kunkin vaaka- ja pystyrivin alkioiden summa on 15 (tässä tapauksessa myös kummallakin diagonaalilla olevien alkioiden summa on 15). Tapauksessa n=4 eräs taikaneliö on seuraava:

4 14 15 1
5 11 10 8
12 7 6 9
13 2 3 16

Nyt vaaka- ja pystyriveillä olevien alkioiden summa on 34 (mutta diagonaaleilla olevien alkioiden summa ei enää ole 34; on mahdollista tehdä sellainen 4x4-taikaneliö, jolle diagonaalialkioiden summa on myös 34).

Tässä tehtävässä sinun pitää tehdä ohjelma, joka muodostaa nxn-taikaneliön annetun sivun koon n ja joidenkin ruutuihin valmiiksi "sijoitettujen" arvojen perusteella.

Valmiiksi sijoitettuja arvoja ei saa muuttaa. Tehtävällä on aina vähintään yksi ratkaisu. Sinun ohjelmasi tulee löytää mikä tahansa ratkaisuista.

Esimerkiksi, jos annettuna olisi n=5 ja alla olevat numerot

?? 6 ?? 5 12
9 ?? 15 16 ??
?? 20 ?? ?? 21
?? 4 17 23 10
25 ?? 1 ?? 19

voisi tuloksena olla seuraava taikaneliö:

18 6 24 5 12
9 22 15 16 3
2 20 8 14 21
11 4 17 23 10
25 13 1 7 19

2. Rajoitukset

3. Syötteet

Ohjelmasi tulee lukea syötteensä oletushakemiston tekstitiedostosta SQUARE.IN. Tiedoston sisältö on seuraava:

Neliön indeksointi on [1...n][1...n], eli 1 <= xi, yi <= n.

4. Tulosteet

Ohjelmasi tulosteena tulee olla oletushakemistossa tekstitiedosto SQUARE.OUT. Tiedoston loppua pitää edeltää rivinvaihto, mutta muuten tiedostossa ei saa olla muita rivinvaihtoja ja välilyöntejä kuin mitä alla on sanottu.

Tiedosto koostuu n:stä rivistä. Kullakin rivillä on tulostettuna n taikaneliön lukua. Ensimmäisellä rivillä on taikaneliön ensimmäisen rivin luvut, toisella toisen rivin luvut, jne. Kunkin rivin alkiot tulostetaan järjestyksessä kolmen merkin mittaiseen kenttään niin, että luku tulostuu kentän oikeaan laitaan ja sitä edeltää tarpeellinen määrä välilyöntejä.

5. Esimerkki syötteestä ja oikeasta tuloksesta

Jos tiedostossa SQUARE.IN on

4 8
1 2 14
1 3 15
2 3 10
3 2 7
3 4 9
4 4 16
4 2 2
2 2 11

kelpaa tulokseksi SQUARE.OUT:

  4 14 15  1
  5 11 10  8
 12  7  6  9
 13  2  3 16

Ratkaisun palautus ja arvostelu

Tehtävän ratkaisuna sinun pitää palauttaa asianmukaisesti kommentoitu lähdekielinen ohjelma. Sallittuja ohjelmointikieliä ovat Pascal, C ja C++. Laita ohjelmasi alkuun kommentiksi yhteystietosi ja mahdolliset ohjeet ohjelman kääntämistä varten. Ohjelmalla pitää olla vain edellä määritellyt syötteet ja tulosteet. Erityisesti sen ei pidä lukea mitään näppäimistöltä tai tulostaa mitään näyttöruudulle.

Arvosteluvaiheessa ohjelmasi käännetään (Unix-ympäristössä) ja suoritetaan useilla erilaisilla testisyötteillä. Pisteitä saa käännetyn ohjelman oikeasta ja nopeasta toiminnasta joukolla testisyötteitä. Lähdekielistä ohjelmaa ei siis arvostella, kunhan vain sen käännös onnistuu. Siirrettävyysongelmien välttämiseksi pitäydy kielen peruspiirteissä.

Testausympäristössä on kääntäjinä käytettävissä ainakin GNU C/C++ ja Pascal sekä Free Pascal (jonka pitäisi olla Turbo Pascal -yhteensopiva). Käännökset tehdään kääntäjien oletusarvoisilla optioilla. Jos käytät ohjelmien tekemiseen Turbo Pascal:a tai C++:aa, kerro se palauttaessasi ohjelmaa. Jos käytettävissä olevista kielen piirteistä tms. on epäselvyyttä, kysy asiasta sähköpostitse. Seuraa myös sivua http://www2.cs.utu.fi/datatahti/DTalku-01/tiedoituksia.htm, jolle tarpeen mukaan tulee tiedoituksia koskien tehtäviä.

Testisyötteistä osa testaa vain ohjelman oikeellisuutta. Kustakin tällaisesta syötteestä saa tietyn määrän pisteitä, jos ohjelma tuottaa oikean tulosteen kohtuullisessa ajassa. Syötteiden koot ja aikarajat valitaan siten, että hitaallakin ohjelmalla saa pisteitä, kunhan se on muuten toimiva. Osa testisyötteistä testaa ohjelman tehokkuutta. Näillä syötteillä ohjelman saama pistemäärä vähenee sitä mukaa, kun suoritusaika kasvaa. Testisyötteet ovat aina tarkalleen ylläolevan kuvauksen mukaisia. Pisteytyksen yksityiskohtia ja tarkkoja aikarajoja ei tässä vaiheessa julkisteta. Ohjelmallesi tullaan antamaan aikaa joissakin tapauksissa vähintään 20 sekuntia (Linux, 667 MHz Pentium III).

Palauta ratkaisusi mieluiten sähköpostiviestinä osoitteeseen Ville.Leppanen@cs.utu.fi. Älä käytä yli 80 merkin rivejä! Voit myös toimittaa ratkaisusi 3,5 tuuman DOS-formatoidulla levykkeellä osoitteeseen

Ville Leppänen Turun yliopisto Tietojenkäsittelyoppi Lemminkäisenkatu 14A, Datacity 20520 Turku

Pakkaa levyke huolellisesti ja laita mielellään toinen samansisältöinen mukaan varmuuskopioksi. Talleta ohjelmasi juurihakemistoon nimellä dt2001b.pas, dt2001b.c tai dt2001b.cpp.