Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1032to1036
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Brainfuck Code umsetzen in Vba-Code
25.12.2008 18:17:00
Reinhard

Hallo Wissende,
Brainfuck Code sieht so aus:
>++++++++++[-]++++++[-].>++[-].>+++[-]+++[-]+++[-].>++[-].>++++[-]++++ usw.
Wobei nur diese acht Regeln gelten:
> Inkrementiert den Zellzeiger, quasi Activecell.offset(0,1)
 http://de.wikipedia.org/wiki/Brainfuck
_

In dieser Mappe:  https://www.herber.de/bbs/ _
user/57879.xls
 steht in Tabelle4!A1 der umzusetzende BF-Code.
Im Modul7 steht die Prozedur Brainfuck() die in Tabelle4 ab Zeile 4 aus dem BF-Code eine Vba- _
Prozedur erstellen soll.
Leider stimmt mein Code nicht, ab Zeile 169 in Tabelle4 sieht man das, ab da stimmen die Zeilen  _
in A und B nicht mehr überein.
Dabei bin ich nicht mal sicher ob mein Code der die Einträge in Spalte b erzeugt richtig ist.
Nehme ich nun den in Tabelle4 stehenden Code und lasse ihn in einem Modul (Modul1) laufen so  _
kommt der Debugger beim ersten Auftreten von:
ActiveCell.Value = InputBox("Ein Zeichen eingeben")
Ausgabe = Ausgabe & ActiveCell.Value
ActiveCell.Value = ActiveCell.Value + 2
und meckert "ActiveCell.Value = ActiveCell.Value + 2" an, was ja richtig ist, ich habe ja einen  _
Buchstaben eingegeben.
ABER, die Abfolge
ActiveCell.Value = InputBox("Ein Zeichen eingeben")
Ausgabe = Ausgabe & ActiveCell.Value
ActiveCell.Value = ActiveCell.Value + 2
wollte ich ja gar nicht haben beim Erzeugen von Makrocode in den Zellen von Tabelle4, da ist  _
irgendwie der Fehler und wie Tabbel4 und Modul7 erahnen lassen, hab ich da schon reichlich Stunden dran verbraten :-(
Das einzige was ich noch von diesem BF-Code weiß, für meine Anfrage hier nicht wichtig,  _
angeblich überprüft er die Eingaben und wenn die Eingaben zusammen das richtige "Wort" ergben wird "Correct" ausgegeben, ansonsten "Wrong"
Meine Versuche, durch Erraten die richtige Eingabe zu ermitteln scheiterten hier:
 http://koti.mbnet.fi/villes/php/bf.php
_

Gruß
Reinhard


6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Teilproblematik gelöst
26.12.2008 19:53:58
Reinhard
Hallo Rätselinteressierte,
jetzt wird der BF-Code fehlerlos in Vba-Code umgesetzt.
Naja, der fertige Code klappt noch nicht, eher gar nicht.
Mal landet er in einer Endlosschleife, mal (Eingaben 1 2 3 4 5) nicht.
Das liegt jetzt aber mit auch daran daß ich nicht genau weiß wie ich die Eingabe eines Zeichens umsetzen soll, anschließend die Ausgabe.
Geschweige denn wie ich dann herausfinde wie die Eingaben aussehen müssen daß am Ende "Correct" erscheint und nicht "Wrong"
Hat jmd. da noch Ideen? Mir gehen sie langsam aus :-(
Hier die Datei: https://www.herber.de/bbs/user/57893.xls
Nachfolgend mein Cde zur Erstellung des BF-Codes.
Danke ^ Gruß
Reinhard
Die Prozedur Brainfuck erwartet den BF-Code in Tabelle4!A1, ggfs. anpassen.
Hier der BF-Code:
>++++++++++[-]++++++[-].>++[-].>+++[-]+++[-]+++[-].>++[-].>++++[-]++++[-]>++++++++++[-]>++++++++++[-]>++++++++++[-]>+++++++++++[-],.++>,.>,.>,.---->,.>>>++++++++[-]>++++++++++[-]>+++++++++++[-]>+++++++++++[-]>+++++++++++[-]>++++++++++[-]>++++++[-]+>>++++++++[-]>++++++++++[-]>+++++++++++[-]>+++++++++++[-]>+++++++++++[-]>++++++++++[-]>++++++++++[-]>+++++++++++[-]>++++++[-]>>>>-]>>>>>>>>>+>>>>>-[>>>>-]>>>>>>>>+>>>>>++[>>>>-]>>>>>>>+>>>>>[>>>>-]>>>>>>+>>>>>+++++[>>>>-]>>>>>+>>>>>[>.>.>.>.>.>.>.>->>>>>>>[>.>.>.>.>.>.>.>.>.

Option Explicit
Public P() As String, Anz As Long, Einr As Byte
Sub Brainfuck()
Dim strOok As String, N As Long, Zei As Long, wks As Worksheet
ReDim P(3)
Set wks = Worksheets("Tabelle4")         'Anpassen
P(0) = "Sub Brainfuck()"
P(1) = "Dim Ausgabe As String"
P(2) = "Worksheets.Add"
P(3) = "Cells(1, Columns.Count / 2).Select"
Anz = 3
Zei = 8
With wks
.Range("A3:D2000").ClearContents
strOok = .Range("A1")                 'Anpassen
For N = 1 To Len(strOok)
Call Check2(Mid(strOok, N, 1))
Next N
For N = 1 To Len(strOok)
.Cells(Zei, 2) = Mid(strOok, N, 1)
While Mid(strOok, N, 1) = Mid(strOok, N + 1, 1) And Mid(strOok, N, 1)  "]"
.Cells(Zei, 2) = .Cells(Zei, 2) & Mid(strOok, N, 1)
N = N + 1
Wend
Zei = Zei + 1
Next N
Anz = Anz + 2
ReDim Preserve P(Anz)
P(Anz - 1) = "Msgbox Ausgabe"
P(Anz) = "End Sub"
For N = 0 To Anz
.Cells(N + 4, 1) = P(N)
Next N
End With
End Sub
Sub Check2(ByVal Zeichen As String)
Dim Z As Integer
Const strPlus As String = "ActiveCell.Value = ActiveCell.Value + "
Const strMinus As String = "ActiveCell.Value = ActiveCell.Value - "
Const strRechts As String = "ActiveCell.Offset(0, "
Const strLinks As String = "ActiveCell.Offset(0, -"
Select Case Zeichen
Case "+" 'den Wert der aktuellen Zelle um 1 erhöhen
If InStr(P(Anz), strPlus) > 0 Then
P(Anz) = String(Einr, " ") & strPlus & CInt(Mid(P(Anz), Len(strPlus) + 1)) + 1
Else
Anz = Anz + 1
ReDim Preserve P(Anz)
P(Anz) = String(Einr, " ") & strPlus & 1
End If
Case "-" 'den Wert der aktuellen Zelle um 1 verringern
If InStr(P(Anz), strMinus) > 0 Then
P(Anz) = String(Einr, " ") & strMinus & CInt(Mid(P(Anz), Len(strMinus) + 1)) + 1
Else
Anz = Anz + 1
ReDim Preserve P(Anz)
P(Anz) = String(Einr, " ") & "ActiveCell.Value = ActiveCell.Value - 1"
End If
Case ">" 'eine Zelle nach rechts gehen
If InStr(P(Anz), strRechts) > 0 And InStr(P(Anz), strLinks) = 0 Then
Z = CInt(Replace(Replace(P(Anz), String(Einr, " ") & strRechts, ""), ").Select", "")) + _
1
P(Anz) = String(Einr, " ") & strRechts & Z & ").Select"
Else
Anz = Anz + 1
ReDim Preserve P(Anz)
P(Anz) = String(Einr, " ") & "ActiveCell.Offset(0, 1).Select"
End If
Case " 0 Then
Z = CInt(Replace(Replace(P(Anz), String(Einr, " ") & strLinks, ""), ").Select", "")) +  _
1
P(Anz) = String(Einr, " ") & strLinks & Z & ").Select"
Else
Anz = Anz + 1
ReDim Preserve P(Anz)
P(Anz) = String(Einr, " ") & "ActiveCell.Offset(0, -1).Select"
End If
Case "[" 'Schleifenanfang - die Schleife durchlaufen solange der Wert der aktuellen Zelle  _
ungleich 0 ist
Anz = Anz + 1
ReDim Preserve P(Anz)
P(Anz) = String(Einr, " ") & "While Activecell  0"
Einr = Einr + 3
Case "]" 'Schleifenende - beendet die Schleife, wenn der Wert der aktuellen Zelle gleich 0  _
ist
Einr = Einr - 3
Anz = Anz + 1
ReDim Preserve P(Anz)
P(Anz) = String(Einr, " ") & "Wend"
Case "."  'den Wert der aktuellen Zelle ausdrucken
Anz = Anz + 1
ReDim Preserve P(Anz)
P(Anz) = String(Einr, " ") & "Ausgabe = Ausgabe & ActiveCell.value"
Case "," 'einen Wert von der Tastatur in die aktuelle Zelle einlesen
Anz = Anz + 1
ReDim Preserve P(Anz)
P(Anz) = String(Einr, " ") & "Activecell.Value = Asc(Inputbox(""Ein Zeichen eingeben""))"
Case Else
MsgBox "Fehler bei Zeichen " & Zeichen
End Select
End Sub


Anzeige
AW: Brainfuck Code umsetzen
26.12.2008 22:09:22
ChristophM
Hallo Reinhard,
Mein Ansatz wäre, den BF Code mittels VBA zu verarbeiten und das entsprechende Ergebnis auszugeben (also gleiche Funktion wie der Interpreter auf der von dir genannten Web-Seite http://koti.mbnet.fi/villes/php/bf.php ). Die "Debug-Funktion" von dieser Seite könnte man ebenfalls einbauen ...
Dabei würde ich keine Excel-Zellen sondern ein Array füllen und die einzelnen Array-Werte rauf- und runtersetzen, genau wir der BF Code das veranstaltet. Das ist nicht allzu schwierig und am Ende purzelt ein Ergebnis raus.
Warum aber willst du mittels VBA neuen VBA-Code schreiben, der das selbe macht wie der BF Code - das ist mir nicht klar bei der Geschichte.
Gruß
Christoph
Anzeige
AW: Brainfuck Code umsetzen
26.12.2008 23:10:00
ChristophM
Hallo Reinhard,
hier ein Ansatz

Option Explicit
Sub bf()
Dim i&, j&, k&
Dim sSrc$, sIn$, sOut$
Dim a() As Long         'bf array
Dim lp() As Long        'loop level
Dim ptr As Long         'pointer
sSrc = Sheets("Tabelle4").Cells(1, 1).Value
sIn = "***"
ReDim a(ptr)
For i = 1 To Len(sSrc)
Select Case Mid(sSrc, i, 1)
Case ">": ptr = ptr + 1: If UBound(a)  0 Then
ReDim Preserve lp(k)
lp(k) = i
k = k + 1
Else
i = InStr(i, sSrc, "]", 0) + 1
End If
Case "]":
If a(ptr) > 0 Then
i = lp(k - 1)
Else
k = k - 1
ReDim Preserve lp(k)
End If
Case ",": j = j + 1: If j  0 Then sOut = sOut & Chr(a(ptr))
End Select
Next
MsgBox sOut
End Sub

Rückmeldung wäre nett.
Gruß
Christoph

Anzeige
AW: Brainfuck Code umsetzen
27.12.2008 00:29:00
Reinhard
Hallo Christoph,
tja nun, zu diesem BF-Rätsel kam ich wie Maria zu Jesus :-)
Vor wenigen Tagen wußte ich gar nicht daß es BF gibt. Dann stiess ich im Internet auf eine Anfrage diesbezülich, also was man denn bei Aufruf dieses BF-Codes, der wohl sowas wie eine Passwortabfrage darstellen soll eingeben muß um als Ausgabe "Correct" und nicht "Wrong" zu erhalten.
Das hat mich interessiert. Jetzt habe ich, abgesehen von der ergoogelten Seite keinen BF-Interpreter, könnte also mit BF-Code rein garnix anfangen.
Da habe ich mir gedacht ich wandle den BF-Code um in einen Vba-Code.
Das ist mir jetzt gelungen, wenn auch de erzeugte Vba-Code falsch sein kann, weil mir das mit Lesen der Standardeingebe und Ausgeben auf der Standardausgabe noch nicht 100%ig klar ist.
Ich weiß schon was stdin und stdout sind, aber jetzt für Vba, nehme ich beim Input Asc(Eingabe) und bei der Ausgabe chr(Eingabe) [fehlt noch im Code] u.ä., da hänge ich noch fest, vielleicht mache ich da einen Fehler.
Deinen Code habe ich gesehen, danke, aber das teste ich erst morgen, upps, heute *auf die Uhr schau*
Ich stelle die Frage auf noch offen da ich bei Überflug über deinen Code nichts gesehen habe wegen Correct und Wrong.
Gruß
Reinhard
Anzeige
AW: Brainfuck Code umsetzen
27.12.2008 01:52:00
ChristophM
Vor deinem Beitrag wußte ich auch nichts von BF (esoterische Programmierung ist mir auch mindestens ein 'esoterisch' zuviel...)
Was bei Neuem reizt ist natürlich, wie das funktioniert. Daher habe ich mich mit dieser Aufgabe beschäftigt.
Ja, du hast recht, der BF Code prüft die Eingabe und gibt "Correct!" bzw. "Wrong!" zurück, wie du nach Ausführung meines Scripts leicht siehst. Das Script gibt aber nicht das gesuchte Passwort aus.
Die spannende Frage ist: Wo findet bei BF der Vergleich zwischen der Eingabe und einem im Code hinterlegten "String" statt. Dies ist in meinem Script umgesetzt. Das hinterlegte Passwort blieb mir bei der Entwicklung des VBA Codes ergo nicht verborgen, aber du wirst sicher verstehen, dass ich dieses hier nicht nennen kann.
mit Asc() bzw. chr() liegst du schon richtig - hab ich in meinem Code auch so verwendet.
Gib mir Bescheid, wie du damit zurecht kommst.
Gruß
Christoph
PS: der VBA Code ist ein erster Ansatz, funktioniert aber ebenso mit BF Code wie zB:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Anzeige
AW: Brainfuck Code umsetzen
30.12.2008 17:28:00
Reinhard
Hallo Christoph,
wie üblich bei mir kam dies das dazwischen und ich habe noch nichtmal deinen Code getestet.
Kommt aber garantiert noch.
Weil ich da unsicher bin, warum willst du mir das Passwort nicht nennen?
Wenn es einzig darum geht das im BF-Code versteckte Passwort zu ermitteln, daß ansonsten keinerlei Wert hat, so kannst du es doch locker hier posten.
Schreib im Betreff Lösung oder auch Spoiler wie in Rätselforen üblich, dann weiß ich daß da das passwort steht.
Dann steht es mir frei diesen Beitrag zu lesen oder aber nochmal zig Stunden in diese Rätselaufgabe zu stecken und wenn ich rumrätsele will ich niemals die Lösung vorher wissen.
In dem Moment ist doch mein Knobelspass sofort vorbei.
Ich kann das zwar nicht glauben aber deine Formulierung wegen der Passwortnichtnennung klingt so als wenn man mit diesem BF-Code quasi ein Passwort eines Rechners auf dem er läuft cracken kann.
Ich sah schon daß da im Code etwas von Username: verborgen ist.
Selbst was das so wäre, dafür müßtest du aber noch Überzeugungsarbeit leisten :-), was könnte ich mit diesem bösen Code dann machen?
Damit er wirken kann müßte ihn ja jmd. mit einem BF-Interpreter (außer uns beiden hat da sicher keiner hier im Forum sowas *gg*) starten. Dann gibt er was ein und kriegt Correct oder Wrong zu sehen.
Na und. ist doch nix schlimmes.
Gruß
Reinhard
Anzeige

311 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige