** Brainfuck Interpreter Contest ** [abgeschlossen]



  • Dravere schrieb:

    Ich habe nachwievor eine Idee mit unsafe, bisher aber gewartet, bis es erlaubt wird. Wenn ich dann mal genügend Zeit finde, werde ich der Idee nachgehen.

    Ich glaube nach wie vor dass es nix bringen wird, aber vielleicht täusche ich mich ja.

    Es ist unglaublich, was für hässlichen aber funktionierenden Code man sogar in C# schreiben kann 😃

    Hihi, ja.
    Das wahre Ausmass werden wir vermutlich aber erst sehen, wenn die Ergebnisse veröffentlicht werden 🙂



  • Hätte auch nicht gedacht, dass ich ma bool <-> int casts, Komma-Operator und richtigen Präprozessor vermisse 😉



  • µ schrieb:

    Lambdas dürfen nicht rekursiv sein 👎

    Man kann es ein bisschen hinfaken:

    Func<long, long> faculty = null;
    faculty = (n) => n == 1 ? 1 : n * faculty(n - 1);
    

    Es geht auch mit echter Rekursion (und viel Schreibaufwand, daher gerade hier unpraktikabel): http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx



  • Ich bin bei 253 Zeichen, aber bei den Primzahlen verursache ich 'ne Endlosschleife 😃 /o\ (crappy doppelt verschachtelte bf-schleifen)
    Ist hinfällig, da der Makrocode falsch gezählt hat 🙂 I don't like mondays.

    Edit:
    Btw, wer's noch nicht hat: Ein Makro um die Anzahl zeichen in VS zu bestimmen:

    Option Strict Off
    Option Explicit Off
    Imports System
    Imports EnvDTE
    Imports EnvDTE80
    Imports EnvDTE90
    Imports EnvDTE90a
    Imports EnvDTE100
    Imports System.Diagnostics
    
    Public Module CountNonWhiteSpaceCharacters
        Sub Count()
            Dim selection As EnvDTE.TextSelection = DTE.ActiveDocument.Selection()
            Dim text As String = selection.Text
    
            text = text.Replace(" ", "")
            text = text.Replace(vbCrLf, "")
            text = text.Replace(vbTab, "")
    
            MsgBox("Count " + text.Length.ToString())
        End Sub
    End Module
    


  • Bin bei 250



  • @GPC
    Das Makro killt aber notwendige Leerzeichen. int i = 0 wird zu inti=0;



  • µ schrieb:

    @GPC
    Das Makro killt aber notwendige Leerzeichen. int i = 0 wird zu inti=0;

    Stimmt, das ist doof. Na ja, das kann man ja leicht anpassen 🙂



  • 248 🤡



  • Test für verschachtelte Schleifen. Quadratzahlen bis 10k. Irgendwo gefunden.

    ++++[>+++++<-]>[<+++++>-]+<+[
    >[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+
    >>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]
    <<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-]
    

  • Administrator

    GPC schrieb:

    µ schrieb:

    @GPC
    Das Makro killt aber notwendige Leerzeichen. int i = 0 wird zu inti=0;

    Stimmt, das ist doof. Na ja, das kann man ja leicht anpassen 🙂

    Ich habe mir kurz ein hässliches Hilfswerkzeug mit dem Namen Stomp in C# geschrieben. 😃
    Hier der hässliche Algorithmus zum verkleinern:

    string Stomp(string text)
    {
      var regex = new Regex(@"\s+");
    
      text = regex.Replace(text, " ");
      text = text.Replace("\r\n", " ");
      text = text.Replace('\n', ' ');
    
      for(int i = 0; i < text.Length; ++i)
      {
        if(text[i] == ' ' && ((i > 0 && !Char.IsLetter(text[i - 1])) ||
           (i < (text.Length - 1) && !Char.IsLetter(text[i + 1]))))
        {
          text = text.Remove(i, 1);
          --i;
        }
      }
    
      return text;
    }
    

    Funktioniert erstaunlich gut 🙂

    Grüssli



  • hustbaer schrieb:

    Es sollen Brainfuck-Interpreter verglichen werden, und nicht nach Wegen gesucht werden wie man das Testsystem bescheissen kann. Beiträge die versuchen das Testsystem über z.B. Reflection zu bescheissen werden disqualifiziert.
    (Ich könnte natürlich stattdessen das Testsystem soweit absichern dass es nicht mehr möglich ist zu bescheissen, aber das ist mir ehrlich gesagt zu viel Aufwand.)

    🙂



  • µ schrieb:

    Ich stehe noch bei 267.

    😮 😮 😮
    Ich hab's auch mal probiert. Ich stehe bei 462.



  • Nich all zu hübsch, und deckt sicher ein paar Spezialfälle nicht ab, aber funktioniert OK.
    (z.B. den "Spezielfall" Kommentare :D)

    Option Strict On
    Option Explicit On
    Imports System
    Imports EnvDTE
    Imports EnvDTE80
    Imports EnvDTE90
    Imports EnvDTE90a
    Imports EnvDTE100
    Imports System.Diagnostics
    Imports System.Text.RegularExpressions
    
    Public Module BrainfuckContest
    
        Public Function FindOutputWindowPane(ByVal paneName As String) As OutputWindowPane
            FindOutputWindowPane = Nothing
            Dim win As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
            Dim ow As OutputWindow = CType(win.Object, OutputWindow)
            For Each owPane As OutputWindowPane In ow.OutputWindowPanes
                If owPane.Name.Equals(paneName) Then
                    FindOutputWindowPane = owPane
                    Exit For
                End If
            Next
        End Function
    
        Public Sub WriteToOutputWindow(ByVal paneName As String, ByVal message As String)
            Dim owPane As OutputWindowPane = FindOutputWindowPane(paneName)
    
            If owPane Is Nothing Then
                Dim win As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
                Dim ow As OutputWindow = CType(win.Object, OutputWindow)
    
                owPane = ow.OutputWindowPanes.Add(paneName)
            End If
    
            owPane.Activate()
            owPane.OutputString(message + vbCrLf)
        End Sub
    
        Public Function Stomp(ByVal text As String) As String
            Dim regex As Regex = New Regex("\s+")
    
            text = regex.Replace(text, " ")
            text = text.Trim()
            text = "+" + text + "+"
    
            Dim i As Integer = 1
    
            While i < (text.Length - 1)
                Dim remove As Boolean = False
    
                If Char.IsWhiteSpace(text(i)) Then
                    If Not Char.IsLetterOrDigit(text(i - 1)) Or Not Char.IsLetterOrDigit(text(i + 1)) Then
                        remove = True
                    End If
                End If
    
                If remove Then
                    text = text.Remove(i, 1)
                Else
                    i = i + 1
                End If
            End While
    
            text = text.Substring(1, text.Length - 2)
    
            Stomp = text
        End Function
    
        Public Sub InofficialCount()
    
            Dim selection As EnvDTE.TextSelection = CType(DTE.ActiveDocument.Selection, EnvDTE.TextSelection)
    
            If String.IsNullOrEmpty(selection.Text) Then
                selection.SelectAll()
            End If
    
            Dim text As String = Stomp(selection.Text)
    
            WriteToOutputWindow("Brainfuck Contest", text)
            WriteToOutputWindow("Brainfuck Contest", "(Length = " + text.Length.ToString() + ")" + vbCrLf)
    
        End Sub
    
        Public Sub PossiblyCorrectFormat()
    
            Dim selection As EnvDTE.TextSelection = CType(DTE.ActiveDocument.Selection, EnvDTE.TextSelection)
    
            If String.IsNullOrEmpty(selection.Text) Then
                selection.SelectAll()
            End If
    
            Dim text As String = Stomp(selection.Text)
    
            selection.Delete()
            selection.Insert(text)
    
        End Sub
    
    End Module
    

    Zur Verwendung muss das VB-File in in der Macro-IDE anscheinend in "BrainfuckContest" umbenannt werden, sonst zeigt er die Funktionen nicht an. Warum auch immer.
    Falls jmd. Verbesserungen hat bitte posten 🙂



  • µ schrieb:

    248 🤡

    Gut, 1x kann ich noch drunter.

    247



  • Ach ne, sorry, doch nur 245 🤡



  • Oder doch nur...

    Interpreter_4_1252.cs, 244 Zeichen:

    SHA-256 = 8bcb2287ac504e8ba27ae40b1857ba5deaa7819ad7ad66b64158094279dd027d



  • hustbaer das darf ja wohl nicht wahr sein. Es hat mir körperliche Schmerzen bereitet unter 249 zu kommen und jetzt das 😃

    Holy shit. 5 weitere Zeichen einsparen 😮

    P.S. Nur um sicher zu gehen. Du entfernst keine Leerzeichen, die für eine korrekte Syntax notwendig sind, oder?



  • Fett 😃 Ich hab jetzt meinen Bug gefixt, bin aber wieder bei 379, 368, 356 345.. fail... ich muss mir was schlaueres für die Schleifen überlegen.



  • 243



  • Ne Frage zum Primzahlenprogramm:
    Wenn vom Simulationsystem die 1 beim Aufruf von Primes1 eingelesen wird, dann wird ja 49 zurückgegeben. Muss ich mich jetzt drum kümmern, das daraus ne 1 wird!? Oder ist das Aufgabe des Brainfuck-Programs?


Anmelden zum Antworten