Kirjautuminen

Tunnus
Salasana

Haku

Tehtävät

Koodivinkit: Brainfuck: Fibonaccin sarja

Kirjoittaja: Metabolix; viimeksi muokattu 19.04.2013.

Tagit: algoritmit, laskenta

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:

+++++>+.>+.<<[->>[-<+>>+<]<[->+>+<<]>[-<+>]>[-<+>]<<.>.<<]

Kommentit

tesmu [18.04.2006 08:28:23]

Lainaa #

On ehkä hiukkasen vaikeampi kieli kuin asm. ^_^

Metabolix [18.04.2006 21:17:30]

Lainaa #

On ehkä joitakin tuhansia komentoja vähemmän kuin asmissa ^^

DrDeath [28.10.2006 18:53:34]

Lainaa #

On ehkä hiukkasen turha kieli

moptim [04.11.2006 08:02:56]

Lainaa #

EIKÄ OLE

tgunner [30.03.2007 22:27:32]

Lainaa #

;SALEE on

New Samppi [04.05.2009 20:22:19]

Lainaa #

Ei oo!!!

Wabbit [21.10.2009 11:08:35]

Lainaa #

static int getFi (int x)
{
if (x <= 1)
{
return 1;
}
return getFi(x-1) + getFi(x-2);
}

Kirjoita kommentti

Muista lukea keskustelun ohjeet.
Tietoa sivustosta