Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointiputka: Putkaposti 44: Vuoristorata

Sivun loppuun

Antti Laaksonen [17.01.2011 20:49:05]

#

Uusin putkaposti on aiheeltaan matemaattinen:

https://www.ohjelmointiputka.net/postit/tehtava.php?tunnus=vrata

jutti [19.01.2011 07:26:46]

#

Kirjoitin ohjelman joka ratkaisee tuon. Kolmen lapsen tapauksen se laski oikein. Myös neljän (tarkistin käsin oikean tuloksen), joten logiikka toimii. Ongelma on että ohjelma toimii rekursiivisesti. Kokeilin kuudellatoista lapsella ja ohjelma mietti vielä 7 tunnin jälkeenkin, joten keskeytin sen. Takaisin lähtöruutuun miettimään muita tapoja.

punppis [19.01.2011 11:33:54]

#

Itsellä vähän sama ongelma. Kymmenen kohdalla meni jo muutama minuutti ja yhdennessätoista loppui kärsivällisyys.

Cvgää vyzrvfrfgv xngfbn cnerzcvn nytbevgzrwä crezhgnngvbvyyr.

Chiman [19.01.2011 13:44:34]

#

Sopivalla algoritmilla suoritusaika on muutamia kymmeniä millisekunteja, myös 150 lapsen tapauksessa.

Kehitysehdotus: Putkaposteista voisi olla "vaikeuslista" eli tehtävät listattu järjestettynä kokonaispisteiden mukaan. Siinä listassa voisi olla myös merkittynä itse tehdyt.

Grez [19.01.2011 14:21:14]

#

Chiman kirjoitti:

Kehitysehdotus: Putkaposteista voisi olla "vaikeuslista" eli tehtävät listattu järjestettynä kokonaispisteiden mukaan. Siinä listassa voisi olla myös merkittynä itse tehdyt.

Tuostahan sen saisi kai nopeasti sortattua:
https://www.ohjelmointiputka.net/postitaulu.php

Tai no, en nyt äkkiseltään osaa sanoa idioottivarmaa keinoa, jolla pystyisi ilmaisemaan vaikeutta. Ehkä joku täydet pisteet saaneiden osuus kaikista vastaajista? Toisaalta oikein vaikeaan voi olla että moni on yrittänyt muttei saanut mitään ja sitten lähes kaikilla osallistuneilla on täydet. Vastausten määrälläkään ei suoraan voi mitata, koska uudet käyttäjät ei välttämättä ole osallistunut vanhoihin ollenkaan.

tkok [19.01.2011 14:49:21]

#

Grez kirjoitti:

Tuostahan sen saisi kai nopeasti sortattua:
https://www.ohjelmointiputka.net/postitaulu.php

Tai no, en nyt äkkiseltään osaa sanoa idioottivarmaa keinoa, jolla pystyisi ilmaisemaan vaikeutta. Ehkä joku täydet pisteet saaneiden osuus kaikista vastaajista? Toisaalta oikein vaikeaan voi olla että moni on yrittänyt muttei saanut mitään ja sitten lähes kaikilla osallistuneilla on täydet. Vastausten määrälläkään ei suoraan voi mitata, koska uudet käyttäjät ei välttämättä ole osallistunut vanhoihin ollenkaan.

On hyvä jos sivulla voisi lajitella "vaikeusasteen" lisäksi myös osallistuja määrän ja muiden indikaattoreiden avulla.

Jaska [19.01.2011 14:54:01]

#

Olen melko varma, että tilastotieteestä löytyy joku tapa arvioida vaikeutta. Voin kysyä eräältä matikkafoorumilta. En vaan muista, miten pisteytyssysteemi on laadittu siinä tapauksessa, että henkilö on saanut jonkun tuloksen, joka ei ole paras mahdollinen.

jutti [19.01.2011 14:54:05]

#

Chiman kirjoitti:

Sopivalla algoritmilla suoritusaika on muutamia kymmeniä millisekunteja, myös 150 lapsen tapauksessa.

Silti paras suoritus tähän asti on 27 lasta.
[muokkaa]
Jaa, tarkoittaako 27 sittenkin 30 lasta?

