** Brainfuck Interpreter Contest ** [abgeschlossen]



  • David W schrieb:

    Geht es bei dem Contest wirklich darum auf Biegen und Brechen den kompaktesten Code zu erstellen?
    Auch wenn die Lesbarkeit drunter Leidet?
    Ich finde das falsch, Die Länge des Codes ist eigentlich das uninteressanteste an Codes, Eleganz, Erweiterbarkeit und Lösungsansätze sind da viel angemessener.

    (Ich mache zwar nicht mit, aber lese hier hin und wieder und wunderte mich schon mehrfach das die Länge scheinbar das Wichtigste ist)

    Der Contest ist halt so ausgerichtet, dass der kürzeste gewinnt. Das ist etwas, das man eindeutig bewerten kann. Außerdem ist es 1337 🤡
    Und hey, wie soll man denn bitte Eleganz und Erweiterbarkeit bewerten? Ist Rekursion eleganter als Iterativ? usw. usw.



  • 298 ...



  • Bashar schrieb:

    1. finde ich es angemessen, dass ein BF-Interpreter selbst aussieht wie BF

    C# != BF 😉

    Bashar schrieb:

    2. wurde BF mit dem expliziten Ziel entwickelt, möglichst kleine Compiler zu ermöglichen.

    Was hat das mit dem Contest zu tun? Das .Net Framework ist erlaubt, und der ist nicht gerade klein.

    GPC schrieb:

    Der Contest ist halt so ausgerichtet, dass der kürzeste gewinnt.

    Finde ich schade. Da gewinnt am Ende der der am rafiniertesten Kurzen Code zusammen bastelt, nicht wer gut entwickelt.

    GPC schrieb:

    Das ist etwas, das man eindeutig bewerten kann

    Wenn es Mehrere Codes gibt die Qualitativ gleichwertig zu beurteilen sind wird es natürlich schwerer. Aber nicht unmöglich.

    GPC schrieb:

    Und hey, wie soll man denn bitte Eleganz und Erweiterbarkeit bewerten?

    Wenn ich die Code vor die Nase setze die nicht Testbar ist, die alles von oben nach unten runter fummelt und dabei total unsicher ist wirst du es sehr leicht von Code unterscheiden können der generell mehr Objekt Orientiert (Mit guter Hierarchie dann auch erweiterbar) ist, sicherer und Testbar.

    GPC schrieb:

    Ist Rekursion eleganter als Iterativ? usw. usw.

    Da gibt es kein ja oder nein, sondern das entscheidet man danach wie die Lösungen aussehen.

    Der Code wird zum Beispiel Länger wenn die Eingaben noch Validiert werden, wenn es eine Fehlerbehandlung gibt und dann eine angemessene Fehlermeldung angezeigt wird. Ich vermute das die kurzen Codes die hier gebaut werden einfach um die Ohren fliegen wenn mal eine Fehleingabe auftritt.



  • @David
    Wir haben Spaß an der Sache und dein Geheule ist hier fehl am Platz

    _____            ____     _____
         \          /    \ µ /
          \        /      \_/  <--- 228
           \      /        
            \____/
    
    FFFFFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU...........
    


  • http://weblogs.asp.net/ralfw/archive/2005/09/18/425474.aspx << die hatten auch Spaß, und da wurde nicht die Kürze bewertet 😉



  • DavidW, du gehst bestimmt auch zum Seifenkistenrennen und beschwerst dich, dass keine Airbags eingebaut sind.

    David W schrieb:

    Bashar schrieb:

    1. finde ich es angemessen, dass ein BF-Interpreter selbst aussieht wie BF

    C# != BF 😉

    Außer dass mehr als 8 Zeichen signifikant sind ... 😉

    Bashar schrieb:

    2. wurde BF mit dem expliziten Ziel entwickelt, möglichst kleine Compiler zu ermöglichen.

    Was hat das mit dem Contest zu tun?

    Das ist, außer dass es um Interpreter und nicht Compiler geht, der Inhalt des Contests.



  • Mit David W zu diskutieren macht ca. genau so viel Sinn wie zu versuchen blurry333 etwas beizubringen.

    Ignoriert ihn also bitte einfach, sonst artet das ganz schnell in eine endlose Diskussion aus, von der im Endeffekt genau gar niemand was hat. Nicht wir, nicht er, und ganz sicher nicht der Rest der Welt.



  • GPC schrieb:

    hustbaer schrieb:

    Und über Reflection sind die nicht optional?

    Ne, eben nicht. Die Vorgabe nur ein Parameter beißt sich aber eh mit "Die genaue Signatur der Funktion ist dabei nicht vorgeschrieben" :p

    Jain.
    Die genaue Signatur ist nicht vorgeschrieben heisst z.B. dass du die Funktion gerne virtual machen darfst oder unsafe oder sowas.

    Allerdings... wenn es in C# optionale Parameter gibt... OK, soll mir recht sein.
    Zeig mir einfach wie ich den Aufruf im Testsystem umschreiben soll.



  • hustbaer schrieb:

    GPC schrieb:

    hustbaer schrieb:

    Und über Reflection sind die nicht optional?

    Ne, eben nicht. Die Vorgabe nur ein Parameter beißt sich aber eh mit "Die genaue Signatur der Funktion ist dabei nicht vorgeschrieben" :p

    Jain.
    Die genaue Signatur ist nicht vorgeschrieben heisst z.B. dass du die Funktion gerne virtual machen darfst oder unsafe oder sowas.

    Allerdings... wenn es in C# optionale Parameter gibt... OK, soll mir recht sein.
    Zeig mir einfach wie ich den Aufruf im Testsystem umschreiben soll.

    Aus

    class TestSession<Interpreter> where Interpreter : new()
    

    muss

    class TestSession<Interpreter> where Interpreter : I, new()
    

    werden. Das setzt dann halt voraus, dass jede Interpreterklasse auch "I" heißt.

    Und aus dem Aufruf selbst wird einfach:

    void RunTest(string name, string program, string input, string expectedOutput) {
        System.Console.Write("Running test {0}...", name);
    
        bool fail = false;
        SimulationSystem system = new SimulationSystem(program, input);
    
        var interpreter = new Interpreter();
        interpreter.Run(system);
        if (system.GetConsumedLength() != input.Length)
        {
                if (!fail)
                        System.Console.WriteLine(" FAILED:");
                System.Console.WriteLine("  Consumed input mismatch:");
                System.Console.WriteLine("    expected: {0}", input.Length);
                System.Console.WriteLine("    found:    {0}", system.GetConsumedLength());
                fail = true;
        }
    
        if (system.GetOutput() != expectedOutput)
        {
                if (!fail)
                        System.Console.WriteLine(" FAILED:");
                System.Console.WriteLine("  Output mismatch:");
                System.Console.WriteLine("    expected: [{0}]", FormatString(expectedOutput));
                System.Console.WriteLine("    found:    [{0}]", FormatString(system.GetOutput()));
                fail = true;
        }
    
        //Der Rest wie gehabt
    


  • @GPC
    Öh 🙂

    Dann kann ich Klasse ja gleich zu einer normalen Klasse machen, und gut is.
    Der Grund warum das Ding überhaupt ein Generic ist, ist, damit man ggf. mehrere verschiedene Implementierungen in einem Aufwaschen damit testen kann.

    Geht das nicht auch anders? Muss ja irgendwie.

    Ich hatte erst einfach ein "dynamic" drinnen, bloss das frisst ideone.com wieder nicht, weil man dafür irgendwelche zusätzlichen Assemblies referenzieren müsste.



  • Mein Ansatz ist sowas von am Ende. Da ist einfach nichts mehr rauszuholen.

    @hustbaer
    Multiplizierst Du dreimal in deinem Code?

    Was ich nicht alles ausprobiert habe. Auch try-catch-Blöcke als Kontrollstrukturen. Interessant: i<S.P.Length ist gleichlang wie try{}catch{}. Man kann den Code also in eine Exception laufen lassen. Bring nur nix weil der Block die Schleife umschließt. Nur in der Schleife hätte ich noch einen Vorteil davon. Kontrollierte Divisionen durch 0 oder so. Alles verrückt.



  • µ schrieb:

    Mein Ansatz ist sowas von am Ende. Da ist einfach nichts mehr rauszuholen.

    @hustbaer
    Multiplizierst Du dreimal in deinem Code?

    Hattest du mal ein < 2 wo jetzt ein == 1 steht?



  • Nein aber die 2 spielt auch eine Rolle 😃



  • Ok Du willst das nicht beantworten. Wie wärs damit. Kommen die 31 und 17 vor?



  • Ach, ich kann das schon beantworten. Es kommen keine 3 Multiplikationen vor, und bei 31 und 17 wüsste ich auch nicht wozu ich die bräuchte. Macht mich jetzt neugierig.

    Aber wir sollten hier nicht allzuviel verraten - auch nicht indirekt über Fragen. Schliesslich machen auch andere noch mit, und der Contest läuft ja noch ne Woche.



  • Ist klar. Immerhin weiß ich jetzt, dass wir verschiedene Ansätze haben. Und ich befürchte gerade, Du findest raus was es mit meinen Tricks auf sich hat 😉



  • Ich mache nicht mit, kann also ab-schreibbare Tipps geben die vielleicht allen was nützen:

    Ein kleines Feature von c# sind using "Abkürzungen".
    Also falls ihr mehr als 7 mal int verwendet, ist es kürzer Einmal am Anfang
    using i=Int32; zu schreiben und stattdessen wie bei typedef 's i zu nehmen.
    Leider geht das nicht mit primitiven Typen und der Overhead bei Byte erst nach 5 Vorkommen ausgeglichen. Je nach dem ob ihr String oder Stringbuilder häufiger verwendet bringt es das möglicherweise was.

    Möge der bessere kürzeste obfuscateste Code gewinnen.
    Falls ich auch nur einem geholfen habe, wars mir was Wert.



  • µ schrieb:

    Ist klar. Immerhin weiß ich jetzt, dass wir verschiedene Ansätze haben. Und ich befürchte gerade, Du findest raus was es mit meinen Tricks auf sich hat 😉

    Ja, hab isch schon rausgefindet, aber mehr zufällig als sonst was.
    Und ich schätze dass die Sache mit 17 und 31 dich mehr kostet als es dir bringt 😉
    Ich hab' mich auch schon mehr als 1x über meine eigenen Vorgaben geärgert.

    Andrerseits macht es die Sache wieder interessant wenn gewisse Abkürzungen nicht möglich sind, bzw. nur mit zu hohen Kosten.

    EDIT: ne, muss mich korrigieren, das was ich dachte kanns kaum sein. Egal, sehen wir dann ja in ein paar Tagen. /EDIT



  • Rhombicosidodecahedron schrieb:

    Ein kleines Feature von c# sind using "Abkürzungen".
    Also falls ihr mehr als 7 mal int verwendet, ist es kürzer Einmal am Anfang
    using i=Int32; zu schreiben und stattdessen wie bei typedef 's i zu nehmen.

    Interessant, wenn auch für diesen Contest unbrauchbar.
    Es muss nämlich using i=System.Int32; heissen - using System; ist nicht "vorgegeben" oder "gratis" 😉

    Je nach dem ob ihr String oder Stringbuilder häufiger verwendet bringt es das möglicherweise was.

    Ich bezweifle stark dass jmd. so viele Zeichen zu verschenken hat 😉

    Trotzdem danke für den Tip, denn dieses Feature ist mir neu, und vielleicht finde ich ja mal Verwendung dafür - auch wenn ich kaum zum C# Programmieren komme.



  • using M=System.Math war für die Sign-Funktion verlockend. Hat sich aber nicht rentiert. Nix aus dem Framework bringt mir was. 😕

    Was manche Leute so als quick&dirty bezeichnen: http://stackoverflow.com/questions/3198615/wrote-a-quick-and-dirty-brainfuck-interpreter-what-could-i-do-better

    😃


Anmelden zum Antworten