Hei kaikki,
Ajattelin kysyä kokeneimmilta, mitä opiskelutapaa he ovat käyttäneet Project Eulerin kaltaisten tehtävien ratkaisemiseen?
Nuo ensimmäiset tehtävät saa ratkaistua ihan väkisin runnomalla. Mutta ihan muutaman tehtävän jälkeen vaaditaan, että algoritmissa käytetään jotakin tiettyä matematiikan teorian osa-aluetta, että ratkaisun saa kohtuullisessa ajassa. Muistaakseni Putkapostissakin oli samankaltaisia tehtäviä kuin Project Eulerissä.
Jotkut tehtävät eivät tunnu aukeavan, sillä tuntuu, että työkaluja uupuu - ts. teoriaa. Mitä matematiikan osa-aluetta olisi järkevintä opiskella? Vai onko mielestänne hyväksyttävää katsoa oikeat esimerkkiratkaisut tehtäviin, jos eteenpäin ei pääse? Se vain tuntuu hieman huijaamiselta, mutta toisaalta ainakin siinä sitä oppisi kielen tehokkaita ratkaisutapoja, jotka sitten iskostuvat kaaliin ja niitä oppisi hyödyntämään jatkossakin.
Mielestäni ei ole järkeä luntata ratkaisua. Ei ole edes selvää, että valmista ratkaisua katsomalla oikeasti oppisi niitä taitoja, joita ratkaisuun vaaditaan. Voi ehkä oppia yksittäisen tehtävän ratkaisun, mutta periaatteiden hahmottaminen on usein hankalaa, jos koodia ei ole selitetty äärimmäisen tarkasti.
Tehtäviä on hyvin monesta eri aiheesta, joten mikään yksittäinen matematiikan osa-alue ei auta niissä kaikissa. Hyvää materiaalia perusasioihin on listattu sivustolla kisakoodaus.fi.
Olennaista on, mitä haluaa saavuttaa tehtäviä tekemällä:
a) Vain kerätä pisteitä? Keino: googleta ratkaisut.
b) Kehittää loogisia, matemaattisia ja ohjelmoinnillisia ongelmanratkaisutaitojaan? Seuraa Metabolixin linkkiä.
c) Haastaa itsensä vaikeimman kautta? Yritä itse keksiä kaikki "pyörät" (tietorakenteet, algoritmit yms.)
Oma linjani harrastuskoodaamisessa on n. 80 % b), 20 % c). Haluan pähkäillä itse, vaikka tulos kärsisi. Se ei ole tulosten kannalta kustannustehokasta, mutta istuu hyvin harrastamiseen.
Valmiiden ratkaisujen lukeminen opettaa itsenäiseen ratkaisemiseen siinä missä hirsitalon rakentamisen voi oppia katsomalla aiheesta videon.
Kiitokset molemmille.
Pisteiden kerääminen ei ole ollenkaan relevanttia vaan haluaisin aidosti oppia elegantteja ja tehokkaita periaatteita koodaukseen. Tuntuu, että pelkällä kielen opiskelulla ei pitkälle pötkitä, koska sehän on pääasiassa syntaksin opettelemista. Vaikka sekin on Pythonissa joskus ollut monimutkaista. Esimerkiksi variable scope ei ole aina niin yksinkertaista kuin voisi kuvitella, mutta sekin selkiää lukemalla materiaalia.
Lähdin vain kysymään asiasta, kun useamman päivän ajan olen ollut jumissa muutaman tehtävän kanssa enkä ole osannut luovuttaa ja siirtyä muihin tehtäviin. Tarkoituksena oli keskittyä vähän aikaa Project Euleriin, mutta ehkäpä keksin seuraavan projektin ja opiskelen samalla syntaksia.
Olen opiskellut Javaa kirjasta ja koodaillut sillä hieman. Omia projekteja en ole sillä tehnyt vaan Pythonilla, jolla sain jopa ensimmäisen isomman projektini valmiiksi, jossa käytetään BFS-algoritmia Pacman-tyyppisen pelin apinoimiseen. En olisi millään tiennyt, miten tuon toteuttaisi ellen olisi lukenut kyseisestä algoritmista.
Olisikohan järkevää alkaa tutustua C-kieleen (löytyy K&R The C Programming Language -kirja) tämän Pythonin koodauksen ohella. Nimittäin tuo Metabolixin linkittämä materiaali pohjautuu C++:aan. Muutenkin kiinnostaisi C ja sen variaatiot, koska tulevaisuudessa tavoitteena olisi tehdä projekti OpenGL:llä.
Sinänsä valmiin ratkaisukoodinkin kopioiminen ja tutkiminen voi olla opettavainen kokemus, jos pystyy ymmärtämään mitä koodissa tehdään.
Jos tuohon hirsitaloasiaan vertaa niin voisihan sitä opetella hirsirakentamisen tekniikoita purkamalla valmiin hirsitalon ja miettimällä miksi erilaisiin ratkaisuihin on päädytty.
Näin aloittelijana tekee asioita varmasti huonoilla tavoilla eikä välttämättä tajua hyödyntää kielen ominaisuuksia, joita käyttämällä saisi tehokkaammin tehtyä jotakin.
En ollenkaan nauti ratkaisujen katsomisesta, joten en niitä koskaan katso vaan sitten jää tehtävä kokonaan ratkomatta. Ehkä se olisi sopiva raja, että ratkaisu kannattaa katsoa, kun on saanut tehtävän tehtyä. Silloin näkee, miten ratkaisun saa tehtyä elegantimmin.
Itse asiassa tuolla Metabolixin linkissä on nimenomaan aika matemaattisesta näkökulmasta dokumentaatiota Project Eulerin kaltaisia tehtäviä varten, jota hainkin. Ei vaan ensin huomannut tuota toista PDF-kirjaa. Näin nopeasti katsoen ei pitäisi olla ongelma, etten ole vielä C-kieleen tarkemmin perehtynyt, vaan yleinen ohjelmointitaito riittää materiaaliin.
C on hyvä tuntea yleissivistyksen kannalta, mutta se ei ole välttämättä paras valinta moneenkaan todelliseen projektiin. Kisoissa ja harjoitustehtävissä C++ on parempi, koska sen standardikirjasto sisältää monia tavallisia tietorakenteita ja algoritmeja. Myös tavallisissa projekteissa C++:n ominaisuudet ovat usein hyödyksi. Vielä korkeamman tason kielet usein helpottavat toteutusta mutta mahdollisesti hidastavat ohjelmaa. Kaikesta huolimatta taito ratkaisee, ja hyvä ohjelma Pythonilla on nopeampi kuin huono ohjelma C++:lla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.