Metabolix [19.01.2011 15:03:41]

#

Tapaukset 4–30 eli yhteensä 27 tapausta.

Milo [19.01.2011 15:03:59]

#

jutti kirjoitti:

Chiman kirjoitti:

Sopivalla algoritmilla suoritusaika on muutamia kymmeniä millisekunteja, myös 150 lapsen tapauksessa.

Silti paras suoritus tähän asti on 27 lasta.
[muokkaa]
Jaa, tarkoittaako 27 sittenkin 30 lasta?

Tehtävässä ei oltu kiinnostuneita tapauksista, joissa lapsia oli vain 1-3.

jutti [19.01.2011 15:08:23]

#

Näinhän se oli. Keksin kaavan tuijottelemalla lukuja, jotka sain rekursiivisella ohjelmallani. En ymmärrä vielä kaavaa analyyttisellä tasolla, mutta se toimii. Olenko siis tyhmä? En tarvitse koodipätkää enää ratkaistakseni tehtävän, pelkkä openOffice riittää.

Jaska [19.01.2011 15:30:44]

#

Antti Laaksonen kirjoitti:

2 tapauksessa 1 lapsi näkee eteensä

Onko tuossa virhe? Ensimmäinen näkee joka tapauksessa eteensä ja jotta kukaan muu ei näe eteensä, on lasten oltava pituusjärjestyksessä. Minusta ainoastaan yhdessä tapauksessa vain yksi lapsi näkee eteensä.

progo [19.01.2011 15:36:08]

#

Jaska kirjoitti:

Antti Laaksonen kirjoitti:

2 tapauksessa 1 lapsi näkee eteensä

Onko tuossa virhe? Ensimmäinen näkee joka tapauksessa eteensä ja jotta kukaan muu ei näe eteensä, on lasten oltava pituusjärjestyksessä. Minusta ainoastaan yhdessä tapauksessa vain yksi lapsi näkee eteensä.

Siinähän se kuvassa näkyy, alhaalta keskimmäine.

Jaska [19.01.2011 15:42:55]

#

Olinpas hölmö, jotenkin ajattelin, että eteenpäin näkeminen tarkoittaa sitä, että hän ei näe juuri edessä istuvan takaraivoa. Mutta tehtävässä pitikin nähdä ilmeisesti eteenpäin junan etupäästä. Nyt selkisi.

jutti [19.01.2011 16:42:57]

#

Joo, jännempää on oikeesti nähdä vuoristoradassa ohi kaikkien edellä istuvien, eikä vain jotain takaraivoa muutaman penkin päässä.

jutti [19.01.2011 23:02:03]

#

Ai niin, pitikö tulos sieventää? Siihen loppu mun tietämys. Koska loppuarvo on desimaaliluku 1 ja 30 väliltä, ehkä on mahdollista tehdä tuo sievennys jo itse algoritmiin ja ehkä välttyä joutumasta käyttämään niin tähtitieteellisiä lukuja, että kokonaislukumuuttujien lukualue loppuu kesken.

Tämähän ei ole sievennetty, eihän:

11    1.23456e+008/7.89123e+007
12    2.34567e+009/8.91234e+008

No, raavas mies ei sievennystä kaipaa!

(Mod. sensuroi lukuarvot.)

Metabolix [19.01.2011 23:26:12]

#

Tehtävän ratkaisussa auttaa jokin murtolukuja käsittelevä kirjasto. Esimerkiksi Pythonissa on kätevä luokka fractions.Fraction.

Grez [20.01.2011 00:33:13]

#

Itse kyllä pärjäsin ihan hyvin ilman mitään kirjastoa. Yksi muuttuja osoittajalle ja toinen nimittäjälle. Käytännössä lopullinen tuloste syntyi lopulta alle 100 merkillä C:tä.

Täytyy sanoa että pyörittelin noita lukuja hetken aikaa ja sain ihan jäätävän kaavan. Sitä sitten pyörittelin ja sievensin monta kertaa ja lopulta jäljelle jäi kaava joka aiheutti todellisen facepalmin. Siis sen verran pitäisi ehkä kuitenkin osata todennäköisyyslaskentaa, että näkee yksinkertaisen kaavan suoraan tehtävänannosta.

No, tulipa tehtyä vaikeimman kautta. Laittaisin mielelläni sen ekan ratkaisukaavani näkyville että saisitte nauraa, mutta se ei oikein muutu vähemmän selväksi ROT13:lla. :(

jutti kirjoitti:

En ymmärrä vielä kaavaa analyyttisellä tasolla, mutta se toimii.

Sitten kun huomaat mistä on kyse niin tajuat heti että olisihan se pitänyt heti ymmärtää. Hauskaa muuten, että olin ratkaissut oikeastaan täsmälleen saman tehtävän murobbs:n matemaattiset -ongelmat ketjussa noin kuukauden sisään ja silti lähdin samalla tavalla ratkaisemaan tätä kuin sinäkin.

jutti [23.01.2011 23:08:21]

#

Jos sievennetyssä vastauksessa on viimeinen rivi muodossa:
30 a/b
...niin onko sekä a että b mahdollisesti 32 bittisen kokonaislukumuuttujan lukualueella? Minun mielestäni ne menee aika lailla yli, vaikka murtoluvun arvo tietenkin on välillä 1-30.

Metabolix [24.01.2011 00:30:48]

#

Eivät ole 32-bittisen muuttujan alueella. Useimmissa kielissä on kuitenkin mahdollisuus joko 64-bittisiin kokonaislukuihin tai rajoittamattoman mittaisiin kokonaislukuihin. Myös double-tyyppinen liukuluku taitaa tällä kertaa riittää arvojen tarkkaan tallentamiseen, jos sievennys tehdään joka välissä eikä vasta lopussa.

AkeMake [26.01.2011 02:07:02]

#

Grez kirjoitti:

Chiman kirjoitti:

Kehitysehdotus: Putkaposteista voisi olla "vaikeuslista" eli tehtävät listattu järjestettynä kokonaispisteiden mukaan.

Tuostahan sen saisi kai nopeasti sortattua:
https://www.ohjelmointiputka.net/postitaulu.php

Tai no, en nyt äkkiseltään osaa sanoa idioottivarmaa keinoa, jolla pystyisi ilmaisemaan vaikeutta. Ehkä joku täydet pisteet saaneiden osuus kaikista vastaajista?

Jaska kirjoitti:

Olen melko varma, että tilastotieteestä löytyy joku tapa arvioida vaikeutta.

Jaska, tietenkin tilastotieteestä löytyy tapa arvioida vaikeutta. ;) Tilastotieteen toisen vuoden opiskelijana voisin jonkinlaista ehdotusta tälle vaikeusasteen laskemiselle antaa.. Tietenkään emme saa selville niitä henkilöitä, jotka ovat yrittäneet ratkaista tehtävää, mutta epäonnistuneet siinä ja näin jättäneet kokonaan vastaamatta. Pitää siis turvautua siihen tietoon joka on käytettävissä (=jonkinlaisen tuloksen saaneet).
Pikaisesti mietittynä tehtävän vaikeus voisi olla yksinkertaisesti tehtävästä saatujen pisteiden mediaani tai sitten md/(1+s) (jossa Md = mediaani ja s = keskihajonta). Eivät nämä varmasti parhaat mahdolliset tavat tehtävän vaikeuden laskemiseen ole. Ne tulivat kuitenkin ensimmäisenä mieleen.


Ääh.. Tein PHP:llä tuollaisen pikku ohjelman, joka tutkii kaikki mahdolliset lasten istumajärjestykset läpi. Siitä oli tarkoitus jatkaa laskemaan se eteensä näkevien lasten odotusarvo, mutta koko homma kaatui siihen, että ohjelmani ei laske kuin 8 lapsen istumajärjestykset. 9:nnen lapsen kohdalla ohjelma kaatuu, koska on liian paljon laskettavaa.. Saisin kyllä ohjelmaa vielä hiukan järkevöitettyä, mutta se tuskin auttaa niin paljon, että saisin 30 lasta laskettua. Pitää varmaan keksiä jokin muu laskutapa kuin katsoa kaikki mahdolliset istumajärjestykset läpi. Täytyy kuitenkin sanoa, että keksin melko älykkään tavan laskea mahdolliset istumajärjestykset, vaikkei siitä loppuenlopuksi riittävän kevyttä ohjelmaa saanutkaan.. xD

