** Brainfuck Interpreter Contest ** [abgeschlossen]
-
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, 356345.. 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?
-
Du musst dich um garnichts kümmern.
-
µ schrieb:
P.S. Nur um sicher zu gehen. Du entfernst keine Leerzeichen, die für eine korrekte Syntax notwendig sind, oder?
Nein, natürlich nicht.
Und du deprimierst mich hier gerade...
-
KasF schrieb:
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!?Darum kümmert sich die Konsole.EDIT: Ich Koffer
Hatte die Frage falsch verstanden.
Ja, wie du schon als 2. Option vorgeschlagen hast: das ist die Aufgabe des Brainfuck-Programms. Das setzt natürlich voraus, dass das Brainfuck-Programm und "die Implementierung" sich einig über den verwendeten Zeichensatz sind. Ist aber für die meisten Programme kein Thema, da man sich einfach auf die Zeichen <= 127 beschränkt, die fast überall gleich sind.
Du bekommst auf jeden Fall von der Funktion S.R() "passende" Werte zurück, die du so direkt in den "Band" reinschreiben kannst. Es muss nix umgerechnet/angepasst/... werden.
Bei der Ausgabe dann genau so: du rufst einfach S.W() auf, mit dem Wert der gerade auf "dem Band" steht. Ohne irgendwas umzurechnen.
----
Das "Primes" Programm macht das auch ganz korrekt, also den Textuellen Input in eine Zahl umzurechnen.
Bloss eins muss dabei passen: die Eingabe muss mit "\n" abgeschlossen werden, und NICHT mit dem Windows-typischen "\r\n". Das Test-Programm übergibt bei den automatisierten Tests sowieso passende Strings, und die ebenfalls enthaltene Klasse "InteractiveSystem" "filtert" die "\r" raus, damit man auch unter Windows interaktive Tests machen kann (wenn man das möchte)./EDIT
-
hustbaer schrieb:
Und du deprimierst mich hier gerade...
Das macht es spannend. Aber wage es nicht mit <=242 anzurücken.
-
Mal sehen...
-
µ schrieb:
243
Ja, auch.
Lustigerweise mit zwei ganz verschiedenen Ansätzen.
-
Ich musste eins meiner liebsten Babys opfern
- aber was solls, geht nich anders.
Dafür ist ein neues Baby hinzugekommen, das zwar nicht so kuhl, dafür aber richtig dreckig ist
(Bzw. sogar 2, aber eins davon ist kaum der Rede wert)Interpreter_5_1252.cs, 238 Zeichen
SHA-256 = f642dbd4bb1478956803e2e4e2dea5487a661f0a6255039289b92b54e76d1712
An alle die sich wundern warum ich noch mitmache: erstmal geht's ja um nix ausser der Ehre, und dann hat auch noch keiner ausser µ ganz zu Anfang was abgegeben...
Aber wie gesagt, wer mag kann mich jederzeit ausser Konkurrenz sehen. Schätze ich werde mich mit nem .5 Rang in die Wertung einschummeln
(Im Moment wäre das Platz 0.5, also los, strengt euch an!)
-
Nochwas, Leute...
Hat keiner Lust uns ein paar weitere Test-Cases zu ergoogeln?Irgendwie hab' ich ja im Moment nur einen "echten" Test-Case, das "Primes" Programm. Das ist zwar ordentlich gross, aber ich fände es besser wenn wir mehr hätten.
Und wenn's nur deswegen ist, weil es lustiger anzusehen ist je mehr ganz verschiedene Test-Cases durchgemacht werden.
-
1. Du kannst ja das Programm mit den Quadratzahlen noch als Testcase nehmen. Bei Gelegenheit werde ich mal nach weiteren suchen.
2. Du frustrierst mich nun zum dritten mal.