Tänään alkaa Ohjelmointiputkan uusi kilpailu:
https://www.ohjelmointiputka.net/kilpa.php?
Tarkoitus on tehdä ohjelma, joka pystyy jatkamaan säännöllistä sarjaa. Ohjelmalle ilmoitetaan vaikkapa sarja A, AB, ABC, ABCD. Tämän jälkeen ohjelman pitää tietää sarjan seuraavat jäsenet: ABCDE, ABCDEF, ACBDEFG. Kilpailun sarjat ovat sellaisia, että ihminen näkee niihin suoraan vastauksen. Hyvän ohjelman tekeminen ei ole kuitenkaan mikään helppo juttu.
Kilpailuaikaa on tämän kuun loppuun. Kilpailusta voi keskustella tässä aiheessa.
Tervetuloa mukaan!
Onko esimerkeissä pelkästään numeroita ja aakkosia?
Kuinka eri tehtävät erotellaan toisistaan?
Edit: Ovatko tehtävät tiedostossa peräkkäin vai miten jatketaan jos ensimmäisestä sarjasta on selvinnyt?
Mikä ihmeen testisyöte(.tes)? Mitä sillä tehdään ja mitä ohjelman pitää sillä tehdä?
Onko isoissa ja pienissä kirjaimissa väliä, onko edes pieniä kirjaimia (Esimerkeissä ei näkynyt)?
setä kirjoitti:
Kuinka eri tehtävät erotellaan toisistaan?
[mutu]Kylmä meininki, uuden saa, jos edellinen meni oikein. Ohjelmaa ei voi systemoida ratkomaan vain yhdenlaisia sarjoja, vaan pitää tunnistaa ja ratkoa oikein kaikki vastaan tulevat sarjat.[/mutu]
Edit: Opettelin välillä kirjoittamaan oikein.
BadSource kirjoitti:
[mutu]Kylmä meininki, uuden saa, jos edellinen meni oikein. [/mutu]
Eiköhän tässä mennä vanhaan tyyliin, jossa ohjelma saa useita erillisiä testisyötteitä ja oikeasta vastauksesta se saa pisteen. Lopuksi sitten lasketaan tekoälyjen pisteet ja eniten pisteitä saanut voittaa.
Tiedostossa on aina vain yksi sarjan alku. Ohjelmaa siis kutsutaan useita kertoja. Ohjelma saa yrittää jatkaa kaikkia sarjoja, vaikka osa menisi väärin. Jokainen oikea vastaus kasvattaa ohjelman pistemäärää.
Tässä ovat selvyyden vuoksi kaikki sallitut merkit:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Testisyöte on kilpailijan tekemä oma sarjan alku, jota käytetään osana ohjelmien testiaineistoa. Jokainen kilpailija saa siis laatia yhden tehtävän. Testisyöte on samanmuotoinen kuin esimerkin luk-tiedosto.
Täytyykö binäärin olla optimoimaton, vai saako sitä optimoida kääntäjän prosessoririippumattomilla optimoinneilla?
Meitsi kirjoitti:
Täytyykö binäärin olla optimoimaton, vai saako sitä optimoida kääntäjän prosessoririippumattomilla optimoinneilla?
Mitä tuo auttaa? :o En tiennytkään että optimoinnit noin paljoa auttaisivat.
Ei ne autakaan, Gentoo-fanaatikot vaan tykkää uskoa niin :)
Onko laillinen sarja 0, 1, 4, 9 ja jatkuu 16, 25. Tämähän menee funktiolla f(x) = x2.
petrinm kirjoitti:
Onko laillinen suora luvut 0, 1, 4, 9 ja jatkuu 16, 25. Tämähän menee funktiolla f(x) = x2.
Nyt kyllä meni jotain ohi...
Eikös Antin esimerkissä ollut juuri ettei polynomiriippuvuutta kelpuuteta. Muutoin on vaikea vetää rajaa minnekkään.
Ohjelmaa saa optimoida mielin määrin, kunhan ohjelma vain toimii oikein.
Sarja 0, 1, 4, 9, 16, 25... on liian vaikea, sen ratkaisua ei jokapoika näe suoraan.
lainaus:
Testit suunnitellaan niin, että ihminen näkee vastauksen suoraan.
Eikös tuo ole vähän huono määrittely, sillä se mitä ihmiselle tulee ekana mieleen riippuu monista asioista esim. matemaattisista lahjoista.
Sarjan termeillä tulee ilmeisesti olla yksikäsitteinen looginen riippuvuus.
Jaba mainostaa kilpailua myös net.nytissä!
Saako muuten kopioida Wait-aliohjelman pilailuohjelmasta?
Sarjat pyritään laatimaan niin, että jokaiseen on yksi hyvin ilmeinen vastaus.
Tämä vastaus on se, jonka 99 prosenttia ihmisistä valitsee.
Jos kuitenkin käy niin, että ohjelman antama "väärä" vastaus onkin täysin selitettävissä, ohjelma saa pisteen. Ennen tulosten julkaisua ohjelmien tekijöillä on mahdollisuus tarkistaa, että heidän ohjelmaansa on kohdeltu oikeudenmukaisesti.
Saako sen Wait-aliohjelman kopioida vai ei?
Mitä kummaa tekisit sillä? Ohjelman ei tarvitse odottaa mitään.
KingOfTheWorld kirjoitti:
Saako sen Wait-aliohjelman kopioida vai ei?
Ei kai se muita haittaa, etpähän ainakaan menesty kisassa. :P
Tekisin moduulin, joka odottaisi aina sekunnin, ja jos sen .luk-tiedostossa olisi muutos, se kirjoittaisi vastauksen vastaustiedostoon. Voisi myös MsgBoxailla uudesta vastauksesta.
KingOfTheWorld kirjoitti:
Tekisin moduulin, joka odottaisi aina sekunnin, ja jos sen .luk-tiedostossa olisi muutos, se kirjoittaisi vastauksen vastaustiedostoon. Voisi myös MsgBoxailla uudesta vastauksesta.
Miksi tehdä turhaan tuommoinen, jos siitä et mitään hyödy? Sitäpaitsi, tuohan rikkoo sääntöjä. ;) "Ohjelmaa siis kutsutaan useita kertoja", eli otat riskin sääntöjen rikkomisesta vaikket siitä mitään hyödy missään tapauksessa. lol!
Siis hetkinen... Luenpa säännöt tuhat kertaa tarkemmin.
EDIT:tarkoitetaanko tuolla useammin kutsumisella sitä, että ensiksi ohjelmalle kirjoitetaan tiedostoon:
3 2 A
ja sitten
B
ja niin poispäin.
Ohjelman luk-tiedosto on valmiina odottelemassa heti ohjelman käynnistyessä.
Ohjelma ei saa näyttää viestiä, joka täytyy erikseen kuitata näppäimistöllä. Muuten automaattiset testit epäonnistuvat.
ahaa
Antti Laaksonen kirjoitti:
Testisyöte on kilpailijan tekemä oma sarjan alku, jota käytetään osana ohjelmien testiaineistoa. Jokainen kilpailija saa siis laatia yhden tehtävän.
Sanomattakin lienee selvää että kilpailijoiden testisyötteitä ei voi noin vain hyväksyä kilpailuun vaikka "oma" ohjelma sen osaisikin ratkaista.
Näin on, kaikkien sarjojen on täytettävä kilpailun säännöissä mainitut ehdot.
Antti Laaksonen kirjoitti:
Sarja 0, 1, 4, 9, 16, 25... on liian vaikea, sen ratkaisua ei jokapoika näe suoraan.
Tuohan on nyt normaalien älykkyystestien helpoimpia lukujonotehtäviä. Itse yleensä ratkaisen tälläiset 'korkeamman' asteen lukujonot tutkimalla lukujen erotusta, jolloin toisen asteen yhtälö muuttuukin suoraksi, esim. tässä 1, 3, 5, 7, 9. Helppo kuin mikä, ja tietokoneelle vielä helpompi.
Eihän älykkyyttä muuten voi mitata tehtävillä, jotka 99% ratkaisee. Niillä voi mitata vain sen 1%:n älyttömyyttä eikä tehtävät ratkaisemalla varsinkaan pääse mensan jäseneksi niinkuin toivoit jonkin ohjelman pääsevän ;)
Pikemminkin osan tehtävien pitäisi olla sellaisia, että ratkaisun nähdessään 99% ihmisistä sanoo "niinpä tietysti, miks mä en sitä huomannut!".
Todellakin noiden erotusten perusteella sarjan pitäisi olla kelvollinen. Kisa ei mittaa älykkyyttä kuin siltä osin, miten osaa varautua Antin kehittämiin sarjoihin. Joka tapauksessa kiinnostava kisa ja ainakin yritän itse hakea jotain ratkaisua. Eläkeläisenä kun on aikaa ja tarvetta aivojumppaan.
Tjooh, kerrankin sellanen kisa, johon kuvittelis osaavansa jotain :)
(Putkapostit on liian vaikeita yksinkertaselle insinöörinalulle :( )
Tämä on varovainen alku älykkäiden ohjelmien testauksessa. Vaikka tämän kilpailun sarjat ovat ihmiselle hyvin helppoja, tietokoneelle asia on luultavasti toisin. Kun kilpailussa käytetään ihmiselle päivänselviä sarjoja, havainnollistuu toivoakseni ihmisen ja tietokoneen ero hauskalla tavalla.
Toisen asteen funktio on jo niin vaikea, että osa ihmisistä ei keksi sarjan jatkoa miettimisenkään jälkeen, saati sitten ensi katsomalta. Tietokone saa kyllä helposti selville vaikka kuinka monimutkaisia polynomifunktioita, mutta kuinka opettaa esim. tällainen sarja: A, AB, CAB, CABD, ECABD?
Mensan testeihin vertaaminen oli kieltämättä liioittelua. Mutta jos tähän kilpailuun tulee monta lupaavaa ohjelmaa, voidaan ruveta miettimään Ohjelmointiputkan vastaavaa testitoimintaa tekoälyohjelmille. Kilpailun nimi on siinä mielessä vitsi, että tällaiset testit kertovat vain vähän älykkyydestä.
Antti Laaksonen kirjoitti:
kuinka opettaa esim. tällainen sarja: A, AB, CAB, CABD, ECABD?
No eihän tuossa mitään järkeä olekaan >_<
Blaze kirjoitti:
No eihän tuossa mitään järkeä olekaan >_<
On siinä. Joka toinen kirjain tulee eri päähän.
Eikö tuota kilpailuaikaa voisi pidentää kahteen kuukauteen?
Nuo putkapostitehtävätkin ovat yli kuukauden pituisia...
1, 2, 4, 7, 11, 16... lienee myös liian vaikea? :)
Pitäisi varmaan mennä kadulle tekemään tutkimusta, mitä sarjoja osataan ja mitä ei. :)
Ihan hauska otantatutkimusajatus. :)
Anttihan voisi laittaa nuo sille lähetetyt kilpailuohjelmat toimimaan sarjassa. Jos kaksi ohjelmaa päätyy samaan tulokseen, ne ovat silloin varsin todennäköisesti oikeassa.
(Tietysti olisi hyvä, jos ohjelmien pitäisi itse arvioida kuinka oikeassa ne ovat. Voitaisiin laskea painotettu keskiarvo.)
Tai miksei testattaisi putkalaisilla. Siinä sivussa saisi hyvää testimateriaalia oman ohjelmansa kehittelyyn. Ja ei kun sarjanalkuja keksimään ...
Testidataa:
A, A, A
A, B, A, B
A, B, C, D
AA, AB, AA, AB
AAA, AA, AAA, AA
Anna kaikki testisarjat muutaman muun (kilpailuun osallistumattoman) ihmisen ratkaistaviksi.
Jos kaikki testihenkilöt saavat yksikäsitteisen ratkaisun, niin sitten se on hyvin todennäköisesti myös ohjelman ratkaistavissa. Jos taas testihenkilöiden vastaukset eroavat toisistaan, niin kannattaa varmistaa ettei tehtävälle löydy useampaa mahdollista ratkaisulogiikkaa.
Mikäli nyt ymmärsin oikein niin se jono voisi olla myös:
AB
ABC
ABABC
ABCABABC
ABABCABCABABC
taikka
2
3
5
8
13
taikka
1
12
112
12112
11212112
Eli toisinsanoen se voisi olla rekursiivinen jono? Matematiikassa rekursiivisessa jonossa seuraava luku on kahden edellisen luvun summa. Yllä käytin samaa periaatetta lukujen lisäksi myös pituuden kanssa.
Miten menetellään jos jono onkin:
3 2
W1
X2
Y3
onko seuraavat sitten:
Z4
A5
vaiko
Z4
05
vaiko
Z4
BA5
vaiko
Z4
1A5
vai
Z4
105
Ekana tuli mieleen että kirjaimet looppais ja numerot kasvas. Kirjaimia kun on äärellinen määrä, numeroita ääretön.
Jtm kirjoitti:
Miten menetellään jos jono onkin:
3 2
W1
X2
Y3
Mielestäni ei tuollaista sarjanalkua voi antaa, koska jatko voi olla monenlainen kuten itse olet ehdottanut.
Voiko kielivaihtoehtoihin lisätä Rubyn?
tsuriga kirjoitti:
Kirjaimia kun on äärellinen määrä, numeroita ääretön.
Numeroita on 10 kpl, lukuja äärettömän monta.
Harmi, että olen intissä, ei ehtine osallistua. Mielenkiintoinen kilpailuidea, voi tulla vaihteeksi hyvinkin erilaisia osallistujaohjelmia. Ongelmina on tosiaan vain tuo joidenkin sarjojen moniselitteisyys ja se, miten voidaan perustella jotkut sarjat liian vaikeiksi.
litra kirjoitti:
Voiko kielivaihtoehtoihin lisätä Rubyn?
Käytä jotain ruby2exe-tyyppistä ohjelmaa, niin saat toimivan binäärin Ruby-koodistasi.
Mahdollisia sarjoja miettiessä kannattaa muistaa, että:
1. Sarjan vastaus on ihmiselle päivänselvä.
2. Sarjalla on vain yksi selkeä vastaus.
Tietenkään kaikkea testistä ei voi paljastaa etukäteen.
litra kirjoitti:
Voiko kielivaihtoehtoihin lisätä Rubyn?
Selvä pyy, asensin juuri Ruby-tulkin koneelleni.
Minusta nuo Jtm:n sarjat eivät ole alkuunkaan kyllin yksinkertaisia, jotta voisi sanoa ihmisen näkevän niihin suoraan vastauksen. Fibonaccin luvut vielä menevät, mutta tuollaiset merkkijonokikkailut vaativat hetken verran katsomista ja ajattelua.
Jtm kirjoitti:
Matematiikassa rekursiivisessa jonossa seuraava luku on kahden edellisen luvun summa.
Jaa mistä lähtien? Minä kun muistelisin, että rekursiivinen jono tarkoittaa vain rekusiivisesti määriteltyä jonoa. Jonon n:s termi määritellään siis aiempien termien avulla. Esimerkkinä seuraava aritmeettinen jono:
a[1] = 1, a[n] = a[n-1] + 5
Oli miten oli, käytin esimerkkinä kuitenkin Fibonaccin rekursiivista jonoa, joka saadaan kaavasta
a[n] = a[n-1]+a[n-2], n > 2
Kun sarjan jäsenessä voi olla 20 merkkiä niin voiko siinä olle 20 eri sarjaa rinnakkain. Esimerkissä A1, B2, C3 voidan siis ajatella että kirjaimet juoksevat omaa rataa ja numerot omaa toisistaan riippumatta (ehkä se ilmeisin tulkinta) tai sitten kyse on heksadesimaaliluvuista, jolloin ne riippuvat toisistaan. Ero tulee jäsenen F6 jälkeen, seitsemäs jäsen on G7 tai 107. Tuo edellinen tuntuisi tässä tapauksessa ilmeiseltä ratkaisulta mutta toinenkin on perusteltavissa eli olisiko sekin oikea. Vai onko niin, että tässä esimerkissä seitsemättä jäsentä ei kysellä lainkaan koska on tulkinnan varainen.
Kuinkahan moni päätyy ensimmäisellä vilkaisulla tulkitsemaan tuon heksadesimaalilukujonoksi? Kuten Antti sanoi, ratkaisu, johon ihminen päätyy pikaisella vilkaisulla, ja se on kyllä minusta varsin kiistattomasti G7.
Miksi Perl ei ole tuettuna? Sen saa Windowsiinkin asennettua samanlaisella asentimella kuin pythoninkin.
Erikseen mainitut kielet on valittu aiempien kilpailuiden perusteella.
Nyt Perl on niiden kielten joukossa, joilla voi osallistua ilman exe-tiedostoa.
Voikos se ohjelma olla funktiossa / funktioissa tai luokkana, jos sitä / niitä kutsuu samassa koodissa?
Kieli olis php... ☺
Ohjelman voi muotoilla miten tahansa, kunhan se käsittelee oikeita tiedostoja.
Voiko tuossa ohjelmass olla myös tämäntapaisia sarjoja:
A00 A0000 B11 B1111 C22 C2222
jne
Edit:Ja Antti, onhan koneellasi PHP5?
Toivottavasti
Ohjelman voi tehdä PHP5:llä.
Saako ohjelman kirjoittaman .kir-tiedoston lopussa olla yksi ylimääräinen rivinvaihto?
Tiedoston lopussa olevista rivinvaihdoista ei ole haittaa.
Mitä tapahtuu, jos kahden sekunnin aikaraja ylittyy?
Lasketaanko tuohon kahteen sekuntiin ohjelman käynnistys?
Onko lähdekoodin lähettäminen pakollista?
Aikarajan ylittänyt ohjelma suljetaan väkisin, ja ohjelma ei saa siitä tehtävästä pistettä.
Kahteen sekuntiin lasketaan koko ohjelman suoritusaika (myös mahdollinen tulkin käynnistys).
Ajan mittaus on aina ongelma näissä kilpailuissa. Nopeamman kielen käyttäjä saa laskettua enemmän.
Lähdekoodin lähettäminen on pakollista, ja ohjelmien lähdekoodit myös julkaistaan.
Ohjelmien testaus alkanee vasta kilpailuajan päätyttyä. Koska kilpailijat lähettävät kukin yhden testisarjan niin ovatko nämä mahdollisesti mukana testauksessa vai onko testimateriaali jo valmiina. Jos on lähettänyt ohjelmansa kilpailuun voiko sen jälkeen lähettää vielä uuden parannetun version jos kilpailuaikaa on jäljellä. Jos testimateriaali on jo olemassa, voiko saada esim. tiedon "Äly ei riitä" jotta voi parannella ohjelmaansa. Voiko saada etukäteen tietoa esim. kuinka monella testisarjalla ohjelmat testataan. Tässä tuli nyt aika älyttömästi kysymyksiä vaikka painan nappia "Lähetä vastaus":)
Testimateriaaliin kuuluu:
1. Joukko minun tekemiäni sarjoja
2. Kilpailijoiden lähettämät sarjat
Ohjelman voi lähettää monta kertaa kilpailuajan aikana. Viimeinen versio tulee mukaan kilpailuun.
Ohjelman menestyksestä ei tule palautetta etukäteen. Kerron kuitenkin, jos ohjelma ei toimi minulla.
Testisarjojen tarkkaa määrää en vielä tiedä, satakunta voisi olla hyvä arvio.
setä kirjoitti:
Esimerkissä A1, B2, C3 voidan siis ajatella että kirjaimet juoksevat omaa rataa ja numerot omaa toisistaan riippumatta (ehkä se ilmeisin tulkinta) tai sitten kyse on heksadesimaaliluvuista, jolloin ne riippuvat toisistaan. Ero tulee jäsenen F6 jälkeen, seitsemäs jäsen on G7 tai 107.
Metabolix kirjoitti:
Kuinkahan moni päätyy ensimmäisellä vilkaisulla tulkitsemaan tuon heksadesimaalilukujonoksi? Kuten Antti sanoi, ratkaisu, johon ihminen päätyy pikaisella vilkaisulla, ja se on kyllä minusta varsin kiistattomasti G7.
Antti sanoi tosin myös:
Antti Laaksonen kirjoitti:
Jos kuitenkin käy niin, että ohjelman antama "väärä" vastaus onkin täysin selitettävissä, ohjelma saa pisteen. Ennen tulosten julkaisua ohjelmien tekijöillä on mahdollisuus tarkistaa, että heidän ohjelmaansa on kohdeltu oikeudenmukaisesti.
Minun nähdäkseni siis 107 olisi täysin hyväksyttävä vastaus.
Ette nyt jaksaisi olla näsäviisaita.
Se F6 voi olla vaikka yksi ruutu shakkilaudalla, jos tälle linjalle lähdetään, että onko se 107 vai mikä..
-Grey-
No ei todellakaan. Jos alkusarja on esim. A7, A8, A9 niin kumpi on ilmeisempi jatko, AA vai A10. heksaluvuthan ovat koodareille tuttuja. Tulkinnanvaraa ei Antin lupausten mukaan tule, jolloin sarjan alku pitäisi antaa A8, A9, AA, jolloin ei ole epäselvyyttä jatkosta. Antinkin antamissa esimerkeissä voi olla tulkinnanvaraa joten olisi hyvä tietää miten ohjelma priorisoi eri vaihtoehtoja. Eli jos numeroita askelletaan niin ovatko ne aina välttämättä kymmenjärjestelmän lukuja vaikka vieressä on heksaluvun merkki.
Eli, heksa- vai kymmenlukuja?
Imho tuossakin tapauksessa jatko on epäselvä, onko kyse hexoista vai käydäänkö kenties läpi kaikki aakkoset (ja jos niin mitkä niistä)? On todella vaikeaa kehittää sarjoja joissa ei ole tulkinnanvaraa.
Ohjelmoija tuntee kyllä heksaluvut, mutta tavallinen kansa ei. Sarjan alku A8, A9, AA olisi monelle ihmiselle käsittämätön. Kun haetaan yleisintä sarjaa, voidaan olettaa, että luvut ovat kymmenjärjestelmässä. Muut lukujärjestelmät eivät ole yleisesti tunnettuja, eikä niitä voida siksi kysyä sarjassa.
Minä luulen, että ohjelman teossa vaikeinta ei ole niinkään oikean sarjan valitseminen lukuisista vaihtoehdoista, vaan edes yhden säällisen sarjan löytäminen.
Tuo olikin hyvä tietää ja saa turhia tarkasteluja jätettyä pois. Kyllähän noita sarjoja tuntuu riittävän muutenkin.
Sitten ohjelmasi on selvästi hyvässä vaiheessa.
Rajan vetäminen heksadesimaalien kohdalle on aika keinotekoista. Taitaa ehdottajien motiivina olla jokin helposti käyttöön otettavissa oleva heksalukumuunnin, jolla huomiota saadaan tehtävän pääideasta jonnekin aivan muualle.
IMHO mikään testi ei saa olla luuppauskohdan suhteen täysin tulkinnanvarainen. Esim. transition 9 -> 0 asemesta pitää voida hyväksyä 9 -> 10 ellei eksplisiittisesti sarjan alku puolla jompaa kumpaa. Kirjaimien kohdalla implisiittisesti voidaan korkeintaan olettaa Z -> A tai Y -> Z -> Y -> X -> ..., joista jälkimmäinen on selvästi vähemmän intuitiivinen. Toiseen suuntaan kelvolliset transitiot saadaan yo. nuolia kääntämällä, sillä tehtävähän ei sallinut miinus-merkkiä.
Onko muuten mahdollista udella, millaisissa kokoluokissa sarjojen pituudet ovat. Tarviiko mukaan ottaa rajattoman tarkkuuden laskentaa? Pitääkö jatkaa sarjaa 1-100 alkiolla, tuhansilla tai miljoonilla? Jokin summittainen yläraja auttaisi jo paljon.
Antti Laaksonen kirjoitti:
Minä luulen, että ohjelman teossa vaikeinta ei ole niinkään oikean sarjan valitseminen lukuisista vaihtoehdoista, vaan edes yhden säällisen sarjan löytäminen.
Tehtävähän ei (teko)älyyn niinkään liity vaan apua on lähinnä perehtyneisyydestä kääntäjien implementaatioihin. Mikäli haluaa yleispätevän algoritmin, tulee myös synteesivaiheessa varsinkin C:tä käyttäessä kulumaan kahvia ja tupakkaa..
Ylimenokohtia on testisarjoissa mahdollisimman vähän, koska ne ovat tosiaan usein epäselviä. Arvostelu tapahtuu niin, että yksikään ohjelma ei menetä tällaisten asioiden takia pisteitä. Jos ihminen ei ole varma tietyn sarjan jatkosta, niin ei sitä voi vaatia ohjelmaltakaan.
Sarjan ja sarjan jäsenen pituuksien rajat on ilmoitettu kilpailusivulla:
https://www.ohjelmointiputka.net/kilpa.php?
Sarjasta kerrotaan valmiiksi ainakin kolme jäsentä. Ohjelman täydentämässä sarjassa on yhteensä korkeintaan kymmenen jäsentä. - - Kaikissa jäsenissä on ainakin yksi ja korkeintaan 20 merkkiä.
Mitä Schemen toteutusta voisin käyttää? En ole vielä varma, teenkö ohjelmani Schemellä, mutta se on mahdollista.
Käytän tällä haavaa DrScheme-ympäristöä, jonka mukana tulee mzc-kääntäjä. Jos sillä kääntää suoritettavan tiedoston, vaatii se jonkin verran dll-tukea. Jonkin verran on itse asiassa noin 3 megaa...
Ne dll:t asuvat omassa alihakemistossaan, joten olisi varmasti mahdollista kopioida ne testikoneeseen ja laittaa kyseinen alihakemisto testiohjelman saataville. Ennen kuin pyydän Anttia tekemään näin, kysyn kuitenkin, tunteeko joku toista sopivaa Schemeä, jolla saisi ihan pelkän exen tehtyä Windowsiin (testikoneessa on Windows XP). Miten on?
Ja tosiaan, jos niitä dll:iä laitetaan testikoneeseen, se on paras tehdä vasta kun ohjelmani on oikeasti valmis. Saatan käyttää toistakin kieltä Schemen sijasta.
Voit lähettää DLL-tiedostot (tai linkin niihin) tarvittaessa samalla, kun lähetät itse ohjelman.
Rupesin vasta nyt kunnolla tekemään ohjelmaa ja heräsi muutamia kommentteja.
Merkistö [0-9,A-Z] ei salli negatiivisiä lukuja, vaikka mielestäni ne voisi sallia. Voisi vaikka sopia niin, että '-'-merkkiä voi jonoissa käyttää vain luvun negaationa eikä esim. välimerkkinä. Negatiivisilla luvuilla saa aikaan paljon kivoja sarjoja kuten 1,0,-1,0,1...
Alku- ja vastausjonojen pituuksiin olisi hyvä saada jotkut ylärajat (esim. 50), jotta ohjelmissa voidaan keskittyä erilaisten jonojen ratkaisemiseen eikä esimerkiksi tiedostoonkirjoituksen tehokkuuteen.
Selkeästi lukujono-tyyppisissä tehtävissä olisi kiva pysyä jollain tietokoneen helposti käsiteltävällä lukualueella (esim. 32 tai 64 bittiä). Tehtävässä määritelty jonon jäsenen maksimipituus (20 merkkiä) mahdollistaa numerot, jotka ovat yli 64 bittisiä. Numero-merkeillä tapahtuvissa hahmontunnistustehtävissä luvut saavat minun puolestani olla vaikka kuinka pitkiä.
En näe mitään syytä, miksi lukujonotehtävät pitää rajoittaa ihmisille todella helppoihin. Mielestäni taso voisi olla samaa mitä normaaleissa älykkyystesteissä eli ihmisille melko hankalia, mutta kuitenkin sellaisia, että niihin yksi selkeä 'helppo' tai looginen ratkaisu. Lukujonotehtävät on oikeasti paljon helpompia tietokoneelle kuin ihmisille. Toisin on asia hahmontunnistus yms. tehtävissä, jotka ovat ihmisille helppoja, mutta koneille vaikeita.
Eihän nyt kesken kisan lähdetä reunaehtoja muuttamaan. Eikö tuo kiva sarja voi olla yhtä hyvin 2,1,0,1,2... eikä tarvita -merkkiä. Tuskin erilaisista helpoista sarjoista tulee pulaa.
Kilpailun sääntöjä ei voi enää kovin paljon muuttaa, vaikka perustelut olisivat kuinka hyviä, koska jotkut ovat jo pitkällä ohjelman teossa.
Sarjoissa ei ole negatiivisia lukuja epäselvien tilanteiden vähentämiseksi. Kuvaamasi sarja on silti mahdollinen, kun kierretään korkeampaa numeroa tai kirjainta.
Sarjassa on kilpailun sääntöjen mukaan yhteensä korkeintaan kymmenen jäsentä. Siis ainakaan enempää ohjelman ei missään tapauksessa tarvitse lukea tai kirjoittaa.
Ohjelmassa voi käyttää huoletta tavallisia 32-bittisiä kokonaislukumuuttujia. Sarjoissa voi esiintyä pitempiä numerosarjoja, mutta näitä ei tarvitse käsitellä laskennallisesti kokonaisina suurina lukuina.
Ihmiselle helpot sarjat ovat siksi hyvä rajaus, että sarjoista tulee silloin tietyllä tavalla yksinkertaisia ja selkeitä. Kuitenkin useimmissa sarjoissa on juuri tietokoneelle vaikeita piirteitä. Ohjelmille sarjat tuskin ovat liian helppoja.
Jos sarjan alku on esim.
A7B B8C C9D niin jatko on D10E E11F
Mutta jos numeroita askelletaan alaspäin:
A12B B11C C10D niin onko jatko
D09E E08F vai
D9E E8F vai kelpuutetaanko molemmat saman arvoisina.
Tässä pitäisi kyllä hyväksyä molemmat jatkot, mutta yleisesti luvut ovat ilman etunollia.
Missäs vaiheessa ihmisten teköälyt alkaa olla kun viikon verran on aikaa kulunut?
Itselläni tunnistus ja alkeellinen ratkominen alkaa olla pulkasta, kun koodia on tulluut 222 riviä ja kerran on aloitettu puhtaalta pöydältä.
Liki 500 riviä koodia VB5:lla testiohjelmassa, johon syötän sarjat käsin ja tulokset näytetään saman tien ja lopussa testatut sarjat tallennetaan. Pientä viilausta vaille valmis. Lopullinen versio lyhenee vielä huomattavasti.
Noin 600 riviä java-koodia ratkaisijassa ja 60-riviä testiohjelmassa, jolla voi ajella eri testejä kätevästi.
Ratkaisee suuren osan numeerisista tehtävistä aika nätisti ja jonkin verran tietyn tyyppisiä merkkijonotehtäviä. Jos tässä koodaa hahmontunnistus-algoritmin päivässä loppukilpailun ajan, tulee tuohon vielä 2000 riviä lisää ;)
Python-koodia 462 riviä. Ratkoo jo kaikki nuo testitapaukset erillisinä paloina, vielä puuttuu koodi joka paloittelisi esimerkiksi A1, B2 -> A,B ja 1,2.
Hauska kuulla, että ohjelmat edistyvät!
Tässä on joukko testisarjoja ohjelman koulutukseen:
https://www.ohjelmointiputka.net/kilpailut/2006-alyo/testi1.txt
Joka rivillä on valmiiksi annettavien jäsenten määrä, ohjelman ilmoittamien jäsenten määrä ja kaikki sarjan jäsenet.
Mukana on sekä helppoja että vaikeita sarjoja. Nämä eivät ole varsinaisen älykkyystestin aineistoa.
Oikein hyviä testisarjoja nuo Laaksosen. Pari ongelmaa löytyikin, täytyy korjata huomenna. Koodasin ahssun debug-ominaisuudenkin, esimerkki yhdestä sarjasta:
Initial series: AA BBAABB CCBBAABBCC Next 2 entries: DDCCBBAABBCCDD EEDDCCBBAABBCCDDEE ComplexStringSolver |-- method: SymmetricOuterExpand |-- solver: TrimString |-- charsolver: SingleChar |-- solver: MergeSolver |-- solverA: AritmeticSolver |-- difference: 1 |-- first: 65 |-- solverB: AritmeticSolver |-- difference: 1 |-- first: 66 |-- lengthsolver: AritmeticSolver |-- difference: 2 |-- first: 1
Tuokaan ei ole ihan kaikkien taiteen sääntöjen mukaan ratkennut, kun käyttää mergesolveria. Esimerkiksi sarja A, BAB, CBABC ratkeaisi suoraan, mutta nuo pareittain menevät kirjaimet käyttäytyvät hassusti keskellä.
Joo, ihan hyvä testisarja. Paljasti yhden helposti korjattavan ongelman, yhden pienen bugin ja yksi sarja jäi vielä ratkaisematta. Onneksi ei vielä tullut sellaista sarjaa, jonka meinasin lähetää omana ongelmana.
Noin 4 294 967 295 riviä varsinaisessa ohjelmassa.
Taidan sittenkin luovuttaa vielä tän kisan osalta. Ehkä vielä joskus..
120 riviä on tullut kirjoiteltua. Nyt tuntuu olevan melko luotettava tieto siitä, kuinka monta merkkiä kussakin vastauksessa on. Sen lisäksi alkuperäiset sarjat ovat muistissa paloiteltuina. Tuossa on tietysti paljon kommenttirivejä yms mukana. :)
Kokeilumielessä ajattelin osallistua. Ajattelin tässä kuitenkin suunnitella ohjelman kunnolla ennen kun alan suuremmin koodaan sitä. PHP:llä olis tarkotus tehä.
Aika vaiheessa on mulla vielä, eniten huolestuttaa kun nyt meinaa olla tuo aika vähän tiukalla. Muistaakseni kolmena eripäivänä vasta kerinnyt ohjelmaa tekemään. Osaa nyt etsiä lukuina erillaisia juttuja, eli lähdin omasta mielestä monimutkaisesta liikkeelle. Ja viimeksi koodasin että ohjelmalle voi syöttää tuollaisen kokosarjan ja osaa kirjoittaa vastaustiedostoon jos vastaus on väärin. (debuggia varten) Nyt pitäisi tuota merkkijonojuttua kehitellä.
Jos ohjelma on hyvässä vaiheessa, mutta aika uhkaa loppua kesken, voidaan sopia pienestä lisäajasta.
Tässä tapauksessa kannattaa lähettää minulle sähköpostia.
Tässä on muutama melko vaikea sarja ohjelman testiksi:
AA ABAB ABCABC ABCDABCD ABCDEABCDE ABCDEFABCDEF ABA AABBAA AAABBBAAA AAAABBBBAAAA AAAAABBBBBAAAAA AAABBB BBBCCC CCCDDD DDDEEE EEEFFF FFFGGG A BB CCC DDDD EEEEE FFFFFF GGGGGGG HHHHHHHH YAAAAA AYAAAA AAYAAA AAAYAA AAAAYA AAAAAY 1AAAAA A2AAAA AA3AAA AAA4AA AAAA5A AAAAA6 AAAB BBBBC CCCCCD DDDDDDE EEEEEEEF FFFFFFFFG HHHHHHE HHHHHEE HHHHEEE HHHEEEE HHEEEEE HEEEEEE AAAAAABC AAAAABCC AAAABCCC AAABCCCC AABCCCCC ABCCCCCC O123 P234 Q345 R456 S567 T678 U789
Vähän täytyisi siistiä koodia, täydelliseen rewriteen ei enää aikaa ole. Hiljalleen alkaa tuo 2 s aikarajakin täyttyä, python ei ole kovin nopea kieli. Toivottavasti tulkin windows-versio ei ole hitaampi kuin linuxin vastaava.
Melko monimutkaset algoritmit saa olla että 2s tulee täyteen. Mulla mene ku muuta sata millisekunttia sadan testijoukon ratkaisemiseen. Eli jälessä taidan olla vielä.
Saas nähdä kuinka hyviä ohjelmia muilla on sitten, itse ainakin tiedän että ei tuosta täydellistä tule. (ja eiköhän noita eri sarjamalleja ole lähes x+1)
Niin muuten, minusta sarja
E ER ERE ERER ERERE ERERER ERERERE ERERERER on laiton.
Sensijaan sarja
AT ATTA ATTAAT ATTAATTA ATTAATTAAT ATTAATTAATTA on täysin hyväksyttävä.
Eli sarja 1 on laiton siksi, että millään järkevällä konstilla A:sta ei minusta voi muodostaa tuota sarjaa. Eli sarja
ER ERE ERER ERERE ERERER ERERERE ERERERER olisi täysin hyväksyttävä.
Noh jokatapauksessa minulla ei homma tuohon kaadu, mutta kunhan nyt vähän kapinoin näin valmiiksi jos huonosti käy ;)
Meitzi kirjoitti:
Niin muuten, minusta sarja
E ER ERE ERER ERERE ERERER ERERERE ERERERER on laiton.
Eli sarja 1 on laiton siksi, että millään järkevällä konstilla A:sta ei minusta voi muodostaa tuota sarjaa.
Eihän sarja muodostu A:sta vaan E:stä. Ja kuuluu osastoon simppelit.
Jahas. Lopahti innostus jossakin vaiheessa ja nyt ei enää ehdi , kun viikonloppu painaa päälle.
Onnea kuitenkin kaikille muille! :)
setä kirjoitti:
Meitzi kirjoitti:
Niin muuten, minusta sarja
E ER ERE ERER ERERE ERERER ERERERE ERERERER on laiton.
Eli sarja 1 on laiton siksi, että millään järkevällä konstilla A:sta ei minusta voi muodostaa tuota sarjaa.Eihän sarja muodostu A:sta vaan E:stä. Ja kuuluu osastoon simppelit.
Tässä kai tarkoitettiin ettei ensimmäisestä (?) voisi jatkaa tuota sarjaa. Mutta eihän niin täydykään olla. Tuossa testitiedostossa oli ko. sarjasta annettu 6 ensimmäistä termiä, eli:
E ER ERE ERER ERERE ERERER
Tuosta ihminen osaa helposti jatkaa, eikä muuta sääntöä kilpailussa ollut.
Jopa sarja:
3,1,2,1,2,1,2
olisi luultavasti hyväksyttävä, sillä ihminen jatkaisi tuota 1,2,.. välittämättä alun 3:sta.
Nyt ratkeaa kaikki testitapaukset. Aika on edelleen vähän tiukilla, erityisesti 1AAAAA, A2AAAA, AA3AAA, AAA4AA: 3.40 GHz Xeonilla 1.950 sekuntia (mukaanlukien tulkin käynnistys) :)
Noh, ei kai se niin kamalaa ole vaikka pari tapausta jäisikin aikarajan vuoksi ratkomatta. Useimmat tuo ratkoo sadassa millisekunnissa.
jpa, jos aikaraja ylittyy, niin ohjelma sammuu väkisin ja Laaksosella on 3 GHz kone eikä 3.40 GHz
KingOfTheWorld kirjoitti:
jpa, jos aikaraja ylittyy, niin ohjelma sammuu väkisin ja Laaksosella on 3 GHz kone eikä 3.40 GHz
Tiedän että sammuu, olen kyllä lukenut tämän threadin aiemmat postit. Ja itsellä ei satu noin nopeaa olemaan, joten testailen shell-serverillä, joka sattuu olemaan 3.4 GHz.
Enemmän eroa tulee luultavasti tulkin version ja alustan (+ tulkin käännössä käytettyjen optimointien) vuoksi.
Antti Laaksonen kirjoitti:
Jos ohjelma on hyvässä vaiheessa, mutta aika uhkaa loppua kesken, voidaan sopia pienestä lisäajasta.
Tässä tapauksessa kannattaa lähettää minulle sähköpostia.
Voisiko tuosta mahdollisesta lisäajasta ilmoittaa tarkemmin tässä kaikille. Mitä varhemmin on aloittanut sitä enemmän väliin mahtuu muuta puuhaa joten lisäaika voisi olla monelle tarpeen. Kisan aihe on tdella kiehtova.
setä kirjoitti:
Antti Laaksonen kirjoitti:
Jos ohjelma on hyvässä vaiheessa, mutta aika uhkaa loppua kesken, voidaan sopia pienestä lisäajasta.
Tässä tapauksessa kannattaa lähettää minulle sähköpostia.
Voisiko tuosta mahdollisesta lisäajasta ilmoittaa tarkemmin tässä kaikille. Mitä varhemmin on aloittanut sitä enemmän väliin mahtuu muuta puuhaa joten lisäaika voisi olla monelle tarpeen. Kisan aihe on tdella kiehtova.
Yleisen lisäajan sijaan tässä kilpailussa voisi kokeilla miten paljon tulosten ja testisarjojen näkeminen vaikuttaa ohjelmien suoritukseen. Eli kaikki palauttaa ohjelmat ajallaa, ajetaan testit, julkastaan alustavat tulokset ja testisarjat, annetaan viikko lisäaikaa ja käsketään osallistujien palauttaa 10 lisäsarjaa lopullisen palautuksen yhteydessa. Olisi mielenkiintoista nähdä kuinka paljon ohjelmat paranevat ja 'oppivat'. Nyt näyttää nimittäin siltä, että on kohtalaisen helppo koodata tietyntyyppisen sarjan yleinen tunnistin ja ohjelmien paremmuus ratkennee sillä kuinka hyvin on itse keksinyt erilaisia sarjoja.
Näin jälkikäteen voi muuten sanoa, että olisi ollut kiva, jos osallistujat olisivat voineet lähettää useamman kuin yhden testisarjan. Itselläni on ainakin tusinan verran erityyppisiä mielenkiintoisia sarjoja, joita ei esiintynyt Antin testeissä.
Kun lisäajasta ei ole ainakaan haittaa kenellekään, sovitaan nyt niin, että ohjelman viimeinen palautuspäivä on 5.10. Tämä tarkoittaa siis viittä päivää ylimääräistä aikaa viimeistellä ohjelmia.
Näillä näkymin kilpailu ei pääty tulosten julkaisuun, vaan suunnitelmissa on yhtä ja toista kiinnostavaa. Älykkäissä ohjelmissa riittää mietittävää ja tutkittavaa yhtä kilpailua enemmän. Tästä kuitenkin lisää myöhemmin...
FooBat kirjoitti:
Näin jälkikäteen voi muuten sanoa, että olisi ollut kiva, jos osallistujat olisivat voineet lähettää useamman kuin yhden testisarjan.
Tämä on totta, mutta minua saa avustaa sarjojen laadinnassa sähköpostilla, jos on hyviä ideoita. ;)
jpa kirjoitti:
E ER ERE ERER ERERE ERERER
Tuosta ihminen osaa helposti jatkaa, eikä muuta sääntöä kilpailussa ollut.
Jopa sarja:
3,1,2,1,2,1,2
olisi luultavasti hyväksyttävä, sillä ihminen jatkaisi tuota 1,2,.. välittämättä alun 3:sta.
Niin, mutta minusta jokainen sarjan jäsen tulisi kuulua sarjaan jollain syyllä. (ja aikasemmassa viestissä sanoin A vaikka piti olla E)
Sarja AT ATTA ATTAAT voidaan muodostaa ottamalla sarjasta 2 viimeistä merkkiä ja lisäämällä ne perään peilaten. Jos sarjaa ei voi järkevästi selittää, minusta se ei ole hyväksyttävä vaikka useampi ihminen arvaisi saman vastauksen. (kuten tuo 3,1,2,1,2,1,2)
Ja alkoi tosiaan minullakin tuo 2sek aika tulla täytee, eikä tuo 1AAAAA, A2AAAA, AA3AAA, AAA4AA sarja ratkea. Mutta kehityksen alla.
Ei muuten kannata poistaa ant scriptillä sitä hakemistoa, jossa koodit on, etenkin, jos niistä ei ole varmuuskopioita. Näyttää tuo poistamis operaatio olla sen verran tehokas, että mikään undelete-ohjelma ei löydä niitä takaisin. Mutta onhan tässä vielä aikaa :)
Ei viitsisi tuota kauheasti alkaa optimoimaan, koska koodista tulee vaikeammin ymmärrettävää. Enkä oikeastaan keksi mistä kohtaa tuo kannattaisi esim. C++:lla uusiksi kirjoittaa, kun aikaa hukkuu kaikkialla.
Onko jollain jotain sitä vastaan, että aikaraja nostettaisiin esim. 10 s/sarja? Tai vaihtoehtoisesti niin, että 100 sarjan ratkaisuun on yhteensä se 2 s * 100 aikaa, jolloin helpoissa sarjoissa säästyneen ajan voisi käyttää vaikeampien ratkaisuun.
Jaa, kyllä se vaan algoritmin optimointi kannattaa :)
Lisäilin vähän cachetusta ja nyt toimii about 14x nopeammin. Tosin pari bugia vielä jostain tulee..
Edit: Bugitkin korjattu, testisarjoilla 7x nopeammin kuin ennen. Nuo uudemmatkin testit menevät kaikki läpi yhteensä sekunnissa. Käytännössä hyöty ei ole ihan noin suuri, koska kilpailussa ohjelma käynnistetään uudelleen joka sarjaa varten eikä siten cache säily käynnistysten välillä.
Kerrohan Antti millon olet päättänyt sarjat, ei passaa ohjelman heikkouksista kertoa ennen sitä...
En valitse testisarjoja sen mukaan, että joku ohjelmista ei niistä selviäisi. :)
Sitten kun kaikki ovat palauttaneet ohjelmansa, niistä voi minusta myös puhua avoimesti (eli huomisen jälkeen).
Ohjelma toimii hyvin. Ainoa bugi on siinä, että sarja A, AA, AAA, ... ei toimi tässä ohjelmassa, koska kirjaimet muutetaan itse asiassa numerosarjoiksi niiden ASCII-arvon perusteella seuraavalla matemaattisella kaavalla:
kirjain - 65
jolloin A:sta tulee 0. Sarjassa eri kirjaimet lasketaan yhteen, esim. ABC = ('A'-65)+('B'-65)+('C'-65), jolloin algoritmissani A == AAA == A^n, n mikä tahansa kokonaisluku. Ongelma olisi tietysti ollut helppo korjata muuttamalla kaava seuraavaan muotoon:
kirjain - 64 // esim. 'A' - 64
mutta en jaksanut tehdä enää tätä muutosta näin viime tinkaan. Ohjelmani myös vuotaa muistia suorassa suhteessa sarjan pituuden kuudenteen potenssiin, joten toivottavasti testijärjestelmän muisti tulee riittämään, tai vaihtoehtoisesti sarjat ovat riittävän lyhyitä.
Sarjojen on oltava myös aina kapitaalikirjaimista koostuvia, koska en viitsinyt lisätä erillistä tarkastusta onko kirjain 'a' vai 'A'.
Numerojen tapauksessa homma luonnollisesti toimii. Esimerkiksi sarja 1 2 3 käsitellään oikeastaan sarjana (1-65) (2-65) (3-65) eli -64 -63 -62.
Deewiant kirjoitti:
Mielenkiintoinen kilpailuidea, voi tulla vaihteeksi hyvinkin erilaisia osallistujaohjelmia.
Taisit olla oikeassa, ainakin tuo woo:n vaikuttaa toimivan ihan erilaisella logiikalla kuin omani, en sitä nyt vielä edes kunnolla käsittänyt. Noh, sitten nähdään kun lähdekoodit julkaistaan.
Antti voisi muuten kertoa päivän lopuksi, paljonko osallistujia on tullut.
Tuli palautettua omakin ohjelma. Jään mielenkiinnolla odottamaan mitä muut on saanut aikaiseksi.
jpa kirjoitti:
...täydelliseen rewriteen ei enää aikaa ole.
Kuinka niin? Hyvinhän tuo täydellinen rewrite näytti onnistuvan parissa päivässä. Vähän tuli kiire viimeistelyssä :)
Todella kiinnostava aihe ja jätin oman tekeleeni viime tinkaan. Ainakin kaikki esimerkkisarjat ratkesivat alle 20 ms. Mutta ratkaisemattomia voi kehitellä pilvin pimein näillä reunaehdoilla.
Minulla jäi kesken, koska vaihdoin kieltä kesken kaiken ja muutenkin meni ajatus metsään. Ei olisi kannattanut huolehtia niin paljon kaikenmaailman DLL:eistä, vaan tehdä kunnon suunnitelma.
Niin, ja 1 2 2 3 3 3 4 4 4 4 on aivan liian vaikea sarja. Tuollaiseen en keksinyt ratkaisua, joten ohjelmanpuolikas lähti bittitaivaaseen. Ehkä ensi kisaan sitten :-)
Itse sain selvän tunnistuksen toimimaan ja siihen loppu ratkisun teon, mutta itse äly joka olisi ratkaissut seuraavan merkin jäi pahasti kesken innostuksen lopahdettua.
Oman ohjelmani idea on jotakuinkin näin:
Ensin yritetään ratkaista sarja muuttamalla jäsenet luvuiksi, eli A45B, on 1, 45, 2
Kirjaimet muutetaan numeroiksi " ABC.." merkkijonosta (hidasta?), A on siis 1 mutta kerroin on 26, eli A <> AA <> 0
Ja noilla luvuilla siis etsitään yhteenlaskemalla ja kertomalla ratkaisua. Eli sarjan
40B320 45C160 50D80 55E40 ratkaisu on [+5,+1, *0.5]
(ja sarjan ABABA BCBCB CDCDC DEDED, +475255)
Lukujen jälkeen ohjelma kokeilee sitten merkkijonoratkaisua, jossa 3 funktiota.
* Ottaa jäsenestä merkkijonon: merkki(jä) alusta/lopusta/keskeltä, toinen alust/lopust, jokatoinen alusta..
* Muuttaa merkkijonoa jollakin tapaa: lisäys/väh (A->B), tuplaus, merkkilisäys(väh), rullaus, peilaus..
* Lisätä merkkijonon johonkinkohtaan jäsentä: alkuun ja/tai loppuun ja/tai keskelle, korvaten, jokatoinen alkuun..
Sarja AT ATTA ATTAAT ATTAATTA ATTAATTAAT ratkeaa siis:
"Ota toisiksviimeinen merkki, elä muuta sitä, muuta kohdejonoa kopioimalla yksi merkki oikealle, lisää otettu loppuun" (oho.. noinko se ton ratkaisi)
eli esim ATTA, siitä tulee ATTA + A + T (toisiksviimeinen), toki ohjelma olisi ratkaissut tuon myös "peilikuva" logiikalla, mutta tuo näämä ehti ensin.
Niin, lisäksi tein heti alussa päätöksen että ohjelmani osaa ratkaista vain yhden jäsenen kerrallaan, eli ratkaisin kertoo aina vain seuraavan jäsenen. Tämä siksi että esim sarja 6 2 1 AU 2 UAU 3 AUAU ratkaistaan poistammalla jokatoinen jäsen, jolloin sarja 1 2 3 on helppo, sekä tämänjälkeen erikseen AU UAU AUAU. Miinuspuolihan tässä on se että joskus lasketaan myös täysin turhaan... mutta vaikeassa sarjassa menisi kyllä jokatapauksessa kauan. Kyllä ohjelmani ylittää aikarajan sopivan vaikealla sarjalla, eikä se osaa noita ihan kaikkia testisarjojakaan laskea.
Esim helpon oloinen sarja
4 1 ABA AABBAA AAABBBAAA AAAABBBBAAAA AAAAABBBBBAAAAA
ei mene läpi, koska en keksinyt tuohon helppoa tapaa ohjelmalleni. Eli saas nähä.
Pakkohan kirjaimet on muuttaa numeroiksi, jotta sarjaa voi analysoida. Sama vastaako A:ta 1 vai 65 koska kyse on kuitenkin erotuksista. Tuo Meitzin viimeinen sarja oli minullakin viimeinen ratkaisematon ja sitä ennen pari muutakin. Koetin sitten kehitellä yleisavainta ja sainkin sillä nuo kolme erilaista hankalaa ratkaistua. Mutta se yleisavain on tosi sotkuinen. Nyt huomasin, ettei oma ohjelmani ratkaise esim. sarjaa A AB B BC ... vaikka näyttää aika simmppeliltä. Harmittaa vaan, että aiemmin ohjelma tuon ratkaisi mutta joidenkin muutosten jälkeen ei enää.
Oma ohjelmani perustuu aika monimutkaiseen luokkaviidakkoon. Merkkijonoja ei suoraan muuteta numeroiksi, vaan merkkijonosolvereita on useita, esimerkiksi pysty- ja vaakasuuntaiset muutokset. (esim. AAA BBB CCC ja A AB B BC)
Nyt voinee jo laittaa linkin cgi-versioonkin. Tuon koodaamisesta oli kyllä paljon hyötyä, kun irkissä ihmiset jaksoivat testailla erilaisia sarjoja.
jpa, hienosti toimii, mutta minun testisarjallani:
1ABCDE7FGHIJ1PII1024AAA 2BABCD6HIJIH2PAA512BBA 3CBABC5JIHGF4POKS256CAB 4DCBAB4HGFED7PII128DBB
tuli Internal Server Error
setä kirjoitti:
jpa, hienosti toimii, mutta minun testisarjallani:
1ABCDE7FGHIJ1PII1024AAA 2BABCD6HIJIH2PAA512BBA 3CBABC5JIHGF4POKS256CAB 4DCBAB4HGFED7PII128DBB
tuli Internal Server Error
CGI-skriptiin säädetty kolmen sekunnin aikaraja ilmeisesti ylittyy, kun kun noin pitkän jonon erilaisia katkaisukohtia kokeillaan. Komentoriviltä testattuna tuohon meni peräti 76 sekuntia. En tosin tiedä onko ratkaisu oikea, kun tuon logiikka on.. monimutkainen :)
Edit: Tuskin on, kun näemmä tuo päättää vain toistaa alussa annettua sarjaa merkkijonojen loppuosassa. Periaatteessa tuon pitäisi ratketa, mutta voi olla että pisteytys pitää toistavaa ratkaisua helpompana.
Initial series:
1ABCDE7FGHIJ1PII1024AAA
2BABCD6HIJIH2PAA512BBA
3CBABC5JIHGF4POKS256CAB
4DCBAB4HGFED7PII128DBB
Next 10 entries:
5ABCDE7FGHIJ1PII1024AAA
6BABCD6HIJIH2PAA512BBA
7CBABC5JIHGF4POKS256CAB
8DCBAB4HGFED7PII128DBB
9ABCDE7FGHIJ1PII1024AAA
10BABCD6HIJIH2PAA512BBA
11CBABC5JIHGF4POKS256CAB
12DCBAB4HGFED7PII128DBB
13ABCDE7FGHIJ1PII1024AAA
14BABCD6HIJIH2PAA512BBA
Aika pätevältä tuo zizzo vaikuttaa. Millähän tavalla olette lähteneet sitä ratkaisua hakemaan, itselläni on vain kylmästi 4 sisäkkäistä for next looppia joissa lähdetään siis testaamaan kaikki vaihtoehdot, heti jos ei täsmää niin seuraava. Eli kestää mielestäni liian kauan, en olisi ohjelmaani voinut enää kovinkaan paljon lisätä erillaisia vaihtoehtoja 2 sekunnin rajaan.
setällä sadistisia sarjoja, rikkoo muuten 20 merkin rajankin.
Juuh, tämä on tätä tähän ikään kuuluvaa tohelointia. Nyt vasta itse huomasin että tosiaan 20 merkin raja ylittyy. Eihän tuo mikään sadistinen ole kun huomaa erotella numeeriset ja kirjainsarjat erikseen. Joku taisi tuosta ryhmittelystä jo aiemmin tässä keskustelussa mainita. Eli tuossa sarjassa on tavallaan 7 osasarjaa rinnakkain. Ja lisäksi ensimmäisen jäsenen kohdassa FGHIJ piti olla GHIJK. Seuraavat kaksi jäsentä ovat
5EDCBA3FEDCB11PAA64EAC 6FEDCB2DCBA@16POKS32FBC ja siellä loistaa tuo @-merkki jonka tilalle tulisi siis A ym. korjauksella.
Laitoin nyt lähdekoodinkin tuonne sivuille.
Mitään perustason for-looppia tuossa ei ole, vaan hakupuu muodostuu SelectSolver-luokan kautta, joka testailee muita solvereita parhaan löytämiseksi.
Esimerkiksi BaseNumericSolver testaa AritmeticSolverin, GeometricSolverin ja muutaman muun. Monimutkaisempia sarjoja ratkaiseva CombinedNumericSolver puolestaan testaa BaseNumericSolverin, sekä muita solvereita jotka käyttävät itse BaseNumericSolveria pohjanaan.
Pisteytys ("helppous") määrää minkä solverin SelectSolver lopulta valitsee.
Aika kiva toi helppousaste. Itsekin suunnittelin tuollaisen pisteytyksen tekoa, mutta se jäi lopulta tekemättä, kun ajattelin, että siitä tulee liian monimutkainen. Nyt tyydyin vain sijoittamaan ratkaisualgoritmit siihen järjestykseen, missä ne epätodennäköisimmin palauttavat väärän vastauksen. Lisäksi jouduin nostamaan rimaa, jolla hyväksytään löytynyt ratkaisu ja muutenkin laskemaan tiettyjen algoritmien tehoja. Tämä saattaa aiheuttaa sellaisia ongelmia, että sarjaan ei löydy ratkaisua (tai löytyy lopulta väärä ratkaisu), vaikka työkalut oikeankin vastauksen etsimiseen olisi.
Kilpailussa on mukana seitsemän ohjelmaa. Aika moni taisi luopua leikistä kesken, mutta valmistuneet ohjelmat vaikuttavat ensi testien perusteella varsin hyviltä.
Jos olet lähettänyt ohjelman, mutta et ole saanut minulta varmistusta, ota pikaisesti yhteyttä!
Kilpailun tuloksia voi odottaa ensi viikon aikana.
Mitäs ootta mieltä vaikka sarjasta:
30145A 3014A0 301A35 30A130 3A0125
Minullakin ohjelma toimii juuri kuten FooBatin, eli ei mitään pisteytystä vaan yritin järjestää ohjelmaa sopivasti. Ja samoja ongelmia oli.
Emminä vielä sitä vain ymmärrä milla jpa on saanut tuon toimimaan noin nopeasti.
Meitzi kirjoitti:
Mitäs ootta mieltä vaikka sarjasta:
30145A 3014A0 301A35 30A130 3A0125Emminä vielä sitä vain ymmärrä milla jpa on saanut tuon toimimaan noin nopeasti.
Tuota sarjaa täytyy kyllä pohtia hetken aikaa, ja idea taisi olla että ratkaisun näkisi ensisilmäyksellä. Mutta mielenkiintoinen ajatus tuo kirjaimien laittaminen numeerisen jonon keskelle.
Nopeus johtuu siitä, ettei mitään oikeastaan bruteforceta. Esimerkiksi useista sarjoista koostuva jono paloitellaan erilaisten sääntöjen mukaan, kuten numerot ja kirjaimet erikseen. Lisäksi ratkaistut osasarjat tallennetaan cacheen, joten esimerkiksi 1A1, 2B2, 3C3:ssa täytyy ratkaista 1,2,3,... vain kerran.
7 ohjelmaa... ehkä olisi ollut parempi pidentää kilpailuaikaa 2 kuukauteen? olisin itsekin ehkä voinut osallistua.
T.M. kirjoitti:
7 ohjelmaa... ehkä olisi ollut parempi pidentää kilpailuaikaa 2 kuukauteen? olisin itsekin ehkä voinut osallistua.
Laaksonen puhui että jotain muutakin näihin liittyen vielä tehtäisiin, eli ehkä on vielä aikaa tehdä uusiakin ohjelmia? Seitsemän ohjelmaa on kyllä oikeastaan enemmän kuin alunperin oletin.
Kilpailuaika voisi olla esimerkiksi viisi vuotta, niin ehtisi tehdä tutkimustakin aiheen tiimoilta.
Koska noi kilpailutulokset oikein julkaistaan?
Voiskai se Antti listata ainakin osallistujat tuolla sivuilla.
Tässä on ohjelmien luettelo (lähetysjärjestys):
RIVO / Meitzi
patterns / Martin Pärtel
zizzo / Petteri Aimonen
aiq / Jorma Sainio
Pölkky / Sami Luostarinen
alyhoi / Kristian Laakkonen
Antero / Antero Korteila
Kilpailijat saavat oman ohjelman tulokset tarkistettavaksi lähipäivinä.
Jutellaan nyt silla aikaa sitten näistä mitä meillä on.
zizzon sarja 0096 0048 0024 0012
Minusta tuohon on pakko hyväksyä kaksi oikeaa vastausta. Jos tuohon olisi lisätty yksi jäsen alkuun olisi tilanne silloin väkisin selvä, mutta ei tuossa.
Sarjalle 00192 0096 0048 0024 0012 on vain yksi oikeas vastaus
Sekä sarjalle 0192 0096 0048 0024 0012
Niin, ja minun ohjelmani ei tuota ratkaise sitten ollenkaan. (pyh)
Antti Laaksonen kirjoitti:
Tässä pitäisi kyllä hyväksyä molemmat jatkot, mutta yleisesti luvut ovat ilman etunollia.
Meitzi kirjoitti:
zizzon sarja 0096 0048 0024 0012
Minusta tuohon on pakko hyväksyä kaksi oikeaa vastausta. Jos tuohon olisi lisätty yksi jäsen alkuun olisi tilanne silloin väkisin selvä, mutta ei tuossa.
Tuo on kyllä totta, 006 003 pitänee hyväksyä myös.
Alustavat tuloksetkin näemmä tulivat: 110/144, 76.4%.
Harmillisen moni sarja oli mennyt väärin sen takia, ettei ollut mitään solveria yksinkertaiselle, valmiiksi annetulle sanalle. Esimerkiksi KATSOPAS, ATSOPAS, TSOPAS, ... sattui ratkeamaan ihan vain siksi, että Zizzo keksi sanalle 'katsopas' monimutkaisen säännön.
ALKAASEURAAVASTA 1 2 3 4 5 on hieman kyseenalainen, viesti on kyllä selvä ihmiselle, mutta ei tietokoneelle. Toisaalta myös SADFAKFJAASFAHFH 1 2 3 4 5 olisi varmaan tarpeeksi helppo ihmiselle, ja ohjelman kannalta se ei tuosta toisesta eroa.
91/144, 63.2 %
Pahasti tuli takkiin Zizzolta. Se olikin jo melko selvää että häviän Zizzolle, kun itseltäni puuttui pari oleellista solveria. Toimintaperiaate vaikutti melko samalta, helppousarvoa lukuunottamatta.
jpa:n kanssa olen samaa mieltä, että sarja:
ALKAASEURAAVASTA 1 2 3 4 5, on hieman kyseenalainen. Säännöissä tätä ei tietysti kielletty, mutta minusta kaikkien sarjan jäsenten täytyisi kuulua jotenkin sarjaan.
vai mihin voidaan vetää raja sarjaan kuulumattomien jäsenten määrässä?
IGNORE 1 IGNORE 2 3 4 5 6 7: ?
IGNORE IGNORE IGNORE 1 2 3 4 5 6 7 8: ?
noh, tuloksiin tämä yksi tapaus tuskin vaikuttaa, joten taitaa olla aivan sama onko tämä mukana vai ei.
Kilpailun kuvaus kirjoitti:
Kaikki testit ovat säännöllisten sarjojen täydennyksiä.
Mitenkäs nuo ovat säännöllisiä sarjoja, jos osa alkioista ei kuulu sarjaan?
Olette oikeassa, tämä sarja ei sovi tehtävänantoon. Tosin useampi ohjelma ratkaisi sarjan hämäyksestä huolimatta.
Sarjoista on löytynyt myös muutama muu virhe, jotka korjaan samaten ennen lopullisia testiajoja.
Eipä ollu alustava tulos kuin 55.6 %, eniten ehkä harmittaa että en ollu huomannu sarjaa jossa joku merkki peittää jotain. Esim sarja ABCDE1 ABCD2F ABC3EF AB4DEF ei siksi ratkennu mutta sarja OHJELMOINTIPUTKA OHJELMOINTIPUTBK OHJELMOINTIPUCTK kyllä. (brute force osaa aloitta viimeisesti ja toisiskviimeisestä merkistä, mutta eipä haitannut missään noista sarjoista kuten arvelinkin)
Ohjelma kyllä toimi kuten se oli tehtykkin, eli ei yhtään bugin takia väärää vastausta. Aikapulan takia jouduin palauttamaan ohjelman paripäivää aikasemmin.
Parhaimmat naurut minulla irtosi sarjasta:
123456789 123456790 123456791 123456792
Kerkesin miettiä PITKÄÄN, että mites tuo menee.. ysi siirtyy ensin yhdellä ja alta paljastuu nolla.. mitäs sitten? mutta ohjelmanihan on ratkaisutkin tuon.. hmm..
No empähän huonoille hävinnyt. Tuli kiireessä sählättyä ja ohjelma ohittikin sen viimeisen osan, jossa piti ratkaista sarja, joka ei muutoin ratkennut. Se oli eräänlainen yleisavain ja juuri siksi päätinkin lopulta osallistua. Todella kiinnostava kisa kuitenkin.
41/144 28.5 % heh heh...
No eipä tuon kummoisempaa ollut odotettavissakaan kun en ehtinyt/jaksanut koodata kovin monelle erilaiselle sarjalle ratkaisijaa eikä ongelman lähestymistapa tullut ehkä parhaiten valittua...
Meitzi kirjoitti:
Parhaimmat naurut minulla irtosi sarjasta:
123456789 123456790 123456791 123456792
Kerkesin miettiä PITKÄÄN, että mites tuo menee.. ysi siirtyy ensin yhdellä ja alta paljastuu nolla.. mitäs sitten? mutta ohjelmanihan on ratkaisutkin tuon.. hmm..
Kyllähän tuo kieltämättä juu... Olemmeko siirtymässä keinoälyjen valtakaudelle, kuten niin monet ovat ennustaneet tulevaisuudessa tapahtuvan :D
123456789+1 = 123456790
123456790+1 = 123456791
123456791+1 = 123456792
:)
T.M. kirjoitti:
123456789+1 = 123456790
123456790+1 = 123456791
123456791+1 = 123456792
:)
No shit, Sherlock.
Anteeksi jos ymmärsitte väärin, mutta en yrittänyt lesota tuolla :D
T.M. kirjoitti:
Anteeksi jos ymmärsitte väärin, mutta en yrittänyt lesota tuolla :D
Turhaan selittelet. Yritit tuoda väkisin ylitsepursuavaa älykkyyttäsi, ja nostaa näin itsesi muiden yläpuolelle.
Nyt kilpailun lopulliset tulokset ovat valmiit!
https://www.ohjelmointiputka.net/kilpa.php?
Kaksi ohjelmaa yli muiden olivat Jorma Sainion "aiq" ja Petteri Aimosen "zizzo", joista "aiq" veti niukasti pidemmän korren. Myös "Pölkky" ja "RIVO" menestyivät hienosti. Kaikki ohjelmat ratkaisivat virheettömästi kymmeniä sarjoja, mitä voi pitää hyvänä saavutuksena.
Jos haluatte tulossivulle ohjelmien uusimmat versiot (joiden menestys ei kuitenkaan vaikuta tuloksiin) tai muutoksia ohjelmien kuvauksiin, voitte lähettää minulle sähköpostia. Jos kilpailun aihe jaksaa vielä kiinnostaa, voidaan harkita jossain vaiheessa uusintaottelua uusilla sarjoilla.
Kiitos kilpailun osallistujille ja seuraajille!
Heh, kokeilin tuota zizzon online ratkaisijaa, antoi tälläistä tulokseksi:
Annetut termit: LATSKA, LATSKE, LATSKAT, LATSKAK Seuraavat 10 termiä: LATSKEK LATSTTKAKT LATSKKAK LATSKKEK LATSTTKKAKTTT LATSKKAKK LATSKKEKK LATSTTTTKKAKKTTT LATSKKKAKK LATSKKKEKK
Itse en kyllä näe mitään logiikkaa tuossa :D
T.M. kirjoitti:
Heh, kokeilin tuota zizzon online ratkaisijaa, antoi tälläistä tulokseksi:
Annetut termit: LATSKA, LATSKE, LATSKAT, LATSKAK
Hauskaa, että minun nimimerkkiäni käytetään testaamiseen. Tuli otettu olo. :)
T.M. kirjoitti:
Heh, kokeilin tuota zizzon online ratkaisijaa, antoi tälläistä tulokseksi:
Annetut termit: LATSKA, LATSKE, LATSKAT, LATSKAKItse en kyllä näe mitään logiikkaa tuossa :D
Minä en ymmärrä logiikkaa edes antamassasi sarjassa. IMHO ei ole syytä valittaa ohjelman antamasta vastauksesta, jos edes sarja ei ollut järkevä.
Tämän kilpailun säännöillä ei kuitenkaan ole ohjelmalta järkevää jättää vastaamatta epäloogiseen tehtävään, mutta Zizzon antama helppousaste tuolle on alle 0.5% (pyöristyy 0%).
Sivulla näkyvistä debug-tiedoista selviää logiikka, jonka Zizzo tuolle löysi:
Alussa on jatkuvasti "LATS", jolloin jää KA, KE, KAT, KAK. Tuossa alkioille suoritetaan muunnos, jossa alkuperäisen merkkijonon merkeistä muodostetaan uusi jono, lisäämällä vuorotellen alkuun ja loppuun.
Tekemällä käänteisesti vastaava muunnos, saadaan sarjaksi AK, EK, AKT, AKK. Tämän pohjana on toistuva sarja [AK, EK, AKT]. Sarjan merkkejä toistetaan sarjan [1,1,1], [1,2,3], [1,3,5], jne. mukaisesti, jossa seuraavaan alkioon siirrytään aina kun AK, EK, AKT on käyty kerran läpi (kolmen alkion välein).
Siten pohjalla oleva sarja on AK, EK, AKT, AKK, EKK, AKKTTT, AKKK. Tuolle sitten tehdään alussa kuvattu muunnos.
jpa kirjoitti:
IMHO ei ole syytä valittaa ohjelman antamasta vastauksesta, jos edes sarja ei ollut järkevä.
En valittanut :) oli vain hauska kun se osasi jotain tommosta outoa.
Meni lopulta aika tiukalle tuon zizzon kanssa.
Tässä meinasi käydä niin kuin vähän aikaisemmin epäilin, että ohjelma jättää ratkasematta tai antaa väärän vastauksen tehtäviin, vaikka oikeakin ratkaisumenetelmä oli koodattu. Pikaisen laskutoimituksen mukaan 11 sarjaa jäi ratkaisematta, vaikka niille olisi ollut toimivakin ratkaisualgoritmi. Kolme helpointa noista meni väärin eräässä ratkaisualgoritmissa olleen pienen bugin takia (otti mod26 numerosta, vaikka se piti tehdä vain kirjaimille). Jos on aikaa, taidan tehdä ensi viikonloppuna päivitetyn version tuosta. Pitää varmaan nyysiä zizzolta se helppousaste, että saa tuon toimimaan varmemmin.
Kuinkahan monta päivitys ja testauskierrosta tarvitaan, että ohjelmat alkavat tosissaan ratkomaan kaikki järkevältä tuntuvat sarjat? Tässä testijoukossa 'uudet' sarjat olivat pääasiassi sarjoja , joissa yhtä tai useampaa kirjainta liikutellaan sanan päällä. Sauraavassa kilpailussa tulisi varmasti eteen uudentyyppisiä sarjoja. Olisiko tälläinenkään kaikki sarjat ratkova ohjelma älykäs? Jo nyt noissa testeissä oli pari tapausta, jotka ohjelmani ratkaisi aivan eri tavalla kuin olin suunnitellut.
Olisiko jollain resursseja tehdä jonkinlaista testiarkistoa, johon kaikki voisivat lähetellä erilaisia testejä? Tällä voisi tutkia kuinka hyviksi ohjelmat voi saada.
FooBat kirjoitti:
Olisiko tälläinenkään kaikki sarjat ratkova ohjelma älykäs? Jo nyt noissa testeissä oli pari tapausta, jotka ohjelmani ratkaisi aivan eri tavalla kuin olin suunnitellut.
Sitten kun jokin ohjelmista tajuaa ettei se osaa ratkaista jotain ongelmaa, ja keksii itse uuden ratkaisumenetelmän annettulle sarjalle, niin olen valmis myöntämään että ohjelma on ainakin jossain määrin älykäs. Siihen asti tyydyn vain myöntämään että ohjelman tekijä on ollut älykäs (ja sinnikäs, ja hyvä ohjelmoimaan) :)
Eli siis oikeaan älykkyyteen kuuluu mielestäni kyky oppia ja keksiä uutta. Ja uskoisin myös että muisti omasta tekemisestä on välttämätön, koska muuten uuden keksiminen/kokeileminen voi olla mahdotonta (juuttuisi loputtomasti kokeilemaan sitä yhtä/muutamaa tapaa ratkaista, koska ei muistaisi sitä jo kokeilleensa).
lainaus:
Olisiko jollain resursseja tehdä jonkinlaista testiarkistoa, johon kaikki voisivat lähetellä erilaisia testejä? Tällä voisi tutkia kuinka hyviksi ohjelmat voi saada.
Eipä kuulosta vaikealta, tosin jos sellaisen "vieraskirjan" vain tekee, niin äkkiä joku neropää sen spämmii täyteen... Ja riippuu tietenkin onko muilla vielä kiinnostusta tästä asiasta. Itseä tämä kilpailu on alkanut kiinnostaa yhä enemmän, tosin en juurikaan tälläiseen ohjelmointiin ole vielä tutustunut.
JTS kirjoitti:
FooBat kirjoitti:
Olisiko tälläinenkään kaikki sarjat ratkova ohjelma älykäs? Jo nyt noissa testeissä oli pari tapausta, jotka ohjelmani ratkaisi aivan eri tavalla kuin olin suunnitellut.
Sitten kun jokin ohjelmista tajuaa ettei se osaa ratkaista jotain ongelmaa, ja keksii itse uuden ratkaisumenetelmän annettulle sarjalle, niin olen valmis myöntämään että ohjelma on ainakin jossain määrin älykäs. Siihen asti tyydyn vain myöntämään että ohjelman tekijä on ollut älykäs (ja sinnikäs, ja hyvä ohjelmoimaan) :)
Eli siis oikeaan älykkyyteen kuuluu mielestäni kyky oppia ja keksiä uutta. Ja uskoisin myös että muisti omasta tekemisestä on välttämätön, koska muuten uuden keksiminen/kokeileminen voi olla mahdotonta (juuttuisi loputtomasti kokeilemaan sitä yhtä/muutamaa tapaa ratkaista, koska ei muistaisi sitä jo kokeilleensa).
Näinhän se taitaa olla, mutta mielestäni tässä on kyse myös vähän siitä, että ihmiset eivät halua myöntää, että tietokoneohjelma voisi olla älykäs, vaikka se tekisi perinteisesti älykkyyttä vaativia tehtäviä. Esimerkiksi aikoinaan tekoälytutkijoiden parissa shakin peluuta pidettiin hyvänä mittarina ohjelman älykkyydelle, koska ihmiset voittivat parhaimmatkin shakinpeluuohjelmat. Nyt kun tilanne on muuttunut ja tietokoneohjelmat voittavat mestaripelaajatkin, sanotaankin, että kyse on vain laskennasta ja ohjelma ei olekaan oikeasti älykäs. Näyttää, että heti kun tietokoneohjelma pystyy tekemään jotain, todistaa se että tämä asia ei vaadikaan älykkyyttä vaan asioiden opettelemista, hyvää muistia ja paljon laskentaa. Tämäkin kilpailu osittain todisti, että tälläisiä säännöllisiä sarjoja voidaan opetella ja opettaa ohjelmille ja että jo muutamilla yksinkertaisilla malleilla saadaan kohtalaisia tuloksia.
FooBat kirjoitti:
Olisiko jollain resursseja tehdä jonkinlaista testiarkistoa, johon kaikki voisivat lähetellä erilaisia testejä?
Minä voin ottaa asian tehtäväkseni. Pitää vielä miettiä käytännön toteutusta. Sain jpa:lta hyviä ehdotuksia sarjojen luokitteluun, ja lisäksi sarjoja voisi hakea ainakin vaikeusasteen perusteella ja erikseen vasta lähetettyjä sarjoja.
FooBat kirjoitti:
Näyttää, että heti kun tietokoneohjelma pystyy tekemään jotain, todistaa se että tämä asia ei vaadikaan älykkyyttä vaan asioiden opettelemista, hyvää muistia ja paljon laskentaa.
Niinpä, ja kun ohjelma ei voi loppujen lopuksi muuta kuin laskea annettujen ohjeiden perusteella, "aidon" älykkään ohjelman tekeminen tuntuu vaikealta. Jos joskus voidaan tehdä ohjelma, jonka toiminta vastaa ihmisen ajattelua, tilanne on aika pelottava. Ihmisen ainutlaatuinen ajattelu ei olisikaan muuta kuin mekaanista laskentaa.
Just näin. Jos jokin kone ajattelisi edes lähelle samaa tapaa kuin ihminen, olisi se todella pelottava tilanne. Tommoinen kone kuitenkin, varsinkin verkkoon kytkettynä, olisi kenties jopa vaarallinen :)
Toisaalta olisi kiva ensin nähdä ihmisen käyttävän täyttä aivokapasiteettiaan. Se se vasta hurjaa olisi :)
Tässä vaiheessa haluaisin kiittää Ohjelmointiputkaa, Anttia sekä kaikkia osallistuneita mielenkiintoisesta ja onnistuneesta kilpailusta. Ohjelmoin vain harrastuksena ja nyt sain taas hetken paneutua ohjelmoinnin mielenkiintoiseen maailmaan.
Antti Laaksonen kirjoitti:
FooBat kirjoitti:
Olisiko jollain resursseja tehdä jonkinlaista testiarkistoa, johon kaikki voisivat lähetellä erilaisia testejä?
Minä voin ottaa asian tehtäväkseni. Pitää vielä miettiä käytännön toteutusta. Sain jpa:lta hyviä ehdotuksia sarjojen luokitteluun, ja lisäksi sarjoja voisi hakea ainakin vaikeusasteen perusteella ja erikseen vasta lähetettyjä sarjoja.
Toteuta toki myös sellainen ominaisuus, että sarjat saa ladattua yksinkertaisessa tekstimuodossa. Tuo testisarjoissa käytetty formaatti (kukin sarja omalla rivillään) on ihan kiva.
Ihan mielenkiintoista sekin että kilpailuun osallistuneita oli 7 ja erillaisia ohjelmointikieliä 6.
Zizzon ohjelma ei osannut ratkaista sarjaani :(
7 61 527 pitäisi jatkua 4541 40647 345621 3110367 25773301 231737507 2065435361...
Ja sain sen vielä sekoamaankin kokeilemalla sarjaa 1 5 7 8 :D
ville-v kirjoitti:
7 61 527 pitäisi jatkua 4541 40647 345621 3110367 25773301 231737507 2065435361...
Eipäs, vaan 7 61 527 4521 38467 323981 2693607 22020241 175959947 1361417301 ... ;)
def ville(x, n=10): a = 0 for i in range(n): yield x a = a * 10 + 2 x = 9 * x - a print ' '.join(str(x) for x in ville(7))
ville-v kirjoitti:
7 61 527 pitäisi jatkua 4541 40647 345621 3110367 25773301 231737507 2065435361...
Ja sain sen vielä sekoamaankin kokeilemalla sarjaa 1 5 7 8 :D
Mikäs kumman logiikka noissa on olevinaan? Taas voi vaan sanoa, että kilpailussa ratkaistiin sarjoja, joihin ihminen näkee vastauksen suoraan. Jos ei näe, saa softa kaatua tai evottaa ihan vapaasti :)
Tuo kaatuminen johtuu siitä, että päättyvien sarjojen käsittely on huono :/ Ilmeisesti tuolle sarjalle koitetaan ratkaisinta, jossa muutos aina puolittuu (5-1 = 4, 7-5 = 2, 8-7 = 1), jolloin seuraavaan tulisi muutos 0.5, mutta kilpailussa oli vain kokonaislukuja. En ole jaksanut vapaa-aikaani lisäkehitykseen käyttää, vaikka tuon voisi käsitellä ehkä järkevämmin.
1 5 7 8 8.5 8.75 8.875 jne...
Annetut termit: 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000 Seuraavat 10 termiä: 0011, 1110, 0101, 1110, 0011, 2000, 0111, 2110, 0101, 2100
Ei tuo mikään täydellinen ole (vaikka niin zizzon tekoäly väittää), esim bittejä se ei osaa, vaikka antais 100 bitin sarjat.
Mutta kilpailun säännöissä käsittääkseni oletettiin kymmenjärjestelmä. Miksipä siis kukaan olisi binaarilukuja ruvennut ohjelmoimaan?
Ratkaiskaapa tämä, kun noin nokkelia olette:
8, 16, 24, 32, 40, 49, 57, 65, 73, 81, ?
Minulla on tähän yksiselitteinen vastaus, hyvin yksinkertainenkin vielä.
Tosi helppo, koska kaikki 10 jäsentä on annettu ja enempäähän ei pitänyt olla. Mutta jos tuon 11. päättelee niin minusta se on 90.
Varokaa, oikea vastaus tulee: Ei suinkaan 90, ei alkuunkaan. Tuohan on ilmiselvä 9:n kertotaulu 11-järjestelmässä, ja tottahan nyt jokaisen ohjelman pitäisi sellainen ratkaista ja ihmisten ainakin. Oikea vastaus on siis 8a (hirsipuu ei näköjään tue numeroita).
Tuo 90 tuli ensinnä mieleen joten se on oikea ratkaisu :)
Metabolix kirjoitti:
Miksipä siis kukaan olisi binaarilukuja ruvennut ohjelmoimaan?
Ihminen voi oppia tuollaisen antamani binäärilukusarjan päättelyllä nopeasti jos ei niistä ole ennen kuullutkaan. Tämän takia se olisi ollut hieno lisä ohjelmaan.
Tuo antamasi 11 kantaisessa järjestelmässä ilmoitettu sarja on kyllä liian vaikea ihmisille, binäärit taas eivät ole, ja koska tuossa antamassani sarjassa lisättiin joka kerta vain yksi, sinun sarjassasi taas 9, joka taas aiheuttaa lisää vaikeutta, eikä sarjassasi ollut kertaakaan kaikkia mahdollisia numeroita, esim se A joka kuului järjestelmään. Jos tuo 11 kantainen sarjasi olisi ollut lukujono jota kasvatetaan yhdellä, sitten sen olisi voinut päätellä helposti.
Metabolix kirjoitti:
Mutta kilpailun säännöissä käsittääkseni oletettiin kymmenjärjestelmä
Eikös sielä ollut sarjoja joissa numeroita jatkettiin kirjaimilla tms?
Ja eihän sarjojen älyämiseen ihminen käytä aina kymmenjärjestelmää, kuten tuo binäärijuttuni osoitti.
Luulin että tässä kilpailussa pyrittiin luomaan ohjelma joka osaisi ratkaista sarjoja mahdollisimman paljon, eikä vain juuri kymmenjärjestelmää jne...
Aihe on jo aika vanha, joten et voi enää vastata siihen.