** Brainfuck Interpreter Contest ** [abgeschlossen]


  • Administrator

    hustbaer schrieb:

    Falls jemand von euch Zeit & Lust hat weitere Test-Cases zu schreiben, z.B. auch welche die gezielt auf bestimmte Rahmenbedingungen checken, wäre ich sehr froh.

    RunTest("Krank", "+" + new String('[', 524287) + "-" + new String(']', 524287), "", "");
    

    🤡

    Grüssli

    PS: Mist, mein aktuelles Programm übersteht den Test nicht 😃



  • hustbaer schrieb:

    Falls sich genügend Leute für eine dahingehende Änderung aussprechen, hab ich kein Problem damit die Regeln nachträglich in diesem Punkt anzupassen.

    Dann schreib noch dazu, dass byte als Zahlentyp auch in Ordnung ist, weiter als 255 wird wohl kaum ein Programm jemals zählen. Und 2^16 Zellen sind doch völlig übertrieben! 640 cells ought to be enough for anybody.



  • TyRoXx schrieb:

    hustbaer schrieb:

    Falls sich genügend Leute für eine dahingehende Änderung aussprechen, hab ich kein Problem damit die Regeln nachträglich in diesem Punkt anzupassen.

    Dann schreib noch dazu, dass byte als Zahlentyp auch in Ordnung ist, weiter als 255 wird wohl kaum ein Programm jemals zählen. Und 2^16 Zellen sind doch völlig übertrieben! 640 cells ought to be enough for anybody.

    Ist wie beim richtigen Programmieren.
    Um auf die Verschachtelungstiefe zu kommen, muß Du hier 99 mal eine Schleife schreiben. Also 99 verschachtelte Schleifen muß der Programmierer reingeschrieben haben. ++[->[[+,.->[[ und so weiter bis 99, aber nicht wieder ] dazwischen. Das entspräche auch 99 Funktionen, die sich gegenseitig aufrufen. Das habe ich noch nicht erlebt.
    Das hat überhaupt nichts zu tun mit einem kleinen Zahlentyp, den kann ich mit einfachen Schleifen sprengen. Ebenso die Feldgröße.

    Die 2^19-Forderung verhindert effektiv, daß man rekursive Ansätze verwenden kann, also den BF-Stack auf den uns zur Verfügung stehenden Maschinbenstack abbildet. So, wie wir den BF-Speicher auf unseren Maschinenspeicher leicht abbilden können, der wurde ja nicht umsonst auf so wenig beschränkt.



  • volkard schrieb:

    Die 2^19-Forderung verhindert effektiv, daß man rekursive Ansätze verwenden kann, also den BF-Stack auf den uns zur Verfügung stehenden Maschinbenstack abbildet. So, wie wir den BF-Speicher auf unseren Maschinenspeicher leicht abbilden können, der wurde ja nicht umsonst auf so wenig beschränkt.

    Das stimmt, daran hab' ich nicht gedacht.

    Was schreiben denn andere Sprach-Standards für minimale Callstack-Tiefe vor, z.B. der C oder C++ Standard?



  • Hmm, ich bin noch nicht richtig überzeugt. Es gibt unendlich viele Möglichkeiten, ein ineffizientes Programm zu schreiben, und die rekursiven Schleifen mit dem eingebauten stack overflow sind nur eine davon.
    Wenn überhaupt sollte das Verschachtelungslimit höher liegen, mindestens bei 2^10. Das müsste C# doch schaffen, oder?



  • hustbaer schrieb:

    µ schrieb:

    Stellst Du noch ein Testsystem für die Rahmenbedingungen zur Verfügung?

    Falls ich Zeit habe.
    Ist aber schwierig auch nur ne halbwegs gute Testabdeckung zusammenzubekommen. Je nach Code könnte es vorkommen dass nur eine bestimmte Kombination aus Faktoren das Fehlverhalten triggert. Und alle Kombinationen aus Bandposition/Programmposition/Schleifen-Schachteltiefe/Zellenwert abzudecken ist so-gut-wie unmöglich (und auf jeden Fall unpraktikabel).

    Es geht um die Rahmenbedingungen und ich hätte mir das so vorgestellt: Aus z.B. Volkards "Sieben"-Progrämmchen baut man zur Laufzeit mit dem Stringbuilder ein Programm mit >= 2^20 Zeichen.
    Die Verarbeitung des char Zeichensatzes prüft man, indem man jedes nicht-Bf Zeichen in ein anderes Programm einbaut. Bleiben die Negativen Bandsymbole. Da reicht eigentlich ein kleiner Zähler: -[+]+++++++++++++++++++++++++++++++++++++++++++++++++.
    Hier muss '1' rauskommen. Wenn '0' da steht hat man die Schleifenbedingung nur für Zahlen >= 0 korrekt geprüft und die negativen Zahlen vergessen. So wie ich vorhin.

    Ich kann am Sonntag vielleicht was bauen und dann hier veröffentlichen.



  • TyRoXx schrieb:

    Wenn überhaupt sollte das Verschachtelungslimit höher liegen, mindestens bei 2^10. Das müsste C# doch schaffen, oder?

    C# wirft bei 12k oder 13k rekursiven Aufrufen ohne Übergabeparameter eine StackOverflowException. Zumindest auf meinem System.

    Ich schließe mich an: Im Sinne rekursiver Funktionen sollten wir die Verschachtelungstiefe auf 1024 begrenzen.



  • hustbaer schrieb:

    Was schreiben denn andere Sprach-Standards für minimale Callstack-Tiefe vor, z.B. der C oder C++ Standard?

    C++
    Nesting levels of compound statements, iteration control structures, and selection control structures [256].
    Nesting levels of parenthesized expressions within a full-expression [256].



  • TyRoXx schrieb:

    Hmm, ich bin noch nicht richtig überzeugt. Es gibt unendlich viele Möglichkeiten, ein ineffizientes Programm zu schreiben, und die rekursiven Schleifen mit dem eingebauten stack overflow sind nur eine davon.

    Aber [ und ] müssen zueinanderpassen, wie { und } oder ( und ) in C#. Wo kannst Du Dir in einem C#-Programm mehr als 99 Verschachtelungen von () oder {} denken? WOhlgemerkt, daß wären welche, die der Programmierer alle getippt hat! Es hat nichts damit zu tun, daß man tiefe "rekursive Schleifen" programmieren kann.

    Hier geht es nur um die Frage, wie tief ein Compiler absteigen können muß, um ein Stück Code zu verarbeiten.

    TyRoXx schrieb:

    Wenn überhaupt sollte das Verschachtelungslimit höher liegen, mindestens bei 2^10. Das müsste C# doch schaffen, oder?

    Ja, egal. 2^10, 2^8, 99, es ist praktisch kein Unterschied. Wenn man einen Wert davon schafft, hat man es vermutlich so allgemein programmiert, daß es leicht für andere Werte umgefrickelt werden kann.



  • OK.
    Dann würde ich 256 vorschlagen.


  • Administrator

    hustbaer schrieb:

    Dann würde ich 256 vorschlagen.

    Habe ich nichts dagegen. Ist aber natürlich blöd, während dem laufenden Contest noch Änderungen nachzureichen. Aber gut ... so extrem schlimm auch wieder nicht, ist ja auch nicht ein extrem wichtiger Contest 😃

    Grüssli



  • Ja, ist doof. Andrerseits ist das Argument von volkard gut, dass man in C# auch keine Callstack-Tiefe von 1<<19 hinbekommt.

    Ich warte einfach noch was die anderen Teilnehmer schreiben.

    Die anderen von TyRoXx vorgeschlagenen Änderungen mach' ich auf jeden Fall nicht, die wären etwas zu krass.



  • hustbaer schrieb:

    Die anderen von TyRoXx vorgeschlagenen Änderungen mach' ich auf jeden Fall nicht, die wären etwas zu krass.

    Die sind vor allem nicht ernst gemeint.



  • @hustbaer
    Hast Du mal geprüft ob deine 227 den Anforderungen stand hält? Speziell auch das kleine Programm in diesem Beitrag: http://www.c-plusplus.net/forum/p2116925#2116925



  • verschachtelte Schleifen muß der Programmierer reingeschrieben haben

    Nein, muss er nicht. Programme koennen auch generiert werden. Gerade bei so einer einfachen Sprache wie Brainfuck.

    Das habe ich noch nicht erlebt.

    Ich habe mir generierten Quelltext angesehen, bei dem es so war.

    Ich kann mir denken, warum ihr ueber die Stacktiefe heult. Nun dann funktioniert eben der Rekursionstrick nicht. Ich habe mal schnell einen Brainfuck-Interpreter in C++ geschrieben und er kommt ohne Rekursion aus und kann mit dem Extrembeispiel von Dravere problemlos umgehen.

    Und warum soll hier 1 rauskommen?

    -[+]+++++++++++++++++++++++++++++++++++++++++++++++++.
    


  • @knivil
    Die bisherigen Lösungen können auch mit extremer Verschachtelung umgehen. Es geht darum, rekursive Lösungen zu ermöglichen. Bringen wirds imho aber nichts. Funktionssignaturen sind zu "verbose".



  • knivil schrieb:

    Und warum soll hier 1 rauskommen?

    -[+]+++++++++++++++++++++++++++++++++++++++++++++++++.
    

    ASCII 49 = '1'

    Es ist ein simpler Test, ob man die Schleifenbedingungen für negative Zahlen abgefangen hat.



  • knivil schrieb:

    Das habe ich noch nicht erlebt.

    Ich habe mir generierten Quelltext angesehen, bei dem es so war.

    Wozu hat der so viele Blöcke verschachtelt?



  • Keine Ahnung, frag doch die von der modellgetriebenen Softwareentwicklung. Und ich denke mit Templates in C++ kriege ich das auch hin.



  • knivil schrieb:

    Und ich denke mit Templates in C++ kriege ich das auch hin.

    Ja, 1000 Funktionen kriegt man hin.
    Wie mir gerade auffällt, erhöhen die nicht den Stackbedarf des Compilers, wie es 1000 Blocks tun würden.

    knivil schrieb:

    Keine Ahnung, frag doch die von der modellgetriebenen Softwareentwicklung.

    1000 Funktionen, ok. Nicht 1000 Blocks.

    edit: Vielleicht 1000 verschachtelte if-Verzeigungen.

    if(n%2!=0) 
        if(n%3!=0) 
            if(n%5!=0) 
    ... 
                                 ...if(n%65537!=0) 
                                        cout<<n<<" ist eine Primzahl.\n";
    

Anmelden zum Antworten