C# Contest #1: Brainfuck Interpreter



  • Mir ist was dazwischen gekommen und ich werde die nächsten Tage keine Zeit finden. Sorry Leute.

    Vielleicht will jemand anderes übernehmen und saubere Regeln + ein Grundgerüst bereit stellen?



  • Findet jetzt also nicht statt?
    Schade.



  • Nö ich hab das in den Sand gesetzt. Die Woche war Stress angesagt und ich hab anfangs nicht bedacht, klare Regeln und einen kleinen Code zum erweitern bereit zu stellen. 😞

    Wenn sich jemand fähigeres für einen Contest findet, wäre das klasse.



  • µ schrieb:

    Eingabe: Der Brainfuck Quellcode als Parameter für main.

    BF.exe "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.+++."
    

    oder

    BF.exe Path/To/HelloWorld.bf
    

    ?



  • Also ich bastle gerade an einem Interpreter, ist irgendwie witzig.
    Und vor allem nicht viel Aufwand.

    Ich sehe auch keinen Grund hier nicht weiter zu machen.

    Sonst irgendwer der noch Interesse hat?

    ----

    Ich würde auch vorschlagen die IO Funktionen vorzugeben:

    // BFIO.cs:
    using System;
    
    static class BFIO
    {
    	public static int getch()
    	{
    		int ch = Console.Read();
    		// Die meisten Brainfuck-Programme rechnen mit dem Linux-typischen "\n",
    		// und machen unter Windows ("\r\n") Probleme.
    		// Einfacher Hack um diese Probleme zu umgehen:
    		if (ch == '\r')
    			ch = Console.Read();
    		return ch;
    	}
    
    	public static void putch(int ch)
    	{
    		Console.Write((char)ch);
    		Console.Out.Flush(); // vermutlich nicht nötig, tut aber auch nicht weh
    	}
    }
    

    Das File "BFIO.cs" wird natürlich nicht mitgezählt.



  • hustbaer schrieb:

    Sonst irgendwer der noch Interesse hat?

    Naja ich hab jetzt wieder Zeit. D.h. wir könnten uns auf Regeln einigen und ich würde mitspielen. Vorgeben kann ich sie in dem Fall natürlich nicht.

    Ich habe jedenfalls nichts vorbereitet und würde auch bei 0 beginnen.
    Die Idee mit dem kürzesten Code fände ich aber gut. Man kann C# auch missbrauchen 🙂



  • Vorschlag:

    Der - korrekt funktionierende - Brainfuck Interpreter mit dem kürzeste Source-Code (gemessen in Zeichen) gewinnt. (Whitespaces am Datei-Ende, inklusive Zeilenumbrüche, werden nicht gezählt.)
    Sind zwei oder mehr Interpreter exakt gleich lang, dann teilen diese sich den jeweiligen Platz.

    Vorgaben/Regeln:

    Der Interpreter kann Programme bis einschliesslich 2^20 Zeichen verarbeiten.
    Der Speicher der Brainfuck-Maschine hat 2^16 oder mehr Zellen.
    Jede Zelle kann eine vorzeichenbehaftete Zahl speichern, Wertebereich mindestens 16 Bit (-32768 ... 32767).

    "Standard" Brainfuck Befehlssatz, also

    ><+-.,[]
    

    *Sämtliche* anderen Zeichen werden vom Interpreter ignoriert (d.h. z.B. auch '\0').

    Zu Programmbeginn enthalten alle Zellen den Wert 0, ebenso der "Datenzeiger".
    Das Programm endet, wenn der "Programmzeiger" hinter das letzte Zeichen des Programms verschoben wird. Diese Position darf auch durch die beiden Schleifen-Befehle ("[" und "]") erreicht werden.

    Der Interpreter ist eine C# Klasse, compilierbar mit Visual C# 2010 (Express).
    Verwendet werden dürfen sämtliche C# Features die von Visual C# 2010 (Express) unterstützt werden, sowie das gesamte .NET Framework 4.0. Eventuelle Compiler-Warnings sind egal.

    Folgendes Interface wird vom Testsystem bereitgestellt:

    // Im golbalen Namespace 
    interface S//ystem
    {
    	string P { get; }	// Das Programm
    	int R();		// Ein Zeichen lesen
    	void W(int ch);		// Ein Zeichen schreiben
    }
    

    Der Interpreter besteht aus einer Klasse "I", die (zumindest) eine öffentliche Funktion "R" implementiert. Abgegeben wird ein einziges File "Interpreter.cs", in dem die Klasse "I" vollständig implementiert ist.
    Beispiel:

    // Interpreter.cs
    class I/*nterpreter*/ // public brauchen wir nicht
    {
    	public void R/*un*/(S theSystemButYouMightChooseAShorterName) // public + Signatur ist Pflicht, der Parametername darf frei gewählt werden
    	{
    		// hier schlauen Code reinschreiben
    	}
    }
    

    Das Testsystem instanziert diese Klasse mit dem Default-Konstruktor, und ruft dann die Funktion R() auf.

    Der Interpreter muss korrekte Brainfuck Programme korrekt verarbeiten können.

    Der Interpreter darf davon ausgehen, dass ein korrektes Brainfuck Programm bestimmte Bedingungen erfüllt/einhält:
    * "[" und "]" sind "balanced" (also NICHT "]", "[", "[[]", "[]]" etc.)
    * Der "Datenzeiger" wird vom Programm niemals ausserhalb des Bandes positioniert
    * Das Programm erzeugt keine Unter- oder Überläufe (d.h. es inkrementiert keine Zellen mit dem Wert 32767 und dekrementiert keine Zellen mit dem Wert -32768)
    Anders gesagt: das oben erwähnte ist UB, der Interpreter muss damit nicht klarkommen oder in einer bestimmten Art und Weise reagieren.
    Fehlermeldungen/Diagnostics sind nicht erforderlich.

    So inetwa könnte ich mir das vorstellen.

    ps:
    Das Testprogramm (inklusive ein paar Brainfuck Testprogramme) könnte ich relativ schnell bereitstellen.
    Und vielleicht sollten wir verlangen dass der Interpreter auch mit ideone.com (mono 2.8) funktioniert.
    Obwohl die max. 5 bzw. 15 Sekunden Ausführungszeit dort für einige Tests ein wenig knapp sein könnten...


  • Administrator

    Whitespaces zur Einrückung oder für den Codestil werden mitgezählt?
    Wäre es nicht klug, ein Programm zur Verfügung zu stellen, welches die Anzahl Zeichen zählt? Dann hätte man klare Bedingungen und wüsste, worauf man achten soll. Und kann damit auch gleich optimieren 😉
    Bis wann soll der Contest laufen?

    Grüssli



  • Ich würde sagen Whitespaces werden mitgezählt, und es gibt kein Zähler-Programm.
    Einfach weil ein Zähler-Programm zu schreiben einen IMO unverhältnismässig grossen Aufwand darstellen würde.

    Beispielsweise kann man aus "a = b + c;" alle 4 Leerzeichen entfernen, bei "a = new int[123];" können aber nur 2 der 3 Leerzeichen entfernt werden.
    Ebenso müsste man Strings erkennen, da kann man auch nicht einfach Leerzeichen rausschmeissen.

    Es kann ja auch jeder der mag ein 2. File "PrettyInterpreter.cs" mitschicken, falls er den Code hübsch einrücken und/oder kommentieren möchte.

    Bis wann soll der Contest laufen?

    Kommt drauf an wie schnell wir die Regeln festlegen. Ich würde sagen min. 7 Tage nach dem offiziellen Start.



  • Ich hab mal nen neuen Thread aufgemacht, und den Contest dort nochmal ausgeschreiben: http://www.c-plusplus.net/forum/292057
    Rarurick.


Anmelden zum Antworten