C# Contest #1: Brainfuck Interpreter



  • Hallo C#

    Die C++ Leute haben ein nettes Spiel gestartet. Kleine Programmieraufgaben als Contest. Siehe hier: http://www.c-plusplus.net/forum/291216

    Vielleicht klappt das auch hier.

    Hier die erste Aufgabe:

    Brainfuck

    Einsendeschluss: 21.08.2011 - 23:59

    Aufgabe: Schreibe einen Brainfuck-Interpreter. Der kürzeste Quellcode gewinnt. Gezählt werden Zeichen, keine Token. Erlaubt ist alles was C# und .NET bzw. die BCL zur Verfügung stellt. Keine Fremdbibliotheken.
    Eingabe: Der Brainfuck Quellcode als Parameter für main.

    http://de.wikipedia.org/wiki/Brainfuck

    Do your worst!



  • das wird hier nichts, c# progger schreiben business apps und nicht so was!



  • lob schrieb:

    das wird hier nichts, c# progger schreiben business apps und nicht so was!

    Quatsch. Aus Spaß an der Freude habe ich mit C# .NET auch schon einen BrainFuck-Interpreter geschrieben. Nach einer Formatierung ging dieser leider futsch und jetzt habe ich nicht mehr wirklich Lust nochmal einen zu schreiben. :p


  • Administrator

    1. Ich zweifle, dass wir dazu genügend Leute hier haben, aber gegen probieren spricht ja nichts.
    2. Gezählt werden Zeichen. Was heisst das? Gelten auch Leerzeichen? Kommentare? usw.?
    3. Wie soll der Input erfolgen? Woher kommt der Brainfuck Quellcode? Wohin soll die Ausgabe gehen? Konsole?

    Gerade zu Punkt 3 solltest du womöglich am besten zuerst ein Grundgerüst anbieten. So wie es auch im C++ Teil gemacht wurde.

    Grüssli



  • Mache ich gern. Aber nur wenn es überhaupt Interesse gibt. Macht jemand mit?

    Im C++ Thread geht es was die Regeln betrifft aber auch ziemlich locker zu. Da ist bei weitem auch nicht alles bis ins Detail festgelegt und ähnlich locker würde ich das hier auch aufziehen wollen.



  • Ich würde es schon versuchen. Hatte das Ding ja schonmal erstellt. Aber ein Fan von "kürzester Code" bin ich nicht unbedingt, daher werden von mir wohl eher saubere Lösungen kommen 🙂



  • Also ich Programmiere auch sehr gerne, aber wenn dann sollte es auch etwas sinnvolles sein. Das sehe ich bei solchen "Contests" nicht.

    Programmieren aus Zeitvertreib kann man auch bei http://www.pexforfun.com 😉


  • Administrator

    µ schrieb:

    Im C++ Thread geht es was die Regeln betrifft aber auch ziemlich locker zu. Da ist bei weitem auch nicht alles bis ins Detail festgelegt und ähnlich locker würde ich das hier auch aufziehen wollen.

    Und schau was dabei rausgekommen ist. Auch wenn es volkard völlig grossgekotzt rübergebracht hat, hat er trotzdem recht. Die Regeln waren ungenau und mussten angepasst werden. Ein Wettbewerb ohne genaue Regeln macht keinen Spass, da man nicht weiss, worauf man nun genau achten soll. Für einen Wettbewerb müssen unbedingt ganz klare Regeln und Rahmenbedingungen aufgestellt werden. Auch wenn du den Wettbewerb noch so locker halten willst. Sonst macht es einfach keinen Spass ... oder du nennst es nicht Wettbewerb 😉

    Grüssli



  • Das Band ist in beiden Richtungen unendlich, oder können wir es auf große Werte einschränken (0 .. 1024*1024*1024) etc.
    Soll ein Feld ein int oder ein byte beinhalten?



  • Ich bin es gewohnt, daß das Band eine feste Größe hat, mindestens 30000 Zellen. Daß auf dem Band ganz links begonnen wird. Und daß ein Feld mindestens 16 Bit hat.
    Was passiert, wenn man Bandgrenzen überschreitet oder den Wertebereich von 16 Bit überschreitet oder Werte außerhalb des ASCII-Bereichs ausgibt, ist undefiniert.
    Ich denke, das käme auch der AUfgabenstellung entgegen.



  • 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