Jokotai [26.01.2011 09:48:46]

#

Ei ehkä kovin hyvä tapa vaikeusasteen arviointiin: vastauksien_määrä*vastauksien_täydellisyys / Sivun_avauskerrat
Ongelmana tulee tietenkin jo 100 pistettä saaneiden tilaston katsomiskerrat.

Grez [26.01.2011 12:46:22]

#

Mun mielestä ei ole mitään merkitystä, montako kertaa sivua on katsottu, vaan ennemmin kuinka moni on katsonut.

Metabolix [26.01.2011 13:10:08]

#

AkeMake, toisen vuoden tilastotieteilijänä varmaan osaat laskea, että 30 lapsella on suunnilleen 265 kvintiljoonaa erilaista istumajärjestystä, joten jos saisit kaikki 10 lapsen tapaukset (3628800 järjestystä) tutkittua sekunnissa, 30 lapsen tapauksiin kuluisi samalla vauhdilla 73 kvadriljoonaa sekuntia eli 846 triljoonaa päivää eli 2,3 triljoonaa vuotta. Kaikkien vaihtoehtojen kokeileminen on siis aika huono ratkaisu.

AkeMake [26.01.2011 13:48:18]

#

Sivun katsomiskerrat tai sivua katsoineiden henkilöiden määrä ei kerro tehtävän vaikeudesta yhtään mitään. Sivun latauskerrat voisivat antaa jotain viitteitä siihen suuntaan, sillä vaikeaa tehtävää tuskin tullaan toista kertaa katsomaan. Tosin helppo tehtävä vastaavasti ratkaistaan ensimmäisellä sivun katselukerralla. Nämä eivät siis ole hyviä mittareita tehtävän vaikeusasteeksi. Sensijaan tehtävän mielenkiintoisuuden mittauksessa niitä voisi käyttää apuna. Itse liputtaisin edelleen yksinkertaisen mediaanin puoleen. Jos haluaa laskea vaikeuden vaikeammin niin sitten se mediaani jaettuna 1+keskihajonnalla. :)

Nyt vedetään halvalla koko yritykseni laskea lasten istumajärjestyksiä ja samalla kyseenalaistetaan opiskeluni. :P En jostain syystä ajatellut ollenkaan sitä kuinka monta istumajärjestystä on jo 15 lapsella (saati 30 lapsella). Lähdin vain sokeasti koodaamaan jotain jolla tutkia ne istumajärjestykset, kun se tuntui mielenkiintoiselta haasteelta. Näin jälkikäteen ajateltuna oli tietysti tyhmää edes yrittää moista. :)
Pitää yrittää nyt sitten löytää se oikea tapa ratkaistu tuo tehtävä eli löytää tapa laskea ne eteensä näkevät lapset.. Kyllä tämä tästä. :)

Grez [26.01.2011 19:58:33]

#

AkeMake kirjoitti:

Sivun katsomiskerrat tai sivua katsoineiden henkilöiden määrä ei kerro tehtävän vaikeudesta yhtään mitään.

Niin siis pointtina olikin toki suhteuttaa tehtävää katselleiden määrä siihen, moniko tehtävän on ratkaissut. Mielestäni jos jostain tehtävästä olisi vastauksina vaikka 3 täydellistä ratkaisua, niin olisi mielenkiintoista tietää onko sitä tehtävää katsonut 3 vai 300 käyttäjää.

os [26.01.2011 20:59:34]

#

Askartelin tämän avulla ad hoc -skriptin:

#!/bin/sh
wget https://www.ohjelmointiputka.net/postitaulu.php
mv -f postitaulu.php data.html
python html2csv.py data.html
sed 's/\([^,]*,\)\{3\}/ /;s/\"\"/na/g;s/\"//g;s/ //g;s/,/\t/g;1d;$d' < data.csv > data.m
sed 's/[^,]*,\"\([^,]*\)\".*/\1/;1d;$d' < data.csv > tekijat.txt
grep "<th>" data.html | sed 's/tunnus=\([^"]*\)/\n\1/g' | sed 's/\([^\"]*\).*/\1/g' | grep -v "<" > tehtavat.txt

jolla tulostaulun sisällön saa esim. Octaven ymmärtämään muotoon (data.m, tekijat.txt, tehtavat.txt).

Tuossahan on periaatteessa tehtävien määrää vastaava määrä datapisteitä, eli vektoreita, joissa on kaikkien tekijöiden määrää vastaava määrä komponentteja. Tästä datasta pitäisi sitten ekstraktoida yksi tehtävän vaikeutta kuvaava luku jokaiselle pisteelle. Varmaan parhaisiin tuloksiin pääsee katsomalla jollain fiksulla menetelmällä kokonaiskuvaa eikä vain yksittäisiä pistevektoreita (ja ehkä myös käyttämällä alkuperäisiä pistemääriä noiden 0-100 sijaan).

jutti [26.01.2011 21:33:11]

#

No nyt onnistuin tuon penteleen vuoristoradan kanssa. Hieman ärsyttää, etten vieläkään oivalla tuota kaavaa, vaikka yksinkertaistin sitä loppuun asti. Käytin ratkaisuun yhtä kirjastoa, jonka löysin (C++-luokka). Vielä piti itse optimoida muutama funktio, jotta tulos selvisi tällä vuosituhannella.

Grez [26.01.2011 23:09:56]

#

Väitän kyllä että et yksinkertaistanut loppuun asti, jos tarvitsee optimoida funktioita. Kuten Chiman sanoikin: Sopivalla algoritmilla suoritusaika on muutamia kymmeniä millisekunteja, myös 150 lapsen tapauksessa.

Xnaanggnn habugnn xbxbanna rfvzrexvxfv zbarraxb wäewrfglxfrra yncfrg ibvqnna ynvggnn wn xrfxvgglä inva fvvura inefvanvfrra xlflzlxfrra: Zvxä ba bqbghfneib.

jutti [27.01.2011 23:05:03]

#

Kyllä mulla on loppuun asti yksinkertaistettu ratkaisun kaava. Mutta kun siihen liittyy aika hankalia murtolukuja, jossa nimittäjä ja osoittaja on 64-bittisiä lukuja, ja käyttämäni kirjasto ei kovin fiksusti laskenut suurinta yhteistä nimittäjää.

Grez [27.01.2011 23:45:43]

#

Epäilen kyllä että se laskentakaava ei ole yksinkertaisimmaksi mahdolliseksi yksinkertaistettu, jos et suoraan näe siitä mihin se perustuu. Ihan vihjeenä että kaavan pituus on alle 10 merkkiä.

Ja tietty kirjastojahan löytyy joka lähtöön, mutta vaikea kuvitella että jokin suosittu kirjasto olisi huonompi kuin oma koodini. En käyttänyt mitään kirjastoa, käytin naivistisinta mahdollista tapaa sieventää, enkä tehnyt mitään optimointeja ja tehtävässä pyydettyjen tapausten laskemiseen meni 155 ms. Sama koodi toimii c, c++ tai c#, varmaan toimisi myös Javalla suoraan. Tulosten tulostaminen hieman tietty riippuu kielestä.

Optimoin sitä vielä hieman ja nyt sievennys on hieman vähemmän naiivi ja koko tehtävä pyörähtää alle 10ms.

Jiffy [28.01.2011 02:23:06]

#

Suuret murtoluvut ongelmina mullakin, tai siis niiden osoittajat ja nimittäjät. Pitääpi miettiä hieman miten sais fiksusti lavennettua/supistettua lukuja ilman, että ne missään vaiheessa ovat tolkuttoman suuria.
Melkeen vois kokeilla muutamaa matematiikan sovellusta, jos ne osaisivat suoraan laskea murtolukuja kivasti.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta