Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Brainfuck: Fibonaccin sarja

Sivun loppuun

water flea [11.04.2006 00:28:30]

#

Brainf*ck ei ole saanut putkassa arvoistaan suosiota, joten tässä sille yksinkertainen esimerkki. Blue Fern ainakin ajoi. Ohjelma tulostaa laskemaansa fibonaccin 10:ttä lukua vastaavan ascii-merkin, "7":n. Plus-merkkien määrä alussa määrää kuinka moneen fibonaccin lukuun lasketaan (+-merkkien määrä +2 :).

++++++++>+>+<<		initial values
[- 			while "0"
>[->>+>+<<<] 		"1" to "3" and "4"
>>>[-<<<+>>>]<<		"4 to "1"
[->>+>+<<<]		"2 to "4","5"
>>>[-<<<+>>>]<		"5 to "2"
<[->>>+<<<]		add "3" to "6"
>[->>+<<]		add "4" to "6"
<<<[-]			zero "1"
>[-<+>]			"2" to "1"
>>>>[-<<<<+>>>>]	"6" to "2"
<<<<<<]			test "0"
>>.			print "2"

Sami [12.04.2006 23:54:36]

#

Voi kun näppärää. :)
Hieno kieli kieltämättä tuo Brainfuck, mutta ehkä niissä tutummissa C++:ssa, Javassa ja Basiceissa sun muissa on kuitenkin omat hyvät puolensa... Joskin yhtä tyylikkään näköisen koodin tekeminen ei ole ainakaan yhtä helppoa niillä.

T.M. [14.04.2006 12:47:23]

#

while "0"
Eikös tuo ole sama kuin ei silmukkaa lainkaan?

Voisit vähän selventää mitä tuossa tapahtuu, nuo "5 to "2" selitykset eivät oikein auenneet.

Metabolix [14.04.2006 17:36:26]

#

Ah, siinä vasta kätevä kieli :) Lainausmerkeissä ovat muistipaikkojen (tavujen) numerot. > siirtyy seuraavaan tavuun, < edelliseen. - vähentää yhden kohdalla olevasta tavusta, + lisää siihen yhden. [ ja ] määräävät silmukan, jota toistetaan niin kauan kuin kohdalla oleva tavu ei ole nolla. Piste tulostaa kohdalla olevan tavun.

FooBat [15.04.2006 07:45:40]

#

Tämä taitaa olla esimerkki sarjassa obfuscated brainfuck. Saman voisi kirjoittaa paljon yksinkertaisemmin näin.

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

ZcMander [21.04.2006 20:27:41]

#

niin tai näin (sama koodi)

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

näppärä kieli :=)

Chiman [22.04.2006 14:52:00]

#

Ovela kieli tosiaan. Alla FooBatin koodi C:nä. Pointtereitakin voisi tietysti käyttää, mutta tein nyt näin.

#include <stdio.h>

int main(void)
{
    int a = 8;
    int b = 1;
    int c = 1;
    int d = 0;

    while(a)
    {
        a--;
        while(b)
        {
            b--;
            d++;
        }
        while(c)
        {
            c--;
            b++;
            d++;
        }
        while(d)
        {
            d--;
            c++;
        }
    }
    printf("%d", c);
    return 0;
}

Deewiant [29.04.2006 23:04:03]

#

Kannattaa poistaa tuo pilkku '"2" to "4","5"' -kommentista, sehän on nimittäin komento - getcharin pyöräytys.

Täydennyksen vuoksi vielä alkuperäinen koodi C:nä, osoittimineen ja taulukkoineen Brainfuck-ympäristön emuloimiseksi.

#include <stdio.h>

int main() {
	// Brainfuckissa on muistia 30000 nollatavua...
	static char mem[30000];

	// ja sitä käsitellään osoittimella.
	char * p = mem;

	// sitten itse ohjelmaan...
	*p += 8;
	++p;
	++*p;
	++p;
	++*p;
	p -= 2;
	while (*p) {
		--*p;
		++p;
		while (*p) {
			--*p;
			p += 2;
			++*p;
			++p;
			++*p;
			p -= 3;
		}
		p += 3;
		while (*p) {
			--*p;
			p -= 3;
			++*p;
			p += 3;
		}
		p -= 2;
		while (*p) {
			--*p;
			p += 2;
			++*p;
			++p;
			++*p;
			p -= 3;
		}
		p += 3;
		while (*p) {
			--*p;
			p -= 3;
			++*p;
			p += 3;
		}
		p -= 2;
		while (*p) {
			--*p;
			p += 3;
			++*p;
			p -= 3;
		}
		++p;
		while (*p) {
			--*p;
			p += 2;
			++*p;
			p -= 2;
		}
		p -= 3;
		while (*p)
			--*p;
		++p;
		while (*p) {
			--*p;
			--p;
			++*p;
			++p;
		}
		p += 4;
		while (*p) {
			--*p;
			p -= 4;
			++*p;
			p += 4;
		}
		p -= 6;
	}
	p += 2;
	putchar(*p);
}

moptim [11.09.2006 18:32:10]

#

ai ai, että BF vetää lyhyemmäksi tuon koodin. BF RULES! (en osaa oikeastaan mitään sillä)

Qman [01.11.2006 18:07:14]

#

itte tein sille toimivan tulkin qb:lla, tai kutsun sitä bf+:ssaksi omien pikku lisäysteni ansiota(randomit ja if- lausekkeet)


Sivun alkuun

Vastaus

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

Tietoa sivustosta