Datatähti 2000: alkukilpailun ohjelmointitehtävä

Samankaltaiset tiedostot
Datatähti-alkukilpailu 2005

Datatähti 2019 loppu

Datatähti alkukilpailu

Algoritmit 2. Luento 2 To Timo Männikkö

Datatähti kilpailu

Datatähti alkukilpailu

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

S: siirtää listan ensimmäisen luvun viimeiseksi V: vaihtaa keskenään listan kaksi ensimmäistä lukua

Datatähti 2019 alku. task type time limit memory limit. A Kolikot standard 1.00 s 512 MB. B Leimasin standard 1.00 s 512 MB

A TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE KLO 12:00

Syötteen ainoalla rivillä on yksi positiivinen kokonaisluku, joka on alle = Luvussa ei esiinny missään kohtaa numeroa 0.

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Algoritmit 2. Luento 7 Ti Timo Männikkö

Kaulaketju. Syöte. Tuloste. Esimerkki 1. Esimerkki 2

Uolevin reitti. Kuvaus. Syöte (stdin) Tuloste (stdout) Esimerkki 1. Esimerkki 2

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Algoritmit 2. Luento 4 To Timo Männikkö

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 9. marraskuuta 2009

v 1 v 2 v 3 v 4 d lapsisolmua d 1 avainta lapsen v i alipuun avaimet k i 1 ja k i k 0 =, k d = Sisäsolmuissa vähint. yksi avain vähint.

Kohdissa 2 ja 3 jos lukujen valintaan on useita vaihtoehtoja, valitaan sellaiset luvut, jotka ovat mahdollisimman lähellä listan alkua.

TAULUKON TEKEMINEN. Sisällysluettelo

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö

Datatähti kilpailu

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko,

isomeerejä yhteensä yhdeksän kappaletta.

Harjoitus 5 (viikko 41)

Java-kielen perusteita

Maahan on pudonnut omenoita, ja Uolevi aikoo poimia niitä. Tiedät jokaisesta omenasta, kuinka painava se on.

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Sinulle on annettu bittijono, ja tehtäväsi on muuttaa jonoa niin, että jokainen bitti on 0.

Tietotekniikan valintakoe

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

n! k!(n k)! n = Binomikerroin voidaan laskea pelkästään yhteenlaskun avulla käyttäen allaolevia ns. palautuskaavoja.

Algoritmit 2. Luento 5 Ti Timo Männikkö

Harjoitus 6 ( )

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Merkkijono on palindromi, jos se säilyy samana, vaikka sen kääntää väärinpäin.

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3 opettaja: Pasi Ranne

ITKP102 Ohjelmointi 1 (6 op)

V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

58131 Tietorakenteet (kevät 2008) 1. kurssikoe, ratkaisuja

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )

Harjoitus 6 ( )

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. lokakuuta 2016

5. HelloWorld-ohjelma 5.1

Lineaariset yhtälöryhmät ja matriisit

Tentti erilaiset kysymystyypit

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Harjoitus 5 (viikko 41)

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

Harjoitus 5 (viikko 48)

58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen)

b) Määritä myös seuraavat joukot ja anna kussakin tapauksessa lyhyt sanallinen perustelu.

Numeropelissä 3x3-ruudukko sisältää luvut 1, 2,, 9. Tehtäväsi on järjestää ruudukko näin:

Cantorin joukon suoristuvuus tasossa

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

58131 Tietorakenteet ja algoritmit (syksy 2015) Toinen välikoe, malliratkaisut

Approbatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat.

Ohjelmoinnin perusteet Y Python

Algoritmit 2. Luento 6 To Timo Männikkö

Tuen tarpeen tunnistaminen

3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin.

A TIETORAKENTEET JA ALGORITMIT

Tuen tarpeen tunnistaminen

Tehtävä: FIL Tiedostopolut

11.4. Context-free kielet 1 / 17

Binäärihaun vertailujärjestys

jäsentämisestä TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 27. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

Harjoitus 6 (viikko 42)

Task list Submit code Submissions Messages Scoreboard View queue Edit contest

5. HelloWorld-ohjelma 5.1

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Yhteydettömät kieliopit [Sipser luku 2.1]

Lineaarialgebra ja matriisilaskenta II Syksy 2009 Laskuharjoitus 1 ( ) Ratkaisuehdotuksia Vesa Ala-Mattila

