Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-07-2004, 07:15   #1 (permalink)
Neuer User
 
Registriert seit: Jul 2004
Beiträge: 4
Lightbulb Brainfuck Interpreter

Da ich neu hier bin,
stelle ich mich erstmal vor: Mein Nickname ist alberth.dent (ganz was neues ) und ich Interessiere mich für Programmieren im Allgemeinen. Vor ein, zwei Wochen machte mich ein Freund auf Brainfuck aufmerksam. Um ein bisschen ActionScript zu üben, habe ich heut Nacht einen kleinen Brainfuck-Interpreter mit Flash gemacht:

http://frexx.de/as-brainfuck/

Brainfucker.as:
Code:
// ActionScript Brainfuck Interpreter v1.0
// 2004/07/11 Wolfgang Frisch
// http://frexx.de/as-brainfuck/
// If you should really find a useful application of this piece of code,
// please let me know!
// Corrections and suggestions go to: brainfuck@frexx.de

// brainfuck class
class Brainfucker {
	// output event; function onOutput(n:Number); when this event is fired. fuck() returns false;
	var onOutput;
	// input event; function onInput(); when input is available, update your input:Array and call fuck again
	var onInput;
	
	// internal vars
	var steps = 0; 					// operations counter
	var memSize:Number = 30000; 	// memory size
	var mem:Array; 					// memory
	var ptr:Number;					// memory pointer
	var p;							// program pointer
	var loopStack = new Array();	// array contains program positions of open loops
	
	// initialize new brainfuck
	function init() {
		var i;
		for(i=0;i<memSize;i++) mem[i]=0;
		ptr=0;
		steps = 0;
		p=0;
		loopStack.length=0;
	}

	// constructor
	function Brainfucker () {
		mem = new Array( memSize );
		init();
	}

	// fuck function
	function fuck( input:Array, program:Array ) {
		for(;p<program.length;) {
			steps++;
			switch( program[p] ) {
				case ',':
					if( input.length ) mem[ptr] = input.shift();
					else {
						onInput();
						return false;
					}
					break;
				case '.':
					onOutput( mem[ptr] );
					p++;
					 // -> event; Brainfucker's owner has to call fuck() again
					return false;

				case '>':
					if(++ptr>=memSize) ptr=0;
					break;
				case '<':
					if(--ptr<0) ptr=memSize-1;
					break;
				case '+':
					if(++mem[ptr]>255) mem[ptr]=0;
					break;
				case '-':
					if(--mem[ptr]<0) mem[ptr]=255;
					break;
				case '[':
					if(mem[ptr]!=0) loopStack.push( p );
					else {
						p++;
						for( var c=1; (p<program.length) && (c>0); p++ ) {
							if( program[p] == '[' ) c++;
							if( program[p] == ']' ) c--;
						}
						p--;
					}
					break;
				case ']':
					if( mem[ptr] == 0 ) loopStack.pop();
					else p=loopStack[loopStack.length-1];
					break;
				default:
					steps--;
					break;
			}
			p++;
			// fire a blind output event from time to time to allow terminate in case
			// of an infinite brainfuck
			if( steps%10000 == 0 ) { onOutput(0); return false; }
		}
		return true;
	}
}
Weitere Infos zu Brainfuck:
Brainfuck - Wikipedia
The Brainfuck Programming Language
brainfuck.ca - interpreter u.a.

Urban Müller, Brainfuck-Erfinder

Code:
Die Brainfuck-Syntax:
  +   inkrementiert die aktuelle Zelle
  -   dekrementiert die aktuelle Zelle
  >   verschiebt den Parzellenzeiger auf die nachfolgende
  <   bzw. vorherige Zelle
  .   gibt das Zeichen der aktuellen Zelle auf der Standardausgabe aus
  ,   liest ein Zeichen von der Standardeingabe und speichert dessen ASCII-Wert in der aktuellen Zelle
  [   Schleifenkonstrukt: Anfang (springt zum passenden ], falls die aktuelle Zelle==0 ist)
  ]   Schleifenkonstrukt: Ende (springt zum passenden [, falls die aktuelle Zelle!=0 ist)

Alle anderen Zeichen werden ignoriert, Kommentare können also einfach wüst mit dem Code vermischt werden.
Kurzes Codebeispiel: .+[.+] gibt den Asciizeichensatz aus.
Eine gute Einführung ist die Wiki-Seite zu BF.
Edit:
Ich habe noch ein paar Kleinigkeiten verbessert/verändert. Voraussichtlich werde ich das Teil aber jetzt in Ruhe lassen, da es schließlich nur zur Übung gedacht war. Wenn jmd. was verbessern will, gibts auf anfrage die .fla.
__________________
delete this;

Geändert von alberth.dent (11-07-2004 um 17:41 Uhr)
alberth.dent ist offline   Mit Zitat antworten
Alt 11-07-2004, 12:09   #2 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Coole Sache das,
dann programmier damit doch jetzt mal ein Tweening

mfg. r
bokel ist offline   Mit Zitat antworten
Alt 11-07-2004, 12:40   #3 (permalink)
Neuer User
 
Registriert seit: Jul 2004
Beiträge: 4
Zitat:
Zitat von bokel
Coole Sache das,
dann programmier damit doch jetzt mal ein Tweening

mfg. r
Gute Idee! Falls ich heute noch Lust und Zeit habe, baue ich einen Schalter ein, um die Ausgabe statt ins Textfeld als ActionScript auszuführen. Leider ist bei "99 bottles of beer" mein Brainfuck-Verständnis zu Ende, weshalb ich damit eigtl. nix anfangen kann. Vielleicht gibts ja einen Wahnsinnigen im FF, der das hinkriegt. Ich poste mal oben noch die Brainfuck-Syntax...

Die Speicherfunktion klappt leider noch nicht, weil ich die XMLConnector-Formatierer noch nich' ganz kapier. Meine XML-Datei sieht so aus:
Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<file_listing>
<file name='anfangende.bf'><description comment='2004/07/11 10:32:27'/></file>
<file name='primes.bf'><description comment='2004/07/11 10:32:25'/></file>
<file name='triangle.bf'><description comment='2004/07/11 9:58:00'/></file>
</file_listing>
Wie muss das Binding und den Formatstring setzen, damit ich nur die Namen in ein List-Control bekomme?
Wäre eine andere Struktur sinnvoller?
__________________
delete this;

Geändert von alberth.dent (11-07-2004 um 12:48 Uhr)
alberth.dent ist offline   Mit Zitat antworten
Alt 11-07-2004, 12:53   #4 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Du benutzt einen "Rearrange Fields"-Formatter und stellst seinen Optionstring auf label=name.

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 11-07-2004, 13:08   #5 (permalink)
Neuer User
 
Registriert seit: Jul 2004
Beiträge: 4
Edit: Hab's geschnallt
Fehler: Binding Direction war nicht auf "out".
Danke für die Hilfe - mit label=name geht's.
__________________
delete this;

Geändert von alberth.dent (11-07-2004 um 13:14 Uhr)
alberth.dent ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele