Katselin tuota vinkkiä, jonka water_flea vastikään lähetti, ja mietin, oliko se ehkä tehty liian vaikeasti. Googlella löysin heti Brainfuckin syntaksin, ja tuonne viestilootaan kirjoitin sitten kerralla mielestäni toimivan ohjelman. No, kääntäjää en sitten löytänytkään, joten virittelin oman tulkin pystyyn. Joka tapauksessa, nyt pääsin jo testaamaan ohjelmaani, ja sehän toimi, kun vain selvitin, missä muistipaikassa luvut ovat. Hassua kyllä, se laskee joka kierroksella kaksi lukua lisää. Nähtävästi kaikki oli koodia kirjoittaessa ilmiselvää, koska en silloin joutunut ajattelemaan lainkaan. Kuitenkin nyt jouduin "parsimaan" koko koodin, jotta sain toimintaperiaatteen selville. Eipä se kummoinen ollut.
Muistutan vielä, että periaatteessa Brainfuck-ohjelma tulostaa vastaavia merkkejä eikä lukuja, joten tulostus ei välttämättä näytä oikealta. Sama vinkki oktaalimuotoisella tulostuksella on kirjoittamassani Brainfuck-oppaassa.
Algoritmin toiminta eli lukujen liikehdintä muistissa:
m1 m2 m3 a b - a+b - b - a+b a+b+b a+b - a+b+b a+b a+b+b -
Koodi. Muistathan poistaa kommentit, jos käytät standardinmukaista kääntäjää; pilkut ja pisteet sekä plus- ja miinusmerkit ovat koodin symboleita.
+++++ # Montako kertaa? Lukuja tulostuu 2n+2. >+.>+.<< # m1 = 1, m2 = 1, printataan ne [-> # while (m0) { m0--, ptr = m1 >[-<+>>+<] # m1 += m2, m3 += m2, m2 = 0 <[->+>+<<] # m2 += m1, m3 += m1, m1 = 0 >[-<+>] # m1 += m2, m2 = 0 >[-<+>] # m2 += m3, m3 = 0 <<.>.< # printataan m1 ja m2, kaksi peräkkäistä lukua; <] # ptr = m0 ja whilen loppu }
Ja vielä ilman kommentteja:
+++++>+.>+.<<[->>[-<+>>+<]<[->+>+<<]>[-<+>]>[-<+>]<<.>.<<]
On ehkä hiukkasen vaikeampi kieli kuin asm. ^_^
On ehkä joitakin tuhansia komentoja vähemmän kuin asmissa ^^
On ehkä hiukkasen turha kieli
EIKÄ OLE
;SALEE on
Ei oo!!!
Aihe on jo aika vanha, joten et voi enää vastata siihen.