linux: Ympäristömuuttujat

= 5! 2 2!3! = = 10. Edelleen tästä joukosta voidaan valita kolme särmää yhteensä = 10! 3 3!7! = = 120

Ohjelmointi 1 Taulukot ja merkkijonot

Task list Submit code Submissions Scoreboard View queue Edit contest

Algoritmit 1. Luento 6 Ke Timo Männikkö

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 2. helmikuuta 2012

811120P Diskreetit rakenteet

Ratkaisu. Tulkitaan de Bruijnin jonon etsimiseksi aakkostossa S := {0, 1} sanapituudelle n = 4. Neljän pituisia sanoja on N = 2 n = 16 kpl.

finnish BOI 2015, päivä 1. Muistiraja: 256 MB

Ennakkotehtävän ratkaisu

Harjoitus 2 (viikko 45)

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. joulukuuta 2015

Transkriptio:

Datatähti 2000: alkukilpailun ohjelmointitehtävä 1 Lyhyt tehtävän kuvaus Tehtävänä on etsiä puurakenteen esiintymiä kirjaintaulukosta. Ohjelmasi saa syötteenä kirjaintaulukon ja puun, jonka jokaisessa solmussa on jokin kirjain; katso esimerkkiä kuvassa 1. Tulosteena on annetun puun esiintymä kirjaintaulukossa; katso esimerkkiä kuvassa 2. Puun esiintymä siis liittää jokaiseen puun solmuun yhden kirjaintaulukon alkion siten, että solmun ja taulukon kirjaimet ovat samat ja solmuihin liitettyjen taulukon alkioiden sijainnit toisiinsa nähden ovat pääpiirteissään samat kuin itse solmujen sijainnit puussa. Tarkemmin sanoen tehtävänä on etsiä annetulle puulle sellainen esiintymä, että puu on vaakasuunnassa mahdollisimman kapea. Tarvittavien peruskäsitteiden määritelmät kerrataan luvuissa 2 ja 3. 2 Puiden peruskäsitteet Tehtävässä käsitellään puumaisia rakenteita, joita tietojenkäsittelyssä kutsutaan binääripuiksi. Kuvassa 3 on esimerkki binääripuusta. Puurakenne koostuu solmuista ja niiden välisistä yhteyksistä. Jatkossa ajatellaan puun solmut numeroiduiksi 1,..., k, missä k on puun koko. Puurakenne muodostuu solmuista ja niiden välisistä yhteyksistä seuraavasti: Yksi solmuista on erityisasemassa puun juurena; juuri piirretään kuvassa ylimmäksi solmuksi. Juurta lukuunottamatta jokaisella solmulla on tasan yksi vanhempi; kuvassa solmu piirretään vanhempaansa alemmaksi ja yhdistetään vanhempaansa viivalla. Siis kuvan 3 puussa on yhdeksän solmua, joista juurena on solmu 3. Solmu 4 on solmujen 8 ja 1 vanhempi, ja solmu 9 on solmun 7 vanhempi. Jos solmu i on solmun j vanhempi, sanomme että solmu j on solmun i lapsi. 1

w o r i d f k l a d k g a l i t v a b h t b h u a a v a s e y i y t e m j a e p l l k s m d l s s j m o s p j o i m h o t p p m s a h i a k l b m b i t i o y b o i y u v n p o w a h n Kuva 1: Esimerkki kirjaintaulukosta ja puusta w o r i d f k l a d k g a l i t v a b h t b h u a v a s e y i y t e m j p l l k s m d l s s j m o i m h o t p p m s a h a k l b m b i t i o y b o i y u v n p o w a h n Kuva 2: Esimerkki puun esiintymästä kirjaintaulukossa 2

Binääripuu on puurakenne, jossa kullakin solmulla voi olla korkeintaan kaksi lasta, ja nämä lapset on nimetty erikseen vasemmaksi ja oikeaksi lapseksi. Binääripuun solmulla voi siis olla sekä vasen että oikea lapsi (kuvan 3 solmut 2, 4, ja 6), vasen lapsi mutta ei oikeaa (kuvan 3 solmu 9), oikea lapsi mutta ei vasenta (kuvan 3 solmu 3) tai ei lainkaan lapsia (kuvan 3 solmut 1, 5, 7 ja 8). Binääripuun solmun vasempaan alipuuhun kuuluu tämän solmun vasen lapsi sekä vasemman lapsen kaikki lapset, lapsen lapset jne. Jos solmulla ei ole vasenta lasta, sanotaan että sen vasen alipuu on tyhjä. Vastaavasti määritellään oikea alipuu. Siis kuvan 3 binääripuun solmun 6 vasemmassa alipuussa on solmut 3 ja 5 ja oikeassa alipuussa solmut 1, 2, 4, 7, 8 ja 9. Solmun 2 vasemmassa alipuussa on solmut 1, 4 ja 8 ja oikeassa alipuussa solmut 7 ja 9. Solmun 3 oikeassa alipuussa on solmu 5; vasen alipuu on tyhjä. 3 Binääripuun esiintyminen kirjaintaulukossa Tarkastellaan nyt binääripuuta, jonka kuhunkin solmuun on lisäksi liitetty jokin kirjain. Olkoon k binääripuun solmujen lukumäärä, ja oletetaan, että taulukko C[1..k] antaa kuhunkin solmuun liittyvän kirjaimen. Merkitään solmuun i liittyvää kirjainta C[i]. Kuvassa 4 on kuvan 3 binääripuuhun merkitty tällaiset kirjaimet. Oletetaan lisäksi annetuksi kaksiulotteinen kirjaintaulukko M[1..n, 1..m]. Taulukko ajatellaan asetelluksi niin, että kirjain M[1, 1] on vasemmassa yläkulmassa, merkki M[n, 1] vasemmassa alakulmassa ja merkki M[n, m] oikeassa alakulmassa. Binääripuun sijoittelu tällaiseen taulukkoon liittää jokaiseen puun solmuun yhden taulukon alkion. Toisin sanoen sijoittelu on taulukko L[1..k], jonka alkiot ovat taulukon M indeksejä eli pareja (i, j) { 1,..., n } { 1,..., m }. Sijoittelu on binääripuun esiintymä, jos seuraavat ehdot ovat voimassa: 1. Solmussa on aina sama kirjain kuin siihen liitetyssä taulukon alkiossa; toisin sanoen M[i, j] = C[s] kun L[s] = (i, j). 2. Solmun vasen alipuu on kokonaisuudessaan solmusta alavasemmalle; toisin sanoen jos solmu t on solmun s vasemmassa alipuussa ja L[s] = (i 1, j 1 ) ja L[t] = (i 2, j 2 ), niin i 1 < i 2 ja j 1 > j 2. 3. Solmun oikea alipuu on kokonaisuudessaan solmusta alaoikealle; toisin sanoen jos solmu t on solmun s oikeassa alipuussa ja L[s] = (i 1, j 1 ) ja L[t] = (i 2, j 2 ), niin i 1 < i 2 ja j 1 < j 2. 3

6 3 2 5 4 9 8 1 7 Kuva 3: Esimerkki binääripuusta k b f h m c s k m Kuva 4: Kirjaimilla merkitty binääripuu 4

Binääripuun sijoittelun leveys on sen vaatiman vasemmanpuoleisimman sarakkeen ja oikeanpuoleisimman sarakkeen väliin jäävien sarakkeiden lukumäärä (nämä sarakkeet mukaanlukien). Kuvan 2 sijoittelun leveys on siis 11, koska vasemmanpuoleisin solmu (solmu 3 jossa o ) on sarakkeessa 1 ja oikeanpuoleisin solmu (solmu 8 jossa j ) on sarakkeessa 11. Edellä esitetyn matemaattisen määritelmän mukaan siis binääripuun sijoittelun L leveys on siis max S min S + 1 missä S = { j (i, j) = L[k] joillakin i ja k }. 4 Syötteet Ohjelmasi tulee lukea syöteensä oletushakemiston tekstitiedostosta input.txt. Tiedoston sisältö on seuraava: Ensimmäisellä rivillä on puun solmujen lukumäärä k. Voit olettaa, että 1 k 50. Seuraavilla k rivillä on kullakin puun yhden solmun kuvaus muodossa c t u, missä c on englannin kielen aakkoston pieni kirjain (jokin merkeistä a, b, c,..., z) ja t ja u ovat kokonaislukuja, 1 t k ja 1 u k. Merkki c ja kokonaisluku t, samoin kuin kokonaisluku t ja kokonaisluku u, on erotettu toisistaan yhdellä välilyönnillä. Rivillä s + 1 oleva syöte c t u tarkoittaa, että solmuun s liittyvä kirjain on c, solmun s vasen lapsi on solmu t ja oikea lapsi u. Jos solmulla ei ole vasenta lasta, niin t = 0; jos solmulla ei ole oikeaa lasta, niin u = 0. Rivillä k + 2 on yhdellä välilyönnillä erotetut kaksi kokonaislukua n ja m, jotka ovat kirjaintaulukon rivien ja sarakkeiden lukumäärä. Voit olettaa, että 1 20 n ja 1 200 m. Seuraavat n riviä sisältävät kirjaintaulukon kirjaimet ilman välilyöntejä. Rivin k + i + 2 merkki j on taulukon alkio M[i, j]. Nämä alkiot ovat englannin kielen aakkoston pieniä kirjaimia. 5 Tulosteet Ohjelmasi tulosteena tulee olla oletushakemistossa tekstitiedosto output.txt. Tiedoston loppua pitää edeltää rivinvaihto, mutta muuten tiedostossa ei saa olla muita rivinvaihtoja ja välilyöntejä kuin mitä alla on sanottu. Jos annetulla binääripuulla ei ole esiintymää annetussa kirjaintaulukossa, tulostiedostossa pitää olla vain yksi rivi ja sillä vain yksi numero 0. 5

Jos binääripuulla on esiintymä kirjaintaulukossa, tulostiedostossa tulee olla tasan k riviä ja jokaisella rivillä kaksi kokonaislukua yhdellä välilyönnillä erotettuna. Rivillä s olevat kokonaisluvut antavat leveydeltään mahdollisimman pienessä esiintymässä solmuun s liitetyn taulukon alkion rivin ja sarakkeen. Toisin sanoen jos L on tämä leveydeltään pienin esiintymä, tulostiedoston rivillä s tulee olla i j missä L[s] = (i, j). Jos annetulla binääripuulla on useita leveydeltään minimaalisia esiintymiä annetussa kirjaintaulukossa, sinun pitää esittää tulostiedostossa mikä tahansa yksi niistä. 6 Esimerkki Seuraavassa on eräs kuvan 1 esimerkkiä vastaava tiedosto input.txt. 8 a 2 5 a 3 4 o 0 0 s 0 0 e 6 8 p 0 7 i 0 0 j 0 0 7 12 woridfkladkg alitvabhtbhu avaseyiytemj pllksmdlssjm oimhotppmsah aklbmbitioyb oiyuvnpowahn 2 6 3 3 5 1 4 5 3 10 5 8 6 9 4 11 Kuvan 2 mukaista esiintymää vastaava tiedosto output.txt olisi seuraava: 6

7 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 Pascal ja C/C++, Free Pascal (jonka pitäisi olla Turbo Pascal -yhteensopiva; ks. http://deadlock.et.tudelft.nl/ fpc/) sekä Sun Workshop C, C++ ja Pascal (jokseenkin standardien mukaisia kaupallisia Unix-toteutuksia). Käännökset tehdään kääntäjien oletusarvoisilla optioilla. Jos käytettävissä olevista kielen piirteistä tms. on epäselvyyttä, kysy asiasta sähköpostitse (Jyrki.Kivinen@cs.Helsinki.FI). Seuraa myös sivua http://www.cs.helsinki.fi/ jkivinen/datatahti/ohjeet.html, jonne tulee tarpeen mukaan lisäohjeita. 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; virheellisillä ohjelmasi saa tehdä mitä tahansa (vaikka pysähtyä ajonaikaiseen virheeseen). 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ä noin yhden sekunnin suoritusaikaa (Free Pascal, Linux, 166 MHz Pentium). Palauta ratkaisusi mieluiten sähköpostiviestinä (ei liitetiedostona) osoitteeseen Jyrki.Kivinen@cs.Helsinki.FI. Älä käytä yli 80 merkin rivejä! Voit myös toimittaa ratkaisusi 3,5 tuuman DOS-formatoidulla levykkeellä osoitteeseen Jyrki Kivinen Tietojenkäsittelytieteen laitos PL 26 (Teollisuuskatu 23) 00014 HELSINGIN YLIOPISTO. Pakkaa levyke huolellisesti ja laita mielellään toinen samansisältöinen mukaan varmuuskopioksi. Talleta ohjelmasi juurihakemistoon nimellä dt2000.pas, dt2000.c tai dt2000.cpp